diff --git a/.github/ISSUE_TEMPLATE/http_multi_server.md b/.github/ISSUE_TEMPLATE/http_multi_server.md
new file mode 100644
index 0000000..10d75c5
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/http_multi_server.md
@@ -0,0 +1,5 @@
+---
+name: "package:http_multi_server"
+about: "Create a bug or file a feature request against package:http_multi_server."
+labels: "package:http_multi_server"
+---
\ No newline at end of file
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 36a48e9..1bfe963 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -2,32 +2,40 @@
 
 'type-infra':
   - changed-files:
-      - any-glob-to-any-file: '.github/**'
+    - any-glob-to-any-file: '.github/**'
 
 'package:cronet_http':
   - changed-files:
-      - any-glob-to-any-file: 'pkgs/cronet_http/**'
+    - any-glob-to-any-file: 'pkgs/cronet_http/**'
 
 'package:cupertino_http':
   - changed-files:
-      - any-glob-to-any-file: 'pkgs/cupertino_http/**'
+    - any-glob-to-any-file: 'pkgs/cupertino_http/**'
 
 'package:http':
   - changed-files:
-      - any-glob-to-any-file: 'pkgs/http/**'
+    - any-glob-to-any-file: 'pkgs/http/**'
 
 'package:http2':
   - changed-files:
-      - any-glob-to-any-file: 'pkgs/http2/**'
-
-'package:http_parser':
-  - changed-files:
-      - any-glob-to-any-file: 'pkgs/http_parser/**'
+    - any-glob-to-any-file: 'pkgs/http2/**'
 
 'package:http_client_conformance_tests':
   - changed-files:
-      - any-glob-to-any-file: 'pkgs/http_client_conformance_tests/**'
+    - any-glob-to-any-file: 'pkgs/http_client_conformance_tests/**'
+
+'package:http_multi_server':
+  - changed-files:
+    - any-glob-to-any-file: 'pkgs/http_multi_server/**'
+
+'package:http_parser':
+  - changed-files:
+    - any-glob-to-any-file: 'pkgs/http_parser/**'
 
 'package:web_socket_channel':
   - changed-files:
-      - any-glob-to-any-file: 'pkgs/web_socket_channel/**'
+    - any-glob-to-any-file: 'pkgs/web_socket_channel/**'
+
+'package:web_socket_conformance_tests':
+  - changed-files:
+    - any-glob-to-any-file: 'pkgs/http_client_conformance_tests/**'
diff --git a/.github/workflows/http_multi_server.yaml b/.github/workflows/http_multi_server.yaml
new file mode 100644
index 0000000..71f6062
--- /dev/null
+++ b/.github/workflows/http_multi_server.yaml
@@ -0,0 +1,70 @@
+name: package:http_multi_server
+
+on:
+  push:
+    branches:
+      - master
+    paths:
+      - '.github/workflows/http_multi_server.yaml'
+      - 'pkgs/http_multi_server/**'
+  pull_request:
+    paths:
+      - '.github/workflows/http_multi_server.yaml'
+      - 'pkgs/http_multi_server/**'
+  schedule:
+    - cron: "0 0 * * 0"
+
+defaults:  
+  run:  
+    working-directory: pkgs/http_multi_server/
+
+env:
+  PUB_ENVIRONMENT: bot.github
+
+jobs:
+  # Check code formatting and static analysis on a single OS (linux)
+  # against Dart dev.
+  analyze:
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        sdk: [dev]
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
+      - uses: dart-lang/setup-dart@e630b99d28a3b71860378cafdc2a067c71107f94
+        with:
+          sdk: ${{ matrix.sdk }}
+      - id: install
+        name: Install dependencies
+        run: dart pub get
+      - name: Check formatting
+        run: dart format --output=none --set-exit-if-changed .
+        if: always() && steps.install.outcome == 'success'
+      - name: Analyze code
+        run: dart analyze --fatal-infos
+        if: always() && steps.install.outcome == 'success'
+
+  # Run tests on a matrix consisting of two dimensions:
+  # 1. OS: ubuntu-latest, (macos-latest, windows-latest)
+  # 2. release channel: dev
+  test:
+    needs: analyze
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        # Add macos-latest and/or windows-latest if relevant for this package.
+        os: [ubuntu-latest]
+        sdk: [3.2, dev]
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
+      - uses: dart-lang/setup-dart@e630b99d28a3b71860378cafdc2a067c71107f94
+        with:
+          sdk: ${{ matrix.sdk }}
+      - id: install
+        name: Install dependencies
+        run: dart pub get
+      - name: Run VM tests
+        run: dart test --platform vm
+        if: always() && steps.install.outcome == 'success'
diff --git a/README.md b/README.md
index 912afe2..78127a7 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@
 | [http](pkgs/http/) | A composable, multi-platform, Future-based API for HTTP requests. | [![pub package](https://img.shields.io/pub/v/http.svg)](https://pub.dev/packages/http) |
 | [http2](pkgs/http2/) | A HTTP/2 implementation in Dart. | [![pub package](https://img.shields.io/pub/v/http2.svg)](https://pub.dev/packages/http2) |
 | [http_client_conformance_tests](pkgs/http_client_conformance_tests/) | A library that tests whether implementations of package:http's `Client` class behave as expected. | |
+| [http_multi_server](pkgs/http_multi_server/) | A `dart:io` `HttpServer` wrapper that handles requests from multiple servers. | [![pub package](https://img.shields.io/pub/v/http_multi_server.svg)](https://pub.dev/packages/http_multi_server) |
 | [http_parser](pkgs/http_parser/) | A platform-independent package for parsing and serializing HTTP formats. | [![pub package](https://img.shields.io/pub/v/http_parser.svg)](https://pub.dev/packages/http_parser) |
 | [http_profile](pkgs/http_profile/) | A library used by HTTP client authors to integrate with the DevTools Network View. | [![pub package](https://img.shields.io/pub/v/http_profile.svg)](https://pub.dev/packages/http_profile) |
 | [ok_http](pkgs/ok_http/) | An Android Flutter plugin that provides access to the [OkHttp](https://square.github.io/okhttp/) HTTP client and the OkHttp [WebSocket](https://square.github.io/okhttp/5.x/okhttp/okhttp3/-web-socket/index.html) API. | [![pub package](https://img.shields.io/pub/v/ok_http.svg)](https://pub.dev/packages/ok_http) |
diff --git a/pkgs/cupertino_http/CHANGELOG.md b/pkgs/cupertino_http/CHANGELOG.md
index 0878800..7d7c1db 100644
--- a/pkgs/cupertino_http/CHANGELOG.md
+++ b/pkgs/cupertino_http/CHANGELOG.md
@@ -1,6 +1,14 @@
-## 2.0.2-wip
+## 2.0.3-wip
 
-* Upgrade to `package:objective_c` 4.0.
+* Remove some unnecessary native code.
+
+## 2.0.2
+
+* Upgrade to `package:objective_c` 4.1.
+* Upgrade to `package:ffigen` 16.1.
+* Fixes a bug where responses were not processed correctly:
+  * [#1413](https://github.com/dart-lang/http/issues/1413)
+  * [#1446](https://github.com/dart-lang/http/issues/1446)
 
 ## 2.0.1
 
diff --git a/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/native_cupertino_bindings.m b/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/native_cupertino_bindings.m
index 3bc6c93..d978b73 100644
--- a/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/native_cupertino_bindings.m
+++ b/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/native_cupertino_bindings.m
@@ -1,4 +1,5 @@
 #include <stdint.h>
+#import <Foundation/Foundation.h>
 #import <Foundation/NSURLCache.h>
 #import <Foundation/NSURLRequest.h>
 #import <Foundation/NSURLSession.h>
@@ -10,16 +11,15 @@
 #import <Foundation/NSOperation.h>
 #import <Foundation/NSError.h>
 #import <Foundation/NSDictionary.h>
-#import "utils.h"
 
 #if !__has_feature(objc_arc)
 #error "This file must be compiled with ARC enabled"
 #endif
 
-id objc_retain(id);
 id objc_retainBlock(id);
 
 typedef void  (^_ListenerTrampoline)();
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline _NativeCupertinoHttp_wrapListenerBlock_1pl9qdv(_ListenerTrampoline block) NS_RETURNS_RETAINED {
   return ^void() {
     objc_retainBlock(block);
@@ -27,31 +27,111 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline)(void * waiter);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline _NativeCupertinoHttp_wrapBlockingBlock_1pl9qdv(
+    _BlockingTrampoline block, _BlockingTrampoline listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void() {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline1)(id arg0);
-_ListenerTrampoline1 _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(_ListenerTrampoline1 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline1 _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(_ListenerTrampoline1 block) NS_RETURNS_RETAINED {
   return ^void(id arg0) {
     objc_retainBlock(block);
-    block(objc_retain(arg0));
+    block((__bridge id)(__bridge_retained void*)(arg0));
+  };
+}
+
+typedef void  (^_BlockingTrampoline1)(void * waiter, id arg0);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline1 _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7(
+    _BlockingTrampoline1 block, _BlockingTrampoline1 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline2)(void * arg0, id arg1);
-_ListenerTrampoline2 _NativeCupertinoHttp_wrapListenerBlock_wjovn7(_ListenerTrampoline2 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline2 _NativeCupertinoHttp_wrapListenerBlock_18v1jvf(_ListenerTrampoline2 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1));
+  };
+}
+
+typedef void  (^_BlockingTrampoline2)(void * waiter, void * arg0, id arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline2 _NativeCupertinoHttp_wrapBlockingBlock_18v1jvf(
+    _BlockingTrampoline2 block, _BlockingTrampoline2 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline3)(id arg0, id arg1, BOOL * arg2);
-_ListenerTrampoline3 _NativeCupertinoHttp_wrapListenerBlock_1krhfwz(_ListenerTrampoline3 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline3 _NativeCupertinoHttp_wrapListenerBlock_1o83rbn(_ListenerTrampoline3 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, id arg1, BOOL * arg2) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), objc_retain(arg1), arg2);
+    block((__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), arg2);
+  };
+}
+
+typedef void  (^_BlockingTrampoline3)(void * waiter, id arg0, id arg1, BOOL * arg2);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline3 _NativeCupertinoHttp_wrapBlockingBlock_1o83rbn(
+    _BlockingTrampoline3 block, _BlockingTrampoline3 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, id arg1, BOOL * arg2) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), arg2);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), arg2);
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline4)(struct __CFRunLoopObserver * arg0, CFRunLoopActivity arg1);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline4 _NativeCupertinoHttp_wrapListenerBlock_tg5tbv(_ListenerTrampoline4 block) NS_RETURNS_RETAINED {
   return ^void(struct __CFRunLoopObserver * arg0, CFRunLoopActivity arg1) {
     objc_retainBlock(block);
@@ -59,7 +139,27 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline4)(void * waiter, struct __CFRunLoopObserver * arg0, CFRunLoopActivity arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline4 _NativeCupertinoHttp_wrapBlockingBlock_tg5tbv(
+    _BlockingTrampoline4 block, _BlockingTrampoline4 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(struct __CFRunLoopObserver * arg0, CFRunLoopActivity arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, arg1);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, arg1);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline5)(struct __CFRunLoopTimer * arg0);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline5 _NativeCupertinoHttp_wrapListenerBlock_1dqvvol(_ListenerTrampoline5 block) NS_RETURNS_RETAINED {
   return ^void(struct __CFRunLoopTimer * arg0) {
     objc_retainBlock(block);
@@ -67,7 +167,27 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline5)(void * waiter, struct __CFRunLoopTimer * arg0);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline5 _NativeCupertinoHttp_wrapBlockingBlock_1dqvvol(
+    _BlockingTrampoline5 block, _BlockingTrampoline5 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(struct __CFRunLoopTimer * arg0) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline6)(size_t arg0);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline6 _NativeCupertinoHttp_wrapListenerBlock_6enxqz(_ListenerTrampoline6 block) NS_RETURNS_RETAINED {
   return ^void(size_t arg0) {
     objc_retainBlock(block);
@@ -75,15 +195,55 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline6)(void * waiter, size_t arg0);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline6 _NativeCupertinoHttp_wrapBlockingBlock_6enxqz(
+    _BlockingTrampoline6 block, _BlockingTrampoline6 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(size_t arg0) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline7)(id arg0, int arg1);
-_ListenerTrampoline7 _NativeCupertinoHttp_wrapListenerBlock_qxvyq2(_ListenerTrampoline7 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline7 _NativeCupertinoHttp_wrapListenerBlock_18kzm6a(_ListenerTrampoline7 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, int arg1) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), arg1);
+    block((__bridge id)(__bridge_retained void*)(arg0), arg1);
+  };
+}
+
+typedef void  (^_BlockingTrampoline7)(void * waiter, id arg0, int arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline7 _NativeCupertinoHttp_wrapBlockingBlock_18kzm6a(
+    _BlockingTrampoline7 block, _BlockingTrampoline7 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, int arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), arg1);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), arg1);
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline8)(int arg0);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline8 _NativeCupertinoHttp_wrapListenerBlock_9o8504(_ListenerTrampoline8 block) NS_RETURNS_RETAINED {
   return ^void(int arg0) {
     objc_retainBlock(block);
@@ -91,15 +251,55 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline8)(void * waiter, int arg0);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline8 _NativeCupertinoHttp_wrapBlockingBlock_9o8504(
+    _BlockingTrampoline8 block, _BlockingTrampoline8 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(int arg0) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline9)(BOOL arg0, id arg1, int arg2);
-_ListenerTrampoline9 _NativeCupertinoHttp_wrapListenerBlock_12a4qua(_ListenerTrampoline9 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline9 _NativeCupertinoHttp_wrapListenerBlock_og5b6y(_ListenerTrampoline9 block) NS_RETURNS_RETAINED {
   return ^void(BOOL arg0, id arg1, int arg2) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), arg2);
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), arg2);
+  };
+}
+
+typedef void  (^_BlockingTrampoline9)(void * waiter, BOOL arg0, id arg1, int arg2);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline9 _NativeCupertinoHttp_wrapBlockingBlock_og5b6y(
+    _BlockingTrampoline9 block, _BlockingTrampoline9 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(BOOL arg0, id arg1, int arg2) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), arg2);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), arg2);
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline10)(struct __SecTrust * arg0, SecTrustResultType arg1);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline10 _NativeCupertinoHttp_wrapListenerBlock_gwxhxt(_ListenerTrampoline10 block) NS_RETURNS_RETAINED {
   return ^void(struct __SecTrust * arg0, SecTrustResultType arg1) {
     objc_retainBlock(block);
@@ -107,7 +307,27 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline10)(void * waiter, struct __SecTrust * arg0, SecTrustResultType arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline10 _NativeCupertinoHttp_wrapBlockingBlock_gwxhxt(
+    _BlockingTrampoline10 block, _BlockingTrampoline10 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(struct __SecTrust * arg0, SecTrustResultType arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, arg1);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, arg1);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline11)(struct __SecTrust * arg0, BOOL arg1, struct __CFError * arg2);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline11 _NativeCupertinoHttp_wrapListenerBlock_k73ff5(_ListenerTrampoline11 block) NS_RETURNS_RETAINED {
   return ^void(struct __SecTrust * arg0, BOOL arg1, struct __CFError * arg2) {
     objc_retainBlock(block);
@@ -115,7 +335,27 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline11)(void * waiter, struct __SecTrust * arg0, BOOL arg1, struct __CFError * arg2);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline11 _NativeCupertinoHttp_wrapBlockingBlock_k73ff5(
+    _BlockingTrampoline11 block, _BlockingTrampoline11 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(struct __SecTrust * arg0, BOOL arg1, struct __CFError * arg2) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, arg1, arg2);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, arg1, arg2);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline12)(uint16_t arg0);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline12 _NativeCupertinoHttp_wrapListenerBlock_15f11yh(_ListenerTrampoline12 block) NS_RETURNS_RETAINED {
   return ^void(uint16_t arg0) {
     objc_retainBlock(block);
@@ -123,31 +363,111 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline12)(void * waiter, uint16_t arg0);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline12 _NativeCupertinoHttp_wrapBlockingBlock_15f11yh(
+    _BlockingTrampoline12 block, _BlockingTrampoline12 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(uint16_t arg0) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline13)(id arg0, id arg1);
-_ListenerTrampoline13 _NativeCupertinoHttp_wrapListenerBlock_wjvic9(_ListenerTrampoline13 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline13 _NativeCupertinoHttp_wrapListenerBlock_pfv6jd(_ListenerTrampoline13 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, id arg1) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), objc_retain(arg1));
+    block((__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1));
+  };
+}
+
+typedef void  (^_BlockingTrampoline13)(void * waiter, id arg0, id arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline13 _NativeCupertinoHttp_wrapBlockingBlock_pfv6jd(
+    _BlockingTrampoline13 block, _BlockingTrampoline13 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, id arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline14)(id arg0, id arg1, id arg2);
-_ListenerTrampoline14 _NativeCupertinoHttp_wrapListenerBlock_91c9gi(_ListenerTrampoline14 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline14 _NativeCupertinoHttp_wrapListenerBlock_18qun1e(_ListenerTrampoline14 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, id arg1, id arg2) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), objc_retain(arg1), objc_retainBlock(arg2));
+    block((__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), objc_retainBlock(arg2));
+  };
+}
+
+typedef void  (^_BlockingTrampoline14)(void * waiter, id arg0, id arg1, id arg2);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline14 _NativeCupertinoHttp_wrapBlockingBlock_18qun1e(
+    _BlockingTrampoline14 block, _BlockingTrampoline14 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, id arg1, id arg2) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), objc_retainBlock(arg2));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), objc_retainBlock(arg2));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline15)(id arg0, id arg1);
-_ListenerTrampoline15 _NativeCupertinoHttp_wrapListenerBlock_14pxqbs(_ListenerTrampoline15 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline15 _NativeCupertinoHttp_wrapListenerBlock_o762yo(_ListenerTrampoline15 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, id arg1) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), objc_retainBlock(arg1));
+    block((__bridge id)(__bridge_retained void*)(arg0), objc_retainBlock(arg1));
+  };
+}
+
+typedef void  (^_BlockingTrampoline15)(void * waiter, id arg0, id arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline15 _NativeCupertinoHttp_wrapBlockingBlock_o762yo(
+    _BlockingTrampoline15 block, _BlockingTrampoline15 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, id arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), objc_retainBlock(arg1));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), objc_retainBlock(arg1));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline16)(BOOL arg0);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline16 _NativeCupertinoHttp_wrapListenerBlock_1s56lr9(_ListenerTrampoline16 block) NS_RETURNS_RETAINED {
   return ^void(BOOL arg0) {
     objc_retainBlock(block);
@@ -155,15 +475,55 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline16)(void * waiter, BOOL arg0);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline16 _NativeCupertinoHttp_wrapBlockingBlock_1s56lr9(
+    _BlockingTrampoline16 block, _BlockingTrampoline16 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(BOOL arg0) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline17)(id arg0, id arg1, id arg2);
-_ListenerTrampoline17 _NativeCupertinoHttp_wrapListenerBlock_1hcfngn(_ListenerTrampoline17 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline17 _NativeCupertinoHttp_wrapListenerBlock_r8gdi7(_ListenerTrampoline17 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, id arg1, id arg2) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), objc_retain(arg1), objc_retain(arg2));
+    block((__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+  };
+}
+
+typedef void  (^_BlockingTrampoline17)(void * waiter, id arg0, id arg1, id arg2);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline17 _NativeCupertinoHttp_wrapBlockingBlock_r8gdi7(
+    _BlockingTrampoline17 block, _BlockingTrampoline17 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, id arg1, id arg2) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline18)(NSURLSessionResponseDisposition arg0);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline18 _NativeCupertinoHttp_wrapListenerBlock_16sve1d(_ListenerTrampoline18 block) NS_RETURNS_RETAINED {
   return ^void(NSURLSessionResponseDisposition arg0) {
     objc_retainBlock(block);
@@ -171,133 +531,453 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline18)(void * waiter, NSURLSessionResponseDisposition arg0);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline18 _NativeCupertinoHttp_wrapBlockingBlock_16sve1d(
+    _BlockingTrampoline18 block, _BlockingTrampoline18 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(NSURLSessionResponseDisposition arg0) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline19)(void * arg0, id arg1, id arg2, id arg3, id arg4);
-_ListenerTrampoline19 _NativeCupertinoHttp_wrapListenerBlock_1f43wec(_ListenerTrampoline19 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline19 _NativeCupertinoHttp_wrapListenerBlock_xx612k(_ListenerTrampoline19 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2, id arg3, id arg4) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2), objc_retain(arg3), objc_retainBlock(arg4));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3), objc_retainBlock(arg4));
+  };
+}
+
+typedef void  (^_BlockingTrampoline19)(void * waiter, void * arg0, id arg1, id arg2, id arg3, id arg4);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline19 _NativeCupertinoHttp_wrapBlockingBlock_xx612k(
+    _BlockingTrampoline19 block, _BlockingTrampoline19 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2, id arg3, id arg4) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3), objc_retainBlock(arg4));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3), objc_retainBlock(arg4));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline20)(void * arg0, id arg1, id arg2, id arg3);
-_ListenerTrampoline20 _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(_ListenerTrampoline20 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline20 _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(_ListenerTrampoline20 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2, id arg3) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2), objc_retain(arg3));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3));
+  };
+}
+
+typedef void  (^_BlockingTrampoline20)(void * waiter, void * arg0, id arg1, id arg2, id arg3);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline20 _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf(
+    _BlockingTrampoline20 block, _BlockingTrampoline20 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2, id arg3) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline21)(void * arg0, id arg1, id arg2);
-_ListenerTrampoline21 _NativeCupertinoHttp_wrapListenerBlock_ao4xm9(_ListenerTrampoline21 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline21 _NativeCupertinoHttp_wrapListenerBlock_fjrv01(_ListenerTrampoline21 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+  };
+}
+
+typedef void  (^_BlockingTrampoline21)(void * waiter, void * arg0, id arg1, id arg2);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline21 _NativeCupertinoHttp_wrapBlockingBlock_fjrv01(
+    _BlockingTrampoline21 block, _BlockingTrampoline21 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline22)(NSURLSessionDelayedRequestDisposition arg0, id arg1);
-_ListenerTrampoline22 _NativeCupertinoHttp_wrapListenerBlock_mn1xu3(_ListenerTrampoline22 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline22 _NativeCupertinoHttp_wrapListenerBlock_1otpo83(_ListenerTrampoline22 block) NS_RETURNS_RETAINED {
   return ^void(NSURLSessionDelayedRequestDisposition arg0, id arg1) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1));
+  };
+}
+
+typedef void  (^_BlockingTrampoline22)(void * waiter, NSURLSessionDelayedRequestDisposition arg0, id arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline22 _NativeCupertinoHttp_wrapBlockingBlock_1otpo83(
+    _BlockingTrampoline22 block, _BlockingTrampoline22 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(NSURLSessionDelayedRequestDisposition arg0, id arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline23)(void * arg0, id arg1, id arg2, id arg3, id arg4, id arg5);
-_ListenerTrampoline23 _NativeCupertinoHttp_wrapListenerBlock_13vswqm(_ListenerTrampoline23 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline23 _NativeCupertinoHttp_wrapListenerBlock_l2g8ke(_ListenerTrampoline23 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2, id arg3, id arg4, id arg5) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2), objc_retain(arg3), objc_retain(arg4), objc_retainBlock(arg5));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3), (__bridge id)(__bridge_retained void*)(arg4), objc_retainBlock(arg5));
+  };
+}
+
+typedef void  (^_BlockingTrampoline23)(void * waiter, void * arg0, id arg1, id arg2, id arg3, id arg4, id arg5);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline23 _NativeCupertinoHttp_wrapBlockingBlock_l2g8ke(
+    _BlockingTrampoline23 block, _BlockingTrampoline23 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2, id arg3, id arg4, id arg5) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3), (__bridge id)(__bridge_retained void*)(arg4), objc_retainBlock(arg5));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), (__bridge id)(__bridge_retained void*)(arg3), (__bridge id)(__bridge_retained void*)(arg4), objc_retainBlock(arg5));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline24)(NSURLSessionAuthChallengeDisposition arg0, id arg1);
-_ListenerTrampoline24 _NativeCupertinoHttp_wrapListenerBlock_37btrl(_ListenerTrampoline24 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline24 _NativeCupertinoHttp_wrapListenerBlock_n8yd09(_ListenerTrampoline24 block) NS_RETURNS_RETAINED {
   return ^void(NSURLSessionAuthChallengeDisposition arg0, id arg1) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1));
+  };
+}
+
+typedef void  (^_BlockingTrampoline24)(void * waiter, NSURLSessionAuthChallengeDisposition arg0, id arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline24 _NativeCupertinoHttp_wrapBlockingBlock_n8yd09(
+    _BlockingTrampoline24 block, _BlockingTrampoline24 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(NSURLSessionAuthChallengeDisposition arg0, id arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline25)(void * arg0, id arg1, id arg2, id arg3);
-_ListenerTrampoline25 _NativeCupertinoHttp_wrapListenerBlock_12nszru(_ListenerTrampoline25 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline25 _NativeCupertinoHttp_wrapListenerBlock_bklti2(_ListenerTrampoline25 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2, id arg3) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2), objc_retainBlock(arg3));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), objc_retainBlock(arg3));
+  };
+}
+
+typedef void  (^_BlockingTrampoline25)(void * waiter, void * arg0, id arg1, id arg2, id arg3);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline25 _NativeCupertinoHttp_wrapBlockingBlock_bklti2(
+    _BlockingTrampoline25 block, _BlockingTrampoline25 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2, id arg3) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), objc_retainBlock(arg3));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), objc_retainBlock(arg3));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline26)(void * arg0, id arg1, id arg2, int64_t arg3, id arg4);
-_ListenerTrampoline26 _NativeCupertinoHttp_wrapListenerBlock_qm01og(_ListenerTrampoline26 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline26 _NativeCupertinoHttp_wrapListenerBlock_jyim80(_ListenerTrampoline26 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2, int64_t arg3, id arg4) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2), arg3, objc_retainBlock(arg4));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, objc_retainBlock(arg4));
+  };
+}
+
+typedef void  (^_BlockingTrampoline26)(void * waiter, void * arg0, id arg1, id arg2, int64_t arg3, id arg4);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline26 _NativeCupertinoHttp_wrapBlockingBlock_jyim80(
+    _BlockingTrampoline26 block, _BlockingTrampoline26 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2, int64_t arg3, id arg4) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, objc_retainBlock(arg4));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, objc_retainBlock(arg4));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline27)(void * arg0, id arg1, id arg2, int64_t arg3, int64_t arg4, int64_t arg5);
-_ListenerTrampoline27 _NativeCupertinoHttp_wrapListenerBlock_1uuez7b(_ListenerTrampoline27 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline27 _NativeCupertinoHttp_wrapListenerBlock_h68abb(_ListenerTrampoline27 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2, int64_t arg3, int64_t arg4, int64_t arg5) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2), arg3, arg4, arg5);
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, arg4, arg5);
   };
 }
 
-Protocol* _NativeCupertinoHttp_NSURLSessionDataDelegate() { return @protocol(NSURLSessionDataDelegate); }
+typedef void  (^_BlockingTrampoline27)(void * waiter, void * arg0, id arg1, id arg2, int64_t arg3, int64_t arg4, int64_t arg5);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline27 _NativeCupertinoHttp_wrapBlockingBlock_h68abb(
+    _BlockingTrampoline27 block, _BlockingTrampoline27 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2, int64_t arg3, int64_t arg4, int64_t arg5) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, arg4, arg5);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, arg4, arg5);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
+Protocol* _NativeCupertinoHttp_NSURLSessionDataDelegate(void) { return @protocol(NSURLSessionDataDelegate); }
 
 typedef void  (^_ListenerTrampoline28)(void * arg0, id arg1, id arg2, int64_t arg3, int64_t arg4);
-_ListenerTrampoline28 _NativeCupertinoHttp_wrapListenerBlock_9qxjkl(_ListenerTrampoline28 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline28 _NativeCupertinoHttp_wrapListenerBlock_ly2579(_ListenerTrampoline28 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2, int64_t arg3, int64_t arg4) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2), arg3, arg4);
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, arg4);
   };
 }
 
-Protocol* _NativeCupertinoHttp_NSURLSessionDownloadDelegate() { return @protocol(NSURLSessionDownloadDelegate); }
+typedef void  (^_BlockingTrampoline28)(void * waiter, void * arg0, id arg1, id arg2, int64_t arg3, int64_t arg4);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline28 _NativeCupertinoHttp_wrapBlockingBlock_ly2579(
+    _BlockingTrampoline28 block, _BlockingTrampoline28 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2, int64_t arg3, int64_t arg4) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, arg4);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, arg4);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
+Protocol* _NativeCupertinoHttp_NSURLSessionDownloadDelegate(void) { return @protocol(NSURLSessionDownloadDelegate); }
 
 typedef void  (^_ListenerTrampoline29)(void * arg0, id arg1, id arg2, NSURLSessionWebSocketCloseCode arg3, id arg4);
-_ListenerTrampoline29 _NativeCupertinoHttp_wrapListenerBlock_3lo3bb(_ListenerTrampoline29 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline29 _NativeCupertinoHttp_wrapListenerBlock_1lx650f(_ListenerTrampoline29 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, id arg1, id arg2, NSURLSessionWebSocketCloseCode arg3, id arg4) {
     objc_retainBlock(block);
-    block(arg0, objc_retain(arg1), objc_retain(arg2), arg3, objc_retain(arg4));
+    block(arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, (__bridge id)(__bridge_retained void*)(arg4));
   };
 }
 
-Protocol* _NativeCupertinoHttp_NSURLSessionWebSocketDelegate() { return @protocol(NSURLSessionWebSocketDelegate); }
+typedef void  (^_BlockingTrampoline29)(void * waiter, void * arg0, id arg1, id arg2, NSURLSessionWebSocketCloseCode arg3, id arg4);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline29 _NativeCupertinoHttp_wrapBlockingBlock_1lx650f(
+    _BlockingTrampoline29 block, _BlockingTrampoline29 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, id arg1, id arg2, NSURLSessionWebSocketCloseCode arg3, id arg4) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, (__bridge id)(__bridge_retained void*)(arg4));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2), arg3, (__bridge id)(__bridge_retained void*)(arg4));
+      awaitWaiter(waiter);
+    }
+  };
+}
+
+Protocol* _NativeCupertinoHttp_NSURLSessionWebSocketDelegate(void) { return @protocol(NSURLSessionWebSocketDelegate); }
 
 typedef void  (^_ListenerTrampoline30)(id arg0, unsigned long arg1, BOOL * arg2);
-_ListenerTrampoline30 _NativeCupertinoHttp_wrapListenerBlock_16ko9u(_ListenerTrampoline30 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline30 _NativeCupertinoHttp_wrapListenerBlock_1p9ui4q(_ListenerTrampoline30 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, unsigned long arg1, BOOL * arg2) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), arg1, arg2);
+    block((__bridge id)(__bridge_retained void*)(arg0), arg1, arg2);
+  };
+}
+
+typedef void  (^_BlockingTrampoline30)(void * waiter, id arg0, unsigned long arg1, BOOL * arg2);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline30 _NativeCupertinoHttp_wrapBlockingBlock_1p9ui4q(
+    _BlockingTrampoline30 block, _BlockingTrampoline30 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, unsigned long arg1, BOOL * arg2) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), arg1, arg2);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), arg1, arg2);
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline31)(id arg0, id arg1, id arg2);
-_ListenerTrampoline31 _NativeCupertinoHttp_wrapListenerBlock_1j2nt86(_ListenerTrampoline31 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline31 _NativeCupertinoHttp_wrapListenerBlock_1b3bb6a(_ListenerTrampoline31 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, id arg1, id arg2) {
     objc_retainBlock(block);
-    block(objc_retainBlock(arg0), objc_retain(arg1), objc_retain(arg2));
+    block(objc_retainBlock(arg0), (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+  };
+}
+
+typedef void  (^_BlockingTrampoline31)(void * waiter, id arg0, id arg1, id arg2);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline31 _NativeCupertinoHttp_wrapBlockingBlock_1b3bb6a(
+    _BlockingTrampoline31 block, _BlockingTrampoline31 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, id arg1, id arg2) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, objc_retainBlock(arg0), (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, objc_retainBlock(arg0), (__bridge id)(__bridge_retained void*)(arg1), (__bridge id)(__bridge_retained void*)(arg2));
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline32)(id arg0, struct _NSRange arg1, struct _NSRange arg2, BOOL * arg3);
-_ListenerTrampoline32 _NativeCupertinoHttp_wrapListenerBlock_8wbg7l(_ListenerTrampoline32 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline32 _NativeCupertinoHttp_wrapListenerBlock_lmc3p5(_ListenerTrampoline32 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, struct _NSRange arg1, struct _NSRange arg2, BOOL * arg3) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), arg1, arg2, arg3);
+    block((__bridge id)(__bridge_retained void*)(arg0), arg1, arg2, arg3);
+  };
+}
+
+typedef void  (^_BlockingTrampoline32)(void * waiter, id arg0, struct _NSRange arg1, struct _NSRange arg2, BOOL * arg3);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline32 _NativeCupertinoHttp_wrapBlockingBlock_lmc3p5(
+    _BlockingTrampoline32 block, _BlockingTrampoline32 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, struct _NSRange arg1, struct _NSRange arg2, BOOL * arg3) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), arg1, arg2, arg3);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), arg1, arg2, arg3);
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline33)(id arg0, BOOL * arg1);
-_ListenerTrampoline33 _NativeCupertinoHttp_wrapListenerBlock_148br51(_ListenerTrampoline33 block) NS_RETURNS_RETAINED {
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline33 _NativeCupertinoHttp_wrapListenerBlock_t8l8el(_ListenerTrampoline33 block) NS_RETURNS_RETAINED {
   return ^void(id arg0, BOOL * arg1) {
     objc_retainBlock(block);
-    block(objc_retain(arg0), arg1);
+    block((__bridge id)(__bridge_retained void*)(arg0), arg1);
+  };
+}
+
+typedef void  (^_BlockingTrampoline33)(void * waiter, id arg0, BOOL * arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline33 _NativeCupertinoHttp_wrapBlockingBlock_t8l8el(
+    _BlockingTrampoline33 block, _BlockingTrampoline33 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(id arg0, BOOL * arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, (__bridge id)(__bridge_retained void*)(arg0), arg1);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, (__bridge id)(__bridge_retained void*)(arg0), arg1);
+      awaitWaiter(waiter);
+    }
   };
 }
 
 typedef void  (^_ListenerTrampoline34)(unsigned short * arg0, unsigned long arg1);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline34 _NativeCupertinoHttp_wrapListenerBlock_vhbh5h(_ListenerTrampoline34 block) NS_RETURNS_RETAINED {
   return ^void(unsigned short * arg0, unsigned long arg1) {
     objc_retainBlock(block);
@@ -305,7 +985,27 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline34)(void * waiter, unsigned short * arg0, unsigned long arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline34 _NativeCupertinoHttp_wrapBlockingBlock_vhbh5h(
+    _BlockingTrampoline34 block, _BlockingTrampoline34 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(unsigned short * arg0, unsigned long arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, arg1);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, arg1);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline35)(void * arg0, unsigned long arg1);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline35 _NativeCupertinoHttp_wrapListenerBlock_zuf90e(_ListenerTrampoline35 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0, unsigned long arg1) {
     objc_retainBlock(block);
@@ -313,7 +1013,27 @@
   };
 }
 
+typedef void  (^_BlockingTrampoline35)(void * waiter, void * arg0, unsigned long arg1);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline35 _NativeCupertinoHttp_wrapBlockingBlock_zuf90e(
+    _BlockingTrampoline35 block, _BlockingTrampoline35 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0, unsigned long arg1) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0, arg1);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0, arg1);
+      awaitWaiter(waiter);
+    }
+  };
+}
+
 typedef void  (^_ListenerTrampoline36)(void * arg0);
+__attribute__((visibility("default"))) __attribute__((used))
 _ListenerTrampoline36 _NativeCupertinoHttp_wrapListenerBlock_ovsamd(_ListenerTrampoline36 block) NS_RETURNS_RETAINED {
   return ^void(void * arg0) {
     objc_retainBlock(block);
@@ -321,10 +1041,21 @@
   };
 }
 
-typedef void  (^_ListenerTrampoline37)(id arg0, id arg1, id arg2, id arg3);
-_ListenerTrampoline37 _NativeCupertinoHttp_wrapListenerBlock_4ya7yd(_ListenerTrampoline37 block) NS_RETURNS_RETAINED {
-  return ^void(id arg0, id arg1, id arg2, id arg3) {
-    objc_retainBlock(block);
-    block(objc_retain(arg0), objc_retain(arg1), objc_retain(arg2), objc_retain(arg3));
+typedef void  (^_BlockingTrampoline36)(void * waiter, void * arg0);
+__attribute__((visibility("default"))) __attribute__((used))
+_ListenerTrampoline36 _NativeCupertinoHttp_wrapBlockingBlock_ovsamd(
+    _BlockingTrampoline36 block, _BlockingTrampoline36 listenerBlock,
+    void* (*newWaiter)(), void (*awaitWaiter)(void*)) NS_RETURNS_RETAINED {
+  NSThread *targetThread = [NSThread currentThread];
+  return ^void(void * arg0) {
+    if ([NSThread currentThread] == targetThread) {
+      objc_retainBlock(block);
+      block(nil, arg0);
+    } else {
+      void* waiter = newWaiter();
+      objc_retainBlock(listenerBlock);
+      listenerBlock(waiter, arg0);
+      awaitWaiter(waiter);
+    }
   };
 }
diff --git a/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/utils.h b/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/utils.h
deleted file mode 100644
index 490b1d7..0000000
--- a/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/utils.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#import <Foundation/NSLock.h>
-#import <Foundation/NSURL.h>
-#import <Foundation/NSURLSession.h>
-#include <stdint.h>
-
-#if !__has_feature(objc_arc)
-#error "This file must be compiled with ARC enabled"
-#endif
-
-typedef void (^_DidFinish)(void *closure, NSURLSession *session,
-                           NSURLSessionDownloadTask *downloadTask,
-                           NSURL *location);
-typedef void (^_DidFinishWithLock)(NSCondition *lock, NSURLSession *session,
-                                   NSURLSessionDownloadTask *downloadTask,
-                                   NSURL *location);
-/// Create a block useable as a
-/// `URLSession:downloadTask:didFinishDownloadingToURL:` that can be used to
-/// make an async Dart callback behave synchronously.
-_DidFinish adaptFinishWithLock(_DidFinishWithLock block);
diff --git a/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/utils.m b/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/utils.m
deleted file mode 100644
index bad263c..0000000
--- a/pkgs/cupertino_http/darwin/cupertino_http/Sources/cupertino_http/utils.m
+++ /dev/null
@@ -1,12 +0,0 @@
-#import "utils.h"
-
-_DidFinish adaptFinishWithLock(_DidFinishWithLock block) {
-  return ^void(void *closure, NSURLSession *session,
-               NSURLSessionDownloadTask *downloadTask, NSURL *location) {
-    NSCondition *lock = [[NSCondition alloc] init];
-    [lock lock];
-    block(lock, session, downloadTask, location);
-    [lock lock];
-    [lock unlock];
-  };
-}
diff --git a/pkgs/cupertino_http/example/integration_test/client_conformance_test.dart b/pkgs/cupertino_http/example/integration_test/client_conformance_test.dart
index 7c936da..dc76d21 100644
--- a/pkgs/cupertino_http/example/integration_test/client_conformance_test.dart
+++ b/pkgs/cupertino_http/example/integration_test/client_conformance_test.dart
@@ -20,6 +20,7 @@
           CupertinoClient.defaultSessionConfiguration,
           canReceiveSetCookieHeaders: true,
           canSendCookieHeaders: true,
+          correctlyHandlesNullHeaderValues: false,
         );
       } finally {
         HttpClientRequestProfile.profilingEnabled = profile;
@@ -33,6 +34,7 @@
           CupertinoClient.defaultSessionConfiguration,
           canReceiveSetCookieHeaders: true,
           canSendCookieHeaders: true,
+          correctlyHandlesNullHeaderValues: false,
         );
       } finally {
         HttpClientRequestProfile.profilingEnabled = profile;
@@ -46,6 +48,7 @@
       canWorkInIsolates: false,
       canReceiveSetCookieHeaders: true,
       canSendCookieHeaders: true,
+      correctlyHandlesNullHeaderValues: false,
     );
   });
 }
diff --git a/pkgs/cupertino_http/ffigen.yaml b/pkgs/cupertino_http/ffigen.yaml
index a67084a..3f01474 100644
--- a/pkgs/cupertino_http/ffigen.yaml
+++ b/pkgs/cupertino_http/ffigen.yaml
@@ -21,7 +21,6 @@
     - '/System/Volumes/Data/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSOperation.h'
     - '/System/Volumes/Data/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSError.h'
     - '/System/Volumes/Data/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSDictionary.h'
-    - 'darwin/cupertino_http/Sources/cupertino_http/utils.h'
 preamble: |
   // ignore_for_file: always_specify_types
   // ignore_for_file: camel_case_types
diff --git a/pkgs/cupertino_http/lib/src/cupertino_api.dart b/pkgs/cupertino_http/lib/src/cupertino_api.dart
index a87fa9c..2fced66 100644
--- a/pkgs/cupertino_http/lib/src/cupertino_api.dart
+++ b/pkgs/cupertino_http/lib/src/cupertino_api.dart
@@ -919,29 +919,15 @@
     }
 
     if (onFinishedDownloading != null) {
-      final asyncFinishDownloading =
-          // ignore: lines_longer_than_80_chars
-          ncb.ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL
-              .listener((nsCondition, nsSession, nsTask, nsUrl) {
-        try {
-          onFinishedDownloading(
-              URLSession._(nsSession,
-                  isBackground: isBackground, hasDelegate: true),
-              URLSessionDownloadTask._(nsTask),
-              nsurlToUri(nsUrl));
-        } finally {
-          nsCondition.unlock();
-        }
+      ncb.NSURLSessionDownloadDelegate
+          .URLSession_downloadTask_didFinishDownloadingToURL_
+          .implementAsBlocking(protoBuilder, (nsSession, nsTask, nsUrl) {
+        onFinishedDownloading(
+            URLSession._(nsSession,
+                isBackground: isBackground, hasDelegate: true),
+            URLSessionDownloadTask._(nsTask),
+            nsurlToUri(nsUrl));
       });
-
-      final downloadDelegate = objc.getProtocol('NSURLSessionDownloadDelegate');
-      final didFinishDownloadingToURL = objc
-          .registerName('URLSession:downloadTask:didFinishDownloadingToURL:');
-      final signature = objc.getProtocolMethodSignature(
-          downloadDelegate, didFinishDownloadingToURL,
-          isRequired: true, isInstanceMethod: true)!;
-      protoBuilder.implementMethod(didFinishDownloadingToURL, signature,
-          linkedLibs.adaptFinishWithLock(asyncFinishDownloading));
     }
 
     if (onWebSocketTaskOpened != null) {
diff --git a/pkgs/cupertino_http/lib/src/native_cupertino_bindings.dart b/pkgs/cupertino_http/lib/src/native_cupertino_bindings.dart
index 9cc83b6..2645742 100644
--- a/pkgs/cupertino_http/lib/src/native_cupertino_bindings.dart
+++ b/pkgs/cupertino_http/lib/src/native_cupertino_bindings.dart
@@ -618,10 +618,10 @@
       .asFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, int)>();
 
   ffi.Pointer<ffi.Void> valloc(
-    int arg0,
+    int __size,
   ) {
     return _valloc(
-      arg0,
+      __size,
     );
   }
 
@@ -701,6 +701,22 @@
   late final _atexit = _atexitPtr.asFunction<
       int Function(ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>();
 
+  int at_quick_exit(
+    ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> arg0,
+  ) {
+    return _at_quick_exit(
+      arg0,
+    );
+  }
+
+  late final _at_quick_exitPtr = _lookup<
+          ffi.NativeFunction<
+              ffi.Int Function(
+                  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>>(
+      'at_quick_exit');
+  late final _at_quick_exit = _at_quick_exitPtr.asFunction<
+      int Function(ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>();
+
   double atof(
     ffi.Pointer<ffi.Char> arg0,
   ) {
@@ -980,6 +996,18 @@
                   ffi.Int Function(
                       ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>)>();
 
+  void quick_exit(
+    int arg0,
+  ) {
+    return _quick_exit(
+      arg0,
+    );
+  }
+
+  late final _quick_exitPtr =
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int)>>('quick_exit');
+  late final _quick_exit = _quick_exitPtr.asFunction<void Function(int)>();
+
   int rand() {
     return _rand();
   }
@@ -3092,6 +3120,99 @@
       CFAllocatorRef Function(
           CFAllocatorRef, ffi.Pointer<CFAllocatorContext>)>();
 
+  ffi.Pointer<ffi.Void> CFAllocatorAllocateTyped(
+    CFAllocatorRef allocator,
+    int size,
+    int descriptor,
+    int hint,
+  ) {
+    return _CFAllocatorAllocateTyped(
+      allocator,
+      size,
+      descriptor,
+      hint,
+    );
+  }
+
+  late final _CFAllocatorAllocateTypedPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(CFAllocatorRef, CFIndex,
+              CFAllocatorTypeID, CFOptionFlags)>>('CFAllocatorAllocateTyped');
+  late final _CFAllocatorAllocateTyped =
+      _CFAllocatorAllocateTypedPtr.asFunction<
+          ffi.Pointer<ffi.Void> Function(CFAllocatorRef, int, int, int)>();
+
+  ffi.Pointer<ffi.Void> CFAllocatorReallocateTyped(
+    CFAllocatorRef allocator,
+    ffi.Pointer<ffi.Void> ptr,
+    int newsize,
+    int descriptor,
+    int hint,
+  ) {
+    return _CFAllocatorReallocateTyped(
+      allocator,
+      ptr,
+      newsize,
+      descriptor,
+      hint,
+    );
+  }
+
+  late final _CFAllocatorReallocateTypedPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              CFAllocatorRef,
+              ffi.Pointer<ffi.Void>,
+              CFIndex,
+              CFAllocatorTypeID,
+              CFOptionFlags)>>('CFAllocatorReallocateTyped');
+  late final _CFAllocatorReallocateTyped =
+      _CFAllocatorReallocateTypedPtr.asFunction<
+          ffi.Pointer<ffi.Void> Function(
+              CFAllocatorRef, ffi.Pointer<ffi.Void>, int, int, int)>();
+
+  ffi.Pointer<ffi.Void> CFAllocatorAllocateBytes(
+    CFAllocatorRef allocator,
+    int size,
+    int hint,
+  ) {
+    return _CFAllocatorAllocateBytes(
+      allocator,
+      size,
+      hint,
+    );
+  }
+
+  late final _CFAllocatorAllocateBytesPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(CFAllocatorRef, CFIndex,
+              CFOptionFlags)>>('CFAllocatorAllocateBytes');
+  late final _CFAllocatorAllocateBytes = _CFAllocatorAllocateBytesPtr
+      .asFunction<ffi.Pointer<ffi.Void> Function(CFAllocatorRef, int, int)>();
+
+  ffi.Pointer<ffi.Void> CFAllocatorReallocateBytes(
+    CFAllocatorRef allocator,
+    ffi.Pointer<ffi.Void> ptr,
+    int newsize,
+    int hint,
+  ) {
+    return _CFAllocatorReallocateBytes(
+      allocator,
+      ptr,
+      newsize,
+      hint,
+    );
+  }
+
+  late final _CFAllocatorReallocateBytesPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(CFAllocatorRef, ffi.Pointer<ffi.Void>,
+              CFIndex, CFOptionFlags)>>('CFAllocatorReallocateBytes');
+  late final _CFAllocatorReallocateBytes =
+      _CFAllocatorReallocateBytesPtr.asFunction<
+          ffi.Pointer<ffi.Void> Function(
+              CFAllocatorRef, ffi.Pointer<ffi.Void>, int, int)>();
+
   ffi.Pointer<ffi.Void> CFAllocatorAllocate(
     CFAllocatorRef allocator,
     int size,
@@ -7138,6 +7259,20 @@
       int Function(
           int, ffi.Pointer<ffi.Char>, int, ffi.Pointer<ffi.Char>, int)>();
 
+  int printf(
+    ffi.Pointer<ffi.Char> arg0,
+  ) {
+    return _printf(
+      arg0,
+    );
+  }
+
+  late final _printfPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Char>)>>(
+          'printf');
+  late final _printf =
+      _printfPtr.asFunction<int Function(ffi.Pointer<ffi.Char>)>();
+
   late final ffi.Pointer<ffi.Pointer<FILE>> ___stdinp =
       _lookup<ffi.Pointer<FILE>>('__stdinp');
 
@@ -7513,20 +7648,6 @@
   late final _perror =
       _perrorPtr.asFunction<void Function(ffi.Pointer<ffi.Char>)>();
 
-  int printf(
-    ffi.Pointer<ffi.Char> arg0,
-  ) {
-    return _printf(
-      arg0,
-    );
-  }
-
-  late final _printfPtr =
-      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Char>)>>(
-          'printf');
-  late final _printf =
-      _printfPtr.asFunction<int Function(ffi.Pointer<ffi.Char>)>();
-
   int putc(
     int arg0,
     ffi.Pointer<FILE> arg1,
@@ -16733,6 +16854,13 @@
   CFNumberFormatterKey get kCFNumberFormatterMaxSignificantDigits =>
       _kCFNumberFormatterMaxSignificantDigits.value;
 
+  late final ffi.Pointer<CFNumberFormatterKey>
+      _kCFNumberFormatterMinGroupingDigits =
+      _lookup<CFNumberFormatterKey>('kCFNumberFormatterMinGroupingDigits');
+
+  CFNumberFormatterKey get kCFNumberFormatterMinGroupingDigits =>
+      _kCFNumberFormatterMinGroupingDigits.value;
+
   int CFNumberFormatterGetDecimalInfoForCurrencyCode(
     CFStringRef currencyCode,
     ffi.Pointer<ffi.Int32> defaultFractionDigits,
@@ -30083,6 +30211,32 @@
   late final _CFAttributedStringEndEditing = _CFAttributedStringEndEditingPtr
       .asFunction<void Function(CFMutableAttributedStringRef)>();
 
+  bool CFAttributedStringGetBidiLevelsAndResolvedDirections(
+    CFAttributedStringRef attributedString,
+    CFRange range,
+    int baseDirection,
+    ffi.Pointer<ffi.Uint8> bidiLevels,
+    ffi.Pointer<ffi.Uint8> baseDirections,
+  ) {
+    return _CFAttributedStringGetBidiLevelsAndResolvedDirections(
+      attributedString,
+      range,
+      baseDirection,
+      bidiLevels,
+      baseDirections,
+    );
+  }
+
+  late final _CFAttributedStringGetBidiLevelsAndResolvedDirectionsPtr = _lookup<
+          ffi.NativeFunction<
+              ffi.Bool Function(CFAttributedStringRef, CFRange, ffi.Int8,
+                  ffi.Pointer<ffi.Uint8>, ffi.Pointer<ffi.Uint8>)>>(
+      'CFAttributedStringGetBidiLevelsAndResolvedDirections');
+  late final _CFAttributedStringGetBidiLevelsAndResolvedDirections =
+      _CFAttributedStringGetBidiLevelsAndResolvedDirectionsPtr.asFunction<
+          bool Function(CFAttributedStringRef, CFRange, int,
+              ffi.Pointer<ffi.Uint8>, ffi.Pointer<ffi.Uint8>)>();
+
   int CFURLEnumeratorGetTypeID() {
     return _CFURLEnumeratorGetTypeID();
   }
@@ -33361,6 +33515,36 @@
       _SecCertificateCopySerialNumberDataPtr.asFunction<
           CFDataRef Function(SecCertificateRef, ffi.Pointer<CFErrorRef>)>();
 
+  CFDateRef SecCertificateCopyNotValidBeforeDate(
+    SecCertificateRef certificate,
+  ) {
+    return _SecCertificateCopyNotValidBeforeDate(
+      certificate,
+    );
+  }
+
+  late final _SecCertificateCopyNotValidBeforeDatePtr =
+      _lookup<ffi.NativeFunction<CFDateRef Function(SecCertificateRef)>>(
+          'SecCertificateCopyNotValidBeforeDate');
+  late final _SecCertificateCopyNotValidBeforeDate =
+      _SecCertificateCopyNotValidBeforeDatePtr.asFunction<
+          CFDateRef Function(SecCertificateRef)>();
+
+  CFDateRef SecCertificateCopyNotValidAfterDate(
+    SecCertificateRef certificate,
+  ) {
+    return _SecCertificateCopyNotValidAfterDate(
+      certificate,
+    );
+  }
+
+  late final _SecCertificateCopyNotValidAfterDatePtr =
+      _lookup<ffi.NativeFunction<CFDateRef Function(SecCertificateRef)>>(
+          'SecCertificateCopyNotValidAfterDate');
+  late final _SecCertificateCopyNotValidAfterDate =
+      _SecCertificateCopyNotValidAfterDatePtr.asFunction<
+          CFDateRef Function(SecCertificateRef)>();
+
   CFDataRef SecCertificateCopySerialNumber(
     SecCertificateRef certificate,
     ffi.Pointer<CFErrorRef> error,
@@ -40476,27 +40660,6 @@
         .release();
     _NSFilePathErrorKey.value = value.ref.retainAndReturnPointer();
   }
-
-  /// Create a block useable as a
-  /// `URLSession:downloadTask:didFinishDownloadingToURL:` that can be used to
-  /// make an async Dart callback behave synchronously.
-  Dart_DidFinish adaptFinishWithLock(
-    Dart_DidFinishWithLock block,
-  ) {
-    return ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL
-        .castFromPointer(
-            _adaptFinishWithLock(
-              block.ref.pointer,
-            ),
-            retain: true,
-            release: true);
-  }
-
-  late final _adaptFinishWithLockPtr =
-      _lookup<ffi.NativeFunction<_DidFinish Function(_DidFinishWithLock)>>(
-          'adaptFinishWithLock');
-  late final _adaptFinishWithLock = _adaptFinishWithLockPtr
-      .asFunction<_DidFinish Function(_DidFinishWithLock)>();
 }
 
 @ffi.Native<
@@ -40508,30 +40671,98 @@
 );
 
 @ffi.Native<
-    ffi.Pointer<objc.ObjCBlockImpl> Function(
-        ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(
+    _NativeCupertinoHttp_wrapBlockingBlock_1pl9qdv(
   ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
 );
 
 @ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_wjovn7(
+    _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_1krhfwz(
+    _NativeCupertinoHttp_wrapListenerBlock_18v1jvf(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_18v1jvf(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
+    ffi.Pointer<objc.ObjCBlockImpl> Function(
+        ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapListenerBlock_1o83rbn(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+);
+
+@ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_1o83rbn(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40540,6 +40771,23 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_tg5tbv(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40548,6 +40796,23 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_1dqvvol(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40556,14 +40821,48 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_6enxqz(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_qxvyq2(
+    _NativeCupertinoHttp_wrapListenerBlock_18kzm6a(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_18kzm6a(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40572,14 +40871,48 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_9o8504(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_12a4qua(
+    _NativeCupertinoHttp_wrapListenerBlock_og5b6y(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_og5b6y(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40588,6 +40921,23 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_gwxhxt(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40596,6 +40946,23 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_k73ff5(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40604,30 +40971,98 @@
 );
 
 @ffi.Native<
-    ffi.Pointer<objc.ObjCBlockImpl> Function(
-        ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_wjvic9(
+    _NativeCupertinoHttp_wrapBlockingBlock_15f11yh(
   ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
 );
 
 @ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_91c9gi(
+    _NativeCupertinoHttp_wrapListenerBlock_pfv6jd(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_pfv6jd(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_14pxqbs(
+    _NativeCupertinoHttp_wrapListenerBlock_18qun1e(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_18qun1e(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
+    ffi.Pointer<objc.ObjCBlockImpl> Function(
+        ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapListenerBlock_o762yo(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+);
+
+@ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_o762yo(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40636,14 +41071,48 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_1s56lr9(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_1hcfngn(
+    _NativeCupertinoHttp_wrapListenerBlock_r8gdi7(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_r8gdi7(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40652,126 +41121,398 @@
 );
 
 @ffi.Native<
-    ffi.Pointer<objc.ObjCBlockImpl> Function(
-        ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_1f43wec(
+    _NativeCupertinoHttp_wrapBlockingBlock_16sve1d(
   ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
 );
 
 @ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(
+    _NativeCupertinoHttp_wrapListenerBlock_xx612k(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_xx612k(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_ao4xm9(
+    _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_mn1xu3(
+    _NativeCupertinoHttp_wrapListenerBlock_fjrv01(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_fjrv01(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_13vswqm(
+    _NativeCupertinoHttp_wrapListenerBlock_1otpo83(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_1otpo83(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_37btrl(
+    _NativeCupertinoHttp_wrapListenerBlock_l2g8ke(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_l2g8ke(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_12nszru(
+    _NativeCupertinoHttp_wrapListenerBlock_n8yd09(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_n8yd09(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_qm01og(
+    _NativeCupertinoHttp_wrapListenerBlock_bklti2(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_bklti2(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_1uuez7b(
+    _NativeCupertinoHttp_wrapListenerBlock_jyim80(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_jyim80(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_9qxjkl(
+    _NativeCupertinoHttp_wrapListenerBlock_h68abb(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_h68abb(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_3lo3bb(
+    _NativeCupertinoHttp_wrapListenerBlock_ly2579(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_ly2579(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_16ko9u(
+    _NativeCupertinoHttp_wrapListenerBlock_1lx650f(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_1lx650f(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_1j2nt86(
+    _NativeCupertinoHttp_wrapListenerBlock_1p9ui4q(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_1p9ui4q(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_8wbg7l(
+    _NativeCupertinoHttp_wrapListenerBlock_1b3bb6a(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_1b3bb6a(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_148br51(
+    _NativeCupertinoHttp_wrapListenerBlock_lmc3p5(
   ffi.Pointer<objc.ObjCBlockImpl> block,
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_lmc3p5(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
+    ffi.Pointer<objc.ObjCBlockImpl> Function(
+        ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapListenerBlock_t8l8el(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+);
+
+@ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_t8l8el(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40780,6 +41521,23 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_vhbh5h(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40788,6 +41546,23 @@
 );
 
 @ffi.Native<
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
+external ffi.Pointer<objc.ObjCBlockImpl>
+    _NativeCupertinoHttp_wrapBlockingBlock_zuf90e(
+  ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
+);
+
+@ffi.Native<
     ffi.Pointer<objc.ObjCBlockImpl> Function(
         ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
@@ -40796,11 +41571,20 @@
 );
 
 @ffi.Native<
-    ffi.Pointer<objc.ObjCBlockImpl> Function(
-        ffi.Pointer<objc.ObjCBlockImpl>)>(isLeaf: true)
+        ffi.Pointer<objc.ObjCBlockImpl> Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>>,
+            ffi.Pointer<
+                ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>(
+    isLeaf: true)
 external ffi.Pointer<objc.ObjCBlockImpl>
-    _NativeCupertinoHttp_wrapListenerBlock_4ya7yd(
+    _NativeCupertinoHttp_wrapBlockingBlock_ovsamd(
   ffi.Pointer<objc.ObjCBlockImpl> block,
+  ffi.Pointer<objc.ObjCBlockImpl> listnerBlock,
+  ffi.Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function()>> newWaiter,
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+      awaitWaiter,
 );
 
 typedef __int8_t = ffi.SignedChar;
@@ -41040,6 +41824,14 @@
   external int __exception;
 }
 
+final class __darwin_arm_exception_state64_v2 extends ffi.Struct {
+  @__uint64_t()
+  external int __far;
+
+  @__uint64_t()
+  external int __esr;
+}
+
 final class __darwin_arm_thread_state extends ffi.Struct {
   @ffi.Array.multi([13])
   external ffi.Array<__uint32_t> __r;
@@ -41997,7 +42789,16 @@
   @ffi.Uint64()
   external int ri_secure_ptime_in_system;
 
-  @ffi.Array.multi([12])
+  @ffi.Uint64()
+  external int ri_neural_footprint;
+
+  @ffi.Uint64()
+  external int ri_lifetime_max_neural_footprint;
+
+  @ffi.Uint64()
+  external int ri_interval_max_neural_footprint;
+
+  @ffi.Array.multi([9])
   external ffi.Array<ffi.Uint64> ri_reserved;
 }
 
@@ -42019,24 +42820,6 @@
   external int wm_rate;
 }
 
-@ffi.Packed(1)
-final class _OSUnalignedU16 extends ffi.Struct {
-  @ffi.Uint16()
-  external int __val;
-}
-
-@ffi.Packed(1)
-final class _OSUnalignedU32 extends ffi.Struct {
-  @ffi.Uint32()
-  external int __val;
-}
-
-@ffi.Packed(1)
-final class _OSUnalignedU64 extends ffi.Struct {
-  @ffi.Uint64()
-  external int __val;
-}
-
 final class wait extends ffi.Opaque {}
 
 typedef ct_rune_t = __darwin_ct_rune_t;
@@ -42104,6 +42887,33 @@
             ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block, ffi.Pointer<ffi.Void> waiter) {
+  try {
+    (objc.getBlockClosure(block) as void Function())();
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>)>
+    _ObjCBlock_ffiVoid_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>)>
+    _ObjCBlock_ffiVoid_blockingListenerCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>)>.listener(
+        _ObjCBlock_ffiVoid_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function()>`.
 abstract final class ObjCBlock_ffiVoid {
@@ -42155,6 +42965,29 @@
     return objc.ObjCBlock<ffi.Void Function()>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function()> blocking(void Function() fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_blockingCallable.nativeFunction.cast(), () => fn());
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_blockingListenerCallable.nativeFunction.cast(),
+        () => fn());
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1pl9qdv, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function()>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function()>`.
@@ -42265,10 +43098,9 @@
                   ffi.Pointer<ffi.Void>)>()(ref.pointer, arg0, arg1);
 }
 
-typedef ptrdiff_t = ffi.Long;
-typedef Dartptrdiff_t = int;
-typedef rsize_t = ffi.UnsignedLong;
-typedef Dartrsize_t = int;
+typedef ptrdiff_t = __darwin_ptrdiff_t;
+typedef rsize_t = __darwin_size_t;
+typedef wint_t = __darwin_wint_t;
 typedef u_char = ffi.UnsignedChar;
 typedef Dartu_char = int;
 typedef u_short = ffi.UnsignedShort;
@@ -42349,8 +43181,8 @@
 
 final class _NSZone extends ffi.Opaque {}
 
-typedef va_list = __builtin_va_list;
 typedef __gnuc_va_list = __builtin_va_list;
+typedef va_list = __builtin_va_list;
 typedef NSExceptionName = ffi.Pointer<objc.ObjCObject>;
 typedef DartNSExceptionName = objc.NSString;
 typedef NSRunLoopMode = ffi.Pointer<objc.ObjCObject>;
@@ -42760,6 +43592,8 @@
 typedef extended80 = Float80;
 typedef extended96 = Float96;
 typedef VHSelect = SInt8;
+typedef CFAllocatorTypeID = ffi.UnsignedLongLong;
+typedef DartCFAllocatorTypeID = int;
 typedef CFTypeID = ffi.UnsignedLong;
 typedef DartCFTypeID = int;
 typedef CFOptionFlags = ffi.UnsignedLong;
@@ -42908,7 +43742,7 @@
         void Function(ffi.Pointer<objc.ObjCObject>,
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_classForCoder = objc.registerName("classForCoder");
-final _objc_msgSend_1x359cv = objc.msgSendPointer
+final _objc_msgSend_151sglz = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -42918,7 +43752,7 @@
             ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCSelector>)>();
 late final _sel_replacementObjectForCoder_ =
     objc.registerName("replacementObjectForCoder:");
-final _objc_msgSend_62nh5j = objc.msgSendPointer
+final _objc_msgSend_1sotr3r = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -42945,13 +43779,13 @@
 
   /// classForCoder
   objc.ObjCObjectBase get classForCoder {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_classForCoder);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_classForCoder);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
 
   /// replacementObjectForCoder:
   objc.ObjCObjectBase? replacementObjectForCoder_(objc.NSCoder coder) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_replacementObjectForCoder_, coder.ref.pointer);
     return _ret.address == 0
         ? null
@@ -42960,7 +43794,7 @@
 
   /// awakeAfterUsingCoder:
   objc.ObjCObjectBase? awakeAfterUsingCoder_(objc.NSCoder coder) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_awakeAfterUsingCoder_, coder.ref.pointer);
     return _ret.address == 0
         ? null
@@ -42969,7 +43803,7 @@
 }
 
 late final _sel_poseAsClass_ = objc.registerName("poseAsClass:");
-final _objc_msgSend_1jdvcbf = objc.msgSendPointer
+final _objc_msgSend_xtuoz7 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -42984,7 +43818,7 @@
 extension NSDeprecatedMethods on objc.NSObject {
   /// poseAsClass:
   static void poseAsClass_(objc.ObjCObjectBase aClass) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         _class_NSObject, _sel_poseAsClass_, aClass.ref.pointer);
   }
 }
@@ -42997,7 +43831,7 @@
   /// autoContentAccessingProxy
   objc.ObjCObjectBase get autoContentAccessingProxy {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_autoContentAccessingProxy);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_autoContentAccessingProxy);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
 }
@@ -43062,7 +43896,7 @@
 
 late final _class_NSURLCache = objc.getClass("NSURLCache");
 late final _sel_isKindOfClass_ = objc.registerName("isKindOfClass:");
-final _objc_msgSend_69e0x1 = objc.msgSendPointer
+final _objc_msgSend_19nvye5 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Bool Function(
@@ -43094,7 +43928,7 @@
 
 late final _sel_storeCachedResponse_forDataTask_ =
     objc.registerName("storeCachedResponse:forDataTask:");
-final _objc_msgSend_wjvic9 = objc.msgSendPointer
+final _objc_msgSend_pfv6jd = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -43149,6 +43983,40 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSCachedURLResponse_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSCachedURLResponse_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSCachedURLResponse_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSCachedURLResponse_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSCachedURLResponse_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSCachedURLResponse_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>`.
 abstract final class ObjCBlock_ffiVoid_NSCachedURLResponse {
@@ -43212,11 +44080,45 @@
             ? null
             : NSCachedURLResponse.castFromPointer(arg0,
                 retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)> blocking(
+      void Function(NSCachedURLResponse?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSCachedURLResponse_blockingCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : NSCachedURLResponse.castFromPointer(arg0,
+                retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSCachedURLResponse_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : NSCachedURLResponse.castFromPointer(arg0,
+                retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>`.
@@ -43235,7 +44137,7 @@
 
 late final _sel_getCachedResponseForDataTask_completionHandler_ =
     objc.registerName("getCachedResponseForDataTask:completionHandler:");
-final _objc_msgSend_14pxqbs = objc.msgSendPointer
+final _objc_msgSend_o762yo = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -43257,7 +44159,7 @@
   /// storeCachedResponse:forDataTask:
   void storeCachedResponse_forDataTask_(
       NSCachedURLResponse cachedResponse, NSURLSessionDataTask dataTask) {
-    _objc_msgSend_wjvic9(
+    _objc_msgSend_pfv6jd(
         this.ref.pointer,
         _sel_storeCachedResponse_forDataTask_,
         cachedResponse.ref.pointer,
@@ -43269,7 +44171,7 @@
       NSURLSessionDataTask dataTask,
       objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>
           completionHandler) {
-    _objc_msgSend_14pxqbs(
+    _objc_msgSend_o762yo(
         this.ref.pointer,
         _sel_getCachedResponseForDataTask_completionHandler_,
         dataTask.ref.pointer,
@@ -43278,7 +44180,7 @@
 
   /// removeCachedResponseForDataTask:
   void removeCachedResponseForDataTask_(NSURLSessionDataTask dataTask) {
-    _objc_msgSend_1jdvcbf(this.ref.pointer,
+    _objc_msgSend_xtuoz7(this.ref.pointer,
         _sel_removeCachedResponseForDataTask_, dataTask.ref.pointer);
   }
 }
@@ -43289,7 +44191,7 @@
 typedef Dartinstancetype = objc.ObjCObjectBase;
 late final _sel_initWithMemoryCapacity_diskCapacity_diskPath_ =
     objc.registerName("initWithMemoryCapacity:diskCapacity:diskPath:");
-final _objc_msgSend_1dlfwfh = objc.msgSendPointer
+final _objc_msgSend_1dqnse5 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -43336,7 +44238,7 @@
   /// @abstract Returns the HTTP request method of the receiver.
   /// @result the HTTP request method of the receiver.
   objc.NSString? get HTTPMethod {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_HTTPMethod);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_HTTPMethod);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -43349,7 +44251,7 @@
   /// receiver.
   objc.NSDictionary? get allHTTPHeaderFields {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_allHTTPHeaderFields);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_allHTTPHeaderFields);
     return _ret.address == 0
         ? null
         : objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
@@ -43365,7 +44267,7 @@
   /// @result the value associated with the given header field, or nil if
   /// there is no value associated with the given header field.
   objc.NSString? valueForHTTPHeaderField_(objc.NSString field) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_valueForHTTPHeaderField_, field.ref.pointer);
     return _ret.address == 0
         ? null
@@ -43378,7 +44280,7 @@
   /// in done in an HTTP POST request.
   /// @result The request body data of the receiver.
   objc.NSData? get HTTPBody {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_HTTPBody);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_HTTPBody);
     return _ret.address == 0
         ? null
         : objc.NSData.castFromPointer(_ret, retain: true, release: true);
@@ -43395,7 +44297,7 @@
   /// NSCoding protocol
   /// @result The request body stream of the receiver.
   objc.NSInputStream? get HTTPBodyStream {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_HTTPBodyStream);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_HTTPBodyStream);
     return _ret.address == 0
         ? null
         : objc.NSInputStream.castFromPointer(_ret, retain: true, release: true);
@@ -43582,7 +44484,7 @@
 typedef DartNSTimeInterval = double;
 late final _sel_requestWithURL_cachePolicy_timeoutInterval_ =
     objc.registerName("requestWithURL:cachePolicy:timeoutInterval:");
-final _objc_msgSend_3phu9v = objc.msgSendPointer
+final _objc_msgSend_1ajs603 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -43759,10 +44661,11 @@
             ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCSelector>)>();
 late final _sel_requiresDNSSECValidation =
     objc.registerName("requiresDNSSECValidation");
+late final _sel_allowsPersistentDNS = objc.registerName("allowsPersistentDNS");
 late final _sel_init = objc.registerName("init");
 late final _sel_new = objc.registerName("new");
 late final _sel_allocWithZone_ = objc.registerName("allocWithZone:");
-final _objc_msgSend_hzlb60 = objc.msgSendPointer
+final _objc_msgSend_1cwp428 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -43917,6 +44820,50 @@
                 ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSCoder_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_ffiVoid_NSCoder_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<ffi.Void> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSCoder_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSCoder_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSCoder_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSCoder_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, objc.NSCoder)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSCoder {
@@ -43979,12 +44926,45 @@
         (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
             arg0,
             objc.NSCoder.castFromPointer(arg1, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_wjovn7(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_18v1jvf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(ffi.Pointer<ffi.Void>, objc.NSCoder)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, objc.NSCoder)>
+      blocking(void Function(ffi.Pointer<ffi.Void>, objc.NSCoder) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSCoder_blockingCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
+            arg0,
+            objc.NSCoder.castFromPointer(arg1, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSCoder_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
+            arg0,
+            objc.NSCoder.castFromPointer(arg1, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_18v1jvf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(ffi.Pointer<ffi.Void>, objc.NSCoder)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, objc.NSCoder)>`.
@@ -44128,7 +45108,7 @@
 
   /// Returns whether [obj] is an instance of [NSURLRequest].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSURLRequest);
   }
 
@@ -44142,7 +45122,7 @@
   /// @param URL The URL for the request.
   /// @result A newly-created and autoreleased NSURLRequest instance.
   static NSURLRequest requestWithURL_(objc.NSURL URL) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSURLRequest, _sel_requestWithURL_, URL.ref.pointer);
     return NSURLRequest.castFromPointer(_ret, retain: true, release: true);
   }
@@ -44166,7 +45146,7 @@
       objc.NSURL URL,
       NSURLRequestCachePolicy cachePolicy,
       DartNSTimeInterval timeoutInterval) {
-    final _ret = _objc_msgSend_3phu9v(
+    final _ret = _objc_msgSend_1ajs603(
         _class_NSURLRequest,
         _sel_requestWithURL_cachePolicy_timeoutInterval_,
         URL.ref.pointer,
@@ -44184,7 +45164,7 @@
   /// @param URL The URL for the request.
   /// @result An initialized NSURLRequest.
   NSURLRequest initWithURL_(objc.NSURL URL) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.retainAndReturnPointer(), _sel_initWithURL_, URL.ref.pointer);
     return NSURLRequest.castFromPointer(_ret, retain: false, release: true);
   }
@@ -44203,7 +45183,7 @@
   /// @result An initialized NSURLRequest.
   NSURLRequest initWithURL_cachePolicy_timeoutInterval_(objc.NSURL URL,
       NSURLRequestCachePolicy cachePolicy, DartNSTimeInterval timeoutInterval) {
-    final _ret = _objc_msgSend_3phu9v(
+    final _ret = _objc_msgSend_1ajs603(
         this.ref.retainAndReturnPointer(),
         _sel_initWithURL_cachePolicy_timeoutInterval_,
         URL.ref.pointer,
@@ -44216,7 +45196,7 @@
   /// @abstract Returns the URL of the receiver.
   /// @result The URL of the receiver.
   objc.NSURL? get URL {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_URL);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_URL);
     return _ret.address == 0
         ? null
         : objc.NSURL.castFromPointer(_ret, retain: true, release: true);
@@ -44257,7 +45237,7 @@
   /// See setMainDocumentURL:
   /// @result The main document URL.
   objc.NSURL? get mainDocumentURL {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_mainDocumentURL);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_mainDocumentURL);
     return _ret.address == 0
         ? null
         : objc.NSURL.castFromPointer(_ret, retain: true, release: true);
@@ -44331,59 +45311,69 @@
         this.ref.pointer, _sel_requiresDNSSECValidation);
   }
 
+  /// !
+  /// @abstract Allows storing and usage of DNS answers, potentially beyond TTL expiry,
+  /// in a persistent per-process cache. This should only be set for hostnames whose resolutions
+  /// are not expected to change across networks.
+  /// @discussion YES, if the DNS lookup for this request is allowed to use a persistent per-process cache,
+  /// NO otherwise. Defaults to NO.
+  bool get allowsPersistentDNS {
+    return _objc_msgSend_91o635(this.ref.pointer, _sel_allowsPersistentDNS);
+  }
+
   /// init
   NSURLRequest init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLRequest.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// new
   static NSURLRequest new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLRequest, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLRequest, _sel_new);
     return NSURLRequest.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSURLRequest allocWithZone_(ffi.Pointer<_NSZone> zone) {
     final _ret =
-        _objc_msgSend_hzlb60(_class_NSURLRequest, _sel_allocWithZone_, zone);
+        _objc_msgSend_1cwp428(_class_NSURLRequest, _sel_allocWithZone_, zone);
     return NSURLRequest.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// alloc
   static NSURLRequest alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLRequest, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLRequest, _sel_alloc);
     return NSURLRequest.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// self
   NSURLRequest self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLRequest.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// retain
   NSURLRequest retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLRequest.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// autorelease
   NSURLRequest autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLRequest.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// encodeWithCoder:
   void encodeWithCoder_(objc.NSCoder coder) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_encodeWithCoder_, coder.ref.pointer);
   }
 
   /// initWithCoder:
   NSURLRequest? initWithCoder_(objc.NSCoder coder) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithCoder_, coder.ref.pointer);
     return _ret.address == 0
         ? null
@@ -44449,7 +45439,7 @@
 
   /// Returns whether [obj] is an instance of [NSURLCache].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSURLCache);
   }
 
@@ -44478,7 +45468,7 @@
   /// becoming unexpectedly unretrievable.
   /// @result the shared NSURLCache instance.
   static NSURLCache getSharedURLCache() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLCache, _sel_sharedURLCache);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLCache, _sel_sharedURLCache);
     return NSURLCache.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -44507,7 +45497,7 @@
   /// becoming unexpectedly unretrievable.
   /// @result the shared NSURLCache instance.
   static void setSharedURLCache(NSURLCache value) {
-    return _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         _class_NSURLCache, _sel_setSharedURLCache_, value.ref.pointer);
   }
 
@@ -44528,7 +45518,7 @@
       DartNSUInteger memoryCapacity,
       DartNSUInteger diskCapacity,
       objc.NSString? path) {
-    final _ret = _objc_msgSend_1dlfwfh(
+    final _ret = _objc_msgSend_1dqnse5(
         this.ref.retainAndReturnPointer(),
         _sel_initWithMemoryCapacity_diskCapacity_diskPath_,
         memoryCapacity,
@@ -44548,7 +45538,7 @@
       DartNSUInteger memoryCapacity,
       DartNSUInteger diskCapacity,
       objc.NSURL? directoryURL) {
-    final _ret = _objc_msgSend_1dlfwfh(
+    final _ret = _objc_msgSend_1dqnse5(
         this.ref.retainAndReturnPointer(),
         _sel_initWithMemoryCapacity_diskCapacity_directoryURL_,
         memoryCapacity,
@@ -44568,7 +45558,7 @@
   /// request, or nil if there is no NSCachedURLResponse stored with the
   /// given request.
   NSCachedURLResponse? cachedResponseForRequest_(NSURLRequest request) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_cachedResponseForRequest_, request.ref.pointer);
     return _ret.address == 0
         ? null
@@ -44584,7 +45574,7 @@
   /// @param request the NSURLRequest to use as a key for the storage.
   void storeCachedResponse_forRequest_(
       NSCachedURLResponse cachedResponse, NSURLRequest request) {
-    _objc_msgSend_wjvic9(this.ref.pointer, _sel_storeCachedResponse_forRequest_,
+    _objc_msgSend_pfv6jd(this.ref.pointer, _sel_storeCachedResponse_forRequest_,
         cachedResponse.ref.pointer, request.ref.pointer);
   }
 
@@ -44596,8 +45586,8 @@
   /// stored with the given request.
   /// @param request the NSURLRequest to use as a key for the lookup.
   void removeCachedResponseForRequest_(NSURLRequest request) {
-    _objc_msgSend_1jdvcbf(this.ref.pointer,
-        _sel_removeCachedResponseForRequest_, request.ref.pointer);
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_removeCachedResponseForRequest_,
+        request.ref.pointer);
   }
 
   /// !
@@ -44612,8 +45602,8 @@
   /// @method removeCachedResponsesSince:
   /// @abstract Clears the given cache of any cached responses since the provided date.
   void removeCachedResponsesSinceDate_(objc.NSDate date) {
-    _objc_msgSend_1jdvcbf(this.ref.pointer,
-        _sel_removeCachedResponsesSinceDate_, date.ref.pointer);
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_removeCachedResponsesSinceDate_,
+        date.ref.pointer);
   }
 
   /// !
@@ -44629,8 +45619,7 @@
   /// @discussion At the time this call is made, the in-memory cache will truncate its contents to the size given, if necessary.
   /// @result The in-memory capacity, measured in bytes, for the receiver.
   set memoryCapacity(DartNSUInteger value) {
-    return _objc_msgSend_1i9r4xy(
-        this.ref.pointer, _sel_setMemoryCapacity_, value);
+    _objc_msgSend_1i9r4xy(this.ref.pointer, _sel_setMemoryCapacity_, value);
   }
 
   /// !
@@ -44644,8 +45633,7 @@
   /// @abstract The on-disk capacity of the receiver.
   /// @discussion The on-disk capacity, measured in bytes, for the receiver. On mutation the on-disk cache will truncate its contents to the size given, if necessary.
   set diskCapacity(DartNSUInteger value) {
-    return _objc_msgSend_1i9r4xy(
-        this.ref.pointer, _sel_setDiskCapacity_, value);
+    _objc_msgSend_1i9r4xy(this.ref.pointer, _sel_setDiskCapacity_, value);
   }
 
   /// !
@@ -44671,44 +45659,44 @@
   /// init
   NSURLCache init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLCache.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// new
   static NSURLCache new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLCache, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLCache, _sel_new);
     return NSURLCache.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSURLCache allocWithZone_(ffi.Pointer<_NSZone> zone) {
     final _ret =
-        _objc_msgSend_hzlb60(_class_NSURLCache, _sel_allocWithZone_, zone);
+        _objc_msgSend_1cwp428(_class_NSURLCache, _sel_allocWithZone_, zone);
     return NSURLCache.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// alloc
   static NSURLCache alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLCache, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLCache, _sel_alloc);
     return NSURLCache.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// self
   NSURLCache self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLCache.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// retain
   NSURLCache retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLCache.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// autorelease
   NSURLCache autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLCache.castFromPointer(_ret, retain: true, release: true);
   }
 }
@@ -44718,7 +45706,7 @@
 late final _class_NSNotification = objc.getClass("NSNotification");
 late final _sel_notificationWithName_object_ =
     objc.registerName("notificationWithName:object:");
-final _objc_msgSend_rsfdlh = objc.msgSendPointer
+final _objc_msgSend_15qeuct = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -44734,7 +45722,7 @@
             ffi.Pointer<objc.ObjCObject>)>();
 late final _sel_notificationWithName_object_userInfo_ =
     objc.registerName("notificationWithName:object:userInfo:");
-final _objc_msgSend_582s3n = objc.msgSendPointer
+final _objc_msgSend_11spmsz = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -44756,7 +45744,7 @@
   /// notificationWithName:object:
   static objc.NSNotification notificationWithName_object_(
       DartNSNotificationName aName, objc.ObjCObjectBase? anObject) {
-    final _ret = _objc_msgSend_rsfdlh(
+    final _ret = _objc_msgSend_15qeuct(
         _class_NSNotification,
         _sel_notificationWithName_object_,
         aName.ref.pointer,
@@ -44770,7 +45758,7 @@
       DartNSNotificationName aName,
       objc.ObjCObjectBase? anObject,
       objc.NSDictionary? aUserInfo) {
-    final _ret = _objc_msgSend_582s3n(
+    final _ret = _objc_msgSend_11spmsz(
         _class_NSNotification,
         _sel_notificationWithName_object_userInfo_,
         aName.ref.pointer,
@@ -44783,7 +45771,7 @@
   /// init
   objc.NSNotification init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return objc.NSNotification.castFromPointer(_ret,
         retain: false, release: true);
   }
@@ -44792,7 +45780,7 @@
 late final _class_NSDate = objc.getClass("NSDate");
 late final _sel_timeIntervalSinceDate_ =
     objc.registerName("timeIntervalSinceDate:");
-final _objc_msgSend_hlyk7w = objc.msgSendPointer
+final _objc_msgSend_mabicu = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Double Function(
@@ -44802,7 +45790,7 @@
     .asFunction<
         double Function(ffi.Pointer<objc.ObjCObject>,
             ffi.Pointer<objc.ObjCSelector>, ffi.Pointer<objc.ObjCObject>)>();
-final _objc_msgSend_hlyk7wFpret = objc.msgSendFpretPointer
+final _objc_msgSend_mabicuFpret = objc.msgSendFpretPointer
     .cast<
         ffi.NativeFunction<
             ffi.Double Function(
@@ -44817,7 +45805,7 @@
 late final _sel_timeIntervalSince1970 =
     objc.registerName("timeIntervalSince1970");
 late final _sel_addTimeInterval_ = objc.registerName("addTimeInterval:");
-final _objc_msgSend_1x911p2 = objc.msgSendPointer
+final _objc_msgSend_oa8mke = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -44830,7 +45818,7 @@
 late final _sel_earlierDate_ = objc.registerName("earlierDate:");
 late final _sel_laterDate_ = objc.registerName("laterDate:");
 late final _sel_compare_ = objc.registerName("compare:");
-final _objc_msgSend_1wpduvy = objc.msgSendPointer
+final _objc_msgSend_1ym6zyw = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             NSInteger Function(
@@ -44852,9 +45840,9 @@
   /// timeIntervalSinceDate:
   DartNSTimeInterval timeIntervalSinceDate_(objc.NSDate anotherDate) {
     return objc.useMsgSendVariants
-        ? _objc_msgSend_hlyk7wFpret(this.ref.pointer,
+        ? _objc_msgSend_mabicuFpret(this.ref.pointer,
             _sel_timeIntervalSinceDate_, anotherDate.ref.pointer)
-        : _objc_msgSend_hlyk7w(this.ref.pointer, _sel_timeIntervalSinceDate_,
+        : _objc_msgSend_mabicu(this.ref.pointer, _sel_timeIntervalSinceDate_,
             anotherDate.ref.pointer);
   }
 
@@ -44877,53 +45865,53 @@
   /// addTimeInterval:
   objc.ObjCObjectBase addTimeInterval_(DartNSTimeInterval seconds) {
     final _ret =
-        _objc_msgSend_1x911p2(this.ref.pointer, _sel_addTimeInterval_, seconds);
+        _objc_msgSend_oa8mke(this.ref.pointer, _sel_addTimeInterval_, seconds);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
 
   /// dateByAddingTimeInterval:
   objc.NSDate dateByAddingTimeInterval_(DartNSTimeInterval ti) {
-    final _ret = _objc_msgSend_1x911p2(
+    final _ret = _objc_msgSend_oa8mke(
         this.ref.pointer, _sel_dateByAddingTimeInterval_, ti);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// earlierDate:
   objc.NSDate earlierDate_(objc.NSDate anotherDate) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_earlierDate_, anotherDate.ref.pointer);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// laterDate:
   objc.NSDate laterDate_(objc.NSDate anotherDate) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_laterDate_, anotherDate.ref.pointer);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// compare:
   objc.NSComparisonResult compare_(objc.NSDate other) {
-    final _ret = _objc_msgSend_1wpduvy(
+    final _ret = _objc_msgSend_1ym6zyw(
         this.ref.pointer, _sel_compare_, other.ref.pointer);
     return objc.NSComparisonResult.fromValue(_ret);
   }
 
   /// isEqualToDate:
   bool isEqualToDate_(objc.NSDate otherDate) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_isEqualToDate_, otherDate.ref.pointer);
   }
 
   /// description
   objc.NSString get description {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_description);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_description);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// descriptionWithLocale:
   objc.NSString descriptionWithLocale_(objc.ObjCObjectBase? locale) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_descriptionWithLocale_, locale?.ref.pointer ?? ffi.nullptr);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -44947,7 +45935,7 @@
     objc.registerName("dateWithTimeIntervalSince1970:");
 late final _sel_dateWithTimeInterval_sinceDate_ =
     objc.registerName("dateWithTimeInterval:sinceDate:");
-final _objc_msgSend_xh7c7e = objc.msgSendPointer
+final _objc_msgSend_1ozwf6k = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -44975,13 +45963,13 @@
 extension NSDateCreation on objc.NSDate {
   /// date
   static objc.NSDate date() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSDate, _sel_date);
+    final _ret = _objc_msgSend_151sglz(_class_NSDate, _sel_date);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// dateWithTimeIntervalSinceNow:
   static objc.NSDate dateWithTimeIntervalSinceNow_(DartNSTimeInterval secs) {
-    final _ret = _objc_msgSend_1x911p2(
+    final _ret = _objc_msgSend_oa8mke(
         _class_NSDate, _sel_dateWithTimeIntervalSinceNow_, secs);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
@@ -44989,14 +45977,14 @@
   /// dateWithTimeIntervalSinceReferenceDate:
   static objc.NSDate dateWithTimeIntervalSinceReferenceDate_(
       DartNSTimeInterval ti) {
-    final _ret = _objc_msgSend_1x911p2(
+    final _ret = _objc_msgSend_oa8mke(
         _class_NSDate, _sel_dateWithTimeIntervalSinceReferenceDate_, ti);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// dateWithTimeIntervalSince1970:
   static objc.NSDate dateWithTimeIntervalSince1970_(DartNSTimeInterval secs) {
-    final _ret = _objc_msgSend_1x911p2(
+    final _ret = _objc_msgSend_oa8mke(
         _class_NSDate, _sel_dateWithTimeIntervalSince1970_, secs);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
@@ -45004,39 +45992,39 @@
   /// dateWithTimeInterval:sinceDate:
   static objc.NSDate dateWithTimeInterval_sinceDate_(
       DartNSTimeInterval secsToBeAdded, objc.NSDate date) {
-    final _ret = _objc_msgSend_xh7c7e(_class_NSDate,
+    final _ret = _objc_msgSend_1ozwf6k(_class_NSDate,
         _sel_dateWithTimeInterval_sinceDate_, secsToBeAdded, date.ref.pointer);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// distantFuture
   static objc.NSDate getDistantFuture() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSDate, _sel_distantFuture);
+    final _ret = _objc_msgSend_151sglz(_class_NSDate, _sel_distantFuture);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// distantPast
   static objc.NSDate getDistantPast() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSDate, _sel_distantPast);
+    final _ret = _objc_msgSend_151sglz(_class_NSDate, _sel_distantPast);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// now
   static objc.NSDate getNow() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSDate, _sel_now);
+    final _ret = _objc_msgSend_151sglz(_class_NSDate, _sel_now);
     return objc.NSDate.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// initWithTimeIntervalSinceNow:
   objc.NSDate initWithTimeIntervalSinceNow_(DartNSTimeInterval secs) {
-    final _ret = _objc_msgSend_1x911p2(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_oa8mke(this.ref.retainAndReturnPointer(),
         _sel_initWithTimeIntervalSinceNow_, secs);
     return objc.NSDate.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// initWithTimeIntervalSince1970:
   objc.NSDate initWithTimeIntervalSince1970_(DartNSTimeInterval secs) {
-    final _ret = _objc_msgSend_1x911p2(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_oa8mke(this.ref.retainAndReturnPointer(),
         _sel_initWithTimeIntervalSince1970_, secs);
     return objc.NSDate.castFromPointer(_ret, retain: false, release: true);
   }
@@ -45044,7 +46032,7 @@
   /// initWithTimeInterval:sinceDate:
   objc.NSDate initWithTimeInterval_sinceDate_(
       DartNSTimeInterval secsToBeAdded, objc.NSDate date) {
-    final _ret = _objc_msgSend_xh7c7e(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1ozwf6k(this.ref.retainAndReturnPointer(),
         _sel_initWithTimeInterval_sinceDate_, secsToBeAdded, date.ref.pointer);
     return objc.NSDate.castFromPointer(_ret, retain: false, release: true);
   }
@@ -45081,14 +46069,14 @@
   /// !
   /// @abstract Sets the HTTP request method of the receiver.
   objc.NSString get HTTPMethod {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_HTTPMethod);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_HTTPMethod);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// !
   /// @abstract Sets the HTTP request method of the receiver.
   set HTTPMethod(objc.NSString value) {
-    return _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setHTTPMethod_, value.ref.pointer);
   }
 
@@ -45104,7 +46092,7 @@
   /// message, the key-value pair is skipped.
   objc.NSDictionary? get allHTTPHeaderFields {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_allHTTPHeaderFields);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_allHTTPHeaderFields);
     return _ret.address == 0
         ? null
         : objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
@@ -45121,7 +46109,7 @@
   /// the key or value for a key-value pair answers NO when sent this
   /// message, the key-value pair is skipped.
   set allHTTPHeaderFields(objc.NSDictionary? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setAllHTTPHeaderFields_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setAllHTTPHeaderFields_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -45135,7 +46123,7 @@
   /// @param value the header field value.
   /// @param field the header field name (case-insensitive).
   void setValue_forHTTPHeaderField_(objc.NSString? value, objc.NSString field) {
-    _objc_msgSend_wjvic9(this.ref.pointer, _sel_setValue_forHTTPHeaderField_,
+    _objc_msgSend_pfv6jd(this.ref.pointer, _sel_setValue_forHTTPHeaderField_,
         value?.ref.pointer ?? ffi.nullptr, field.ref.pointer);
   }
 
@@ -45153,7 +46141,7 @@
   /// @param value the header field value.
   /// @param field the header field name (case-insensitive).
   void addValue_forHTTPHeaderField_(objc.NSString value, objc.NSString field) {
-    _objc_msgSend_wjvic9(this.ref.pointer, _sel_addValue_forHTTPHeaderField_,
+    _objc_msgSend_pfv6jd(this.ref.pointer, _sel_addValue_forHTTPHeaderField_,
         value.ref.pointer, field.ref.pointer);
   }
 
@@ -45162,7 +46150,7 @@
   /// @discussion This data is sent as the message body of the request, as
   /// in done in an HTTP POST request.
   objc.NSData? get HTTPBody {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_HTTPBody);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_HTTPBody);
     return _ret.address == 0
         ? null
         : objc.NSData.castFromPointer(_ret, retain: true, release: true);
@@ -45173,7 +46161,7 @@
   /// @discussion This data is sent as the message body of the request, as
   /// in done in an HTTP POST request.
   set HTTPBody(objc.NSData? value) {
-    return _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setHTTPBody_, value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -45185,7 +46173,7 @@
   /// and the body data (set by setHTTPBody:, above) are mutually exclusive
   /// - setting one will clear the other.
   objc.NSInputStream? get HTTPBodyStream {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_HTTPBodyStream);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_HTTPBodyStream);
     return _ret.address == 0
         ? null
         : objc.NSInputStream.castFromPointer(_ret, retain: true, release: true);
@@ -45199,7 +46187,7 @@
   /// and the body data (set by setHTTPBody:, above) are mutually exclusive
   /// - setting one will clear the other.
   set HTTPBodyStream(objc.NSInputStream? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setHTTPBodyStream_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setHTTPBodyStream_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -45222,7 +46210,7 @@
   /// stored to the cookie manager by default.
   /// NOTE: In releases prior to 10.3, this value is ignored
   set HTTPShouldHandleCookies(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setHTTPShouldHandleCookies_, value);
   }
 
@@ -45261,7 +46249,7 @@
   /// pipelining (disconnecting, sending resources misordered, omitting part of
   /// a resource, etc.).
   set HTTPShouldUsePipelining(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setHTTPShouldUsePipelining_, value);
   }
 }
@@ -45315,6 +46303,8 @@
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_setRequiresDNSSECValidation_ =
     objc.registerName("setRequiresDNSSECValidation:");
+late final _sel_setAllowsPersistentDNS_ =
+    objc.registerName("setAllowsPersistentDNS:");
 
 /// !
 /// @class NSMutableURLRequest
@@ -45360,14 +46350,14 @@
 
   /// Returns whether [obj] is an instance of [NSMutableURLRequest].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSMutableURLRequest);
   }
 
   /// !
   /// @abstract The URL of the receiver.
   objc.NSURL? get URL {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_URL);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_URL);
     return _ret.address == 0
         ? null
         : objc.NSURL.castFromPointer(_ret, retain: true, release: true);
@@ -45376,7 +46366,7 @@
   /// !
   /// @abstract The URL of the receiver.
   set URL(objc.NSURL? value) {
-    return _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setURL_, value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -45390,8 +46380,7 @@
   /// !
   /// @abstract The cache policy of the receiver.
   set cachePolicy(NSURLRequestCachePolicy value) {
-    return _objc_msgSend_1yjxuv2(
-        this.ref.pointer, _sel_setCachePolicy_, value.value);
+    _objc_msgSend_1yjxuv2(this.ref.pointer, _sel_setCachePolicy_, value.value);
   }
 
   /// !
@@ -45425,8 +46414,7 @@
   /// is considered to have timed out. This timeout interval is measured
   /// in seconds.
   set timeoutInterval(DartNSTimeInterval value) {
-    return _objc_msgSend_hwm8nu(
-        this.ref.pointer, _sel_setTimeoutInterval_, value);
+    _objc_msgSend_hwm8nu(this.ref.pointer, _sel_setTimeoutInterval_, value);
   }
 
   /// !
@@ -45439,7 +46427,7 @@
   /// as a sub-resource of a user-specified URL, and possibly other things
   /// in the future.
   objc.NSURL? get mainDocumentURL {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_mainDocumentURL);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_mainDocumentURL);
     return _ret.address == 0
         ? null
         : objc.NSURL.castFromPointer(_ret, retain: true, release: true);
@@ -45455,7 +46443,7 @@
   /// as a sub-resource of a user-specified URL, and possibly other things
   /// in the future.
   set mainDocumentURL(objc.NSURL? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setMainDocumentURL_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setMainDocumentURL_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -45474,7 +46462,7 @@
   /// @discussion This method is used to provide the network layers with a hint as to the purpose
   /// of the request.  Most clients should not need to use this method.
   set networkServiceType(NSURLRequestNetworkServiceType value) {
-    return _objc_msgSend_1mse4s1(
+    _objc_msgSend_1mse4s1(
         this.ref.pointer, _sel_setNetworkServiceType_, value.value);
   }
 
@@ -45493,7 +46481,7 @@
   /// @discussion NO if the receiver should not be allowed to use the built in
   /// cellular radios to satisfy the request, YES otherwise.  The default is YES.
   set allowsCellularAccess(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setAllowsCellularAccess_, value);
   }
 
@@ -45513,7 +46501,7 @@
   /// @discussion NO if the receiver should not be allowed to use an interface marked as expensive to
   /// satisfy the request, YES otherwise.
   set allowsExpensiveNetworkAccess(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setAllowsExpensiveNetworkAccess_, value);
   }
 
@@ -45533,7 +46521,7 @@
   /// @discussion NO if the receiver should not be allowed to use an interface marked as constrained to
   /// satisfy the request, YES otherwise.
   set allowsConstrainedNetworkAccess(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setAllowsConstrainedNetworkAccess_, value);
   }
 
@@ -45552,7 +46540,7 @@
   /// @result YES if server endpoint is known to support HTTP/3. Defaults to NO.
   /// The default may be YES in a future OS update.
   set assumesHTTP3Capable(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setAssumesHTTP3Capable_, value);
   }
 
@@ -45570,8 +46558,7 @@
   /// @discussion Set to NSURLRequestAttributionUser if the URL was specified by the
   /// user. Defaults to NSURLRequestAttributionDeveloper.
   set attribution(NSURLRequestAttribution value) {
-    return _objc_msgSend_1nw1jep(
-        this.ref.pointer, _sel_setAttribution_, value.value);
+    _objc_msgSend_1nw1jep(this.ref.pointer, _sel_setAttribution_, value.value);
   }
 
   /// !
@@ -45588,11 +46575,32 @@
   /// @discussion YES, if the DNS lookup for this request should require DNSSEC validation,
   /// No otherwise. Defaults to NO.
   set requiresDNSSECValidation(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setRequiresDNSSECValidation_, value);
   }
 
   /// !
+  /// @abstract Allows storing and usage of DNS answers, potentially beyond TTL expiry,
+  /// in a persistent per-process cache. This should only be set for hostnames whose resolutions
+  /// are not expected to change across networks.
+  /// @discussion YES, if the DNS lookup for this request is allowed to use a persistent per-process cache,
+  /// NO otherwise. Defaults to NO.
+  bool get allowsPersistentDNS {
+    return _objc_msgSend_91o635(this.ref.pointer, _sel_allowsPersistentDNS);
+  }
+
+  /// !
+  /// @abstract Allows storing and usage of DNS answers, potentially beyond TTL expiry,
+  /// in a persistent per-process cache. This should only be set for hostnames whose resolutions
+  /// are not expected to change across networks.
+  /// @discussion YES, if the DNS lookup for this request is allowed to use a persistent per-process cache,
+  /// NO otherwise. Defaults to NO.
+  set allowsPersistentDNS(bool value) {
+    _objc_msgSend_1s56lr9(
+        this.ref.pointer, _sel_setAllowsPersistentDNS_, value);
+  }
+
+  /// !
   /// @method requestWithURL:
   /// @abstract Allocates and initializes an NSURLRequest with the given
   /// URL.
@@ -45602,7 +46610,7 @@
   /// @param URL The URL for the request.
   /// @result A newly-created and autoreleased NSURLRequest instance.
   static NSMutableURLRequest requestWithURL_(objc.NSURL URL) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSMutableURLRequest, _sel_requestWithURL_, URL.ref.pointer);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: true, release: true);
@@ -45628,7 +46636,7 @@
       objc.NSURL URL,
       NSURLRequestCachePolicy cachePolicy,
       DartNSTimeInterval timeoutInterval) {
-    final _ret = _objc_msgSend_3phu9v(
+    final _ret = _objc_msgSend_1ajs603(
         _class_NSMutableURLRequest,
         _sel_requestWithURL_cachePolicy_timeoutInterval_,
         URL.ref.pointer,
@@ -45647,7 +46655,7 @@
   /// @param URL The URL for the request.
   /// @result An initialized NSURLRequest.
   NSMutableURLRequest initWithURL_(objc.NSURL URL) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.retainAndReturnPointer(), _sel_initWithURL_, URL.ref.pointer);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: false, release: true);
@@ -45667,7 +46675,7 @@
   /// @result An initialized NSURLRequest.
   NSMutableURLRequest initWithURL_cachePolicy_timeoutInterval_(objc.NSURL URL,
       NSURLRequestCachePolicy cachePolicy, DartNSTimeInterval timeoutInterval) {
-    final _ret = _objc_msgSend_3phu9v(
+    final _ret = _objc_msgSend_1ajs603(
         this.ref.retainAndReturnPointer(),
         _sel_initWithURL_cachePolicy_timeoutInterval_,
         URL.ref.pointer,
@@ -45680,21 +46688,21 @@
   /// init
   NSMutableURLRequest init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// new
   static NSMutableURLRequest new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSMutableURLRequest, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSMutableURLRequest, _sel_new);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSMutableURLRequest allocWithZone_(ffi.Pointer<_NSZone> zone) {
-    final _ret = _objc_msgSend_hzlb60(
+    final _ret = _objc_msgSend_1cwp428(
         _class_NSMutableURLRequest, _sel_allocWithZone_, zone);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: false, release: true);
@@ -45702,35 +46710,35 @@
 
   /// alloc
   static NSMutableURLRequest alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSMutableURLRequest, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSMutableURLRequest, _sel_alloc);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// self
   NSMutableURLRequest self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// retain
   NSMutableURLRequest retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// autorelease
   NSMutableURLRequest autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSMutableURLRequest.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// initWithCoder:
   NSMutableURLRequest? initWithCoder_(objc.NSCoder coder) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithCoder_, coder.ref.pointer);
     return _ret.address == 0
         ? null
@@ -45784,7 +46792,7 @@
 late final _sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_ =
     objc.registerName(
         "initWithURL:MIMEType:expectedContentLength:textEncodingName:");
-final _objc_msgSend_13tl325 = objc.msgSendPointer
+final _objc_msgSend_l9ppnx = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -45833,7 +46841,7 @@
 
   /// Returns whether [obj] is an instance of [NSURLResponse].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSURLResponse);
   }
 
@@ -45851,7 +46859,7 @@
       objc.NSString? MIMEType,
       DartNSInteger length,
       objc.NSString? name) {
-    final _ret = _objc_msgSend_13tl325(
+    final _ret = _objc_msgSend_l9ppnx(
         this.ref.retainAndReturnPointer(),
         _sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_,
         URL.ref.pointer,
@@ -45865,7 +46873,7 @@
   /// @abstract Returns the URL of the receiver.
   /// @result The URL of the receiver.
   objc.NSURL? get URL {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_URL);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_URL);
     return _ret.address == 0
         ? null
         : objc.NSURL.castFromPointer(_ret, retain: true, release: true);
@@ -45881,7 +46889,7 @@
   /// be made if the origin source did not report any such information.
   /// @result The MIME type of the receiver.
   objc.NSString? get MIMEType {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_MIMEType);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_MIMEType);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -45912,7 +46920,7 @@
   /// @result The name of the text encoding of the receiver, or nil if no
   /// text encoding was specified.
   objc.NSString? get textEncodingName {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_textEncodingName);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_textEncodingName);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -45930,7 +46938,7 @@
   /// @result A suggested filename to use if saving the resource to disk.
   objc.NSString? get suggestedFilename {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_suggestedFilename);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_suggestedFilename);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -45939,44 +46947,44 @@
   /// init
   NSURLResponse init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLResponse.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// new
   static NSURLResponse new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLResponse, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLResponse, _sel_new);
     return NSURLResponse.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSURLResponse allocWithZone_(ffi.Pointer<_NSZone> zone) {
     final _ret =
-        _objc_msgSend_hzlb60(_class_NSURLResponse, _sel_allocWithZone_, zone);
+        _objc_msgSend_1cwp428(_class_NSURLResponse, _sel_allocWithZone_, zone);
     return NSURLResponse.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// alloc
   static NSURLResponse alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLResponse, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLResponse, _sel_alloc);
     return NSURLResponse.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// self
   NSURLResponse self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLResponse.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// retain
   NSURLResponse retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLResponse.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// autorelease
   NSURLResponse autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLResponse.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -45988,13 +46996,13 @@
 
   /// encodeWithCoder:
   void encodeWithCoder_(objc.NSCoder coder) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_encodeWithCoder_, coder.ref.pointer);
   }
 
   /// initWithCoder:
   NSURLResponse? initWithCoder_(objc.NSCoder coder) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithCoder_, coder.ref.pointer);
     return _ret.address == 0
         ? null
@@ -46236,7 +47244,7 @@
 
   /// Returns whether [obj] is an instance of [NSURLSessionTask].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSURLSessionTask);
   }
 
@@ -46247,7 +47255,7 @@
 
   /// may be nil if this is a stream task
   NSURLRequest? get originalRequest {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_originalRequest);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_originalRequest);
     return _ret.address == 0
         ? null
         : NSURLRequest.castFromPointer(_ret, retain: true, release: true);
@@ -46255,7 +47263,7 @@
 
   /// may differ from originalRequest due to http server redirection
   NSURLRequest? get currentRequest {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_currentRequest);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_currentRequest);
     return _ret.address == 0
         ? null
         : NSURLRequest.castFromPointer(_ret, retain: true, release: true);
@@ -46263,7 +47271,7 @@
 
   /// may be nil if no response has been received
   NSURLResponse? get response {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_response);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_response);
     return _ret.address == 0
         ? null
         : NSURLResponse.castFromPointer(_ret, retain: true, release: true);
@@ -46277,7 +47285,7 @@
   /// Delegate is strongly referenced until the task completes, after which it is
   /// reset to `nil`.
   objc.ObjCObjectBase? get delegate {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_delegate);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_delegate);
     return _ret.address == 0
         ? null
         : objc.ObjCObjectBase(_ret, retain: true, release: true);
@@ -46291,13 +47299,13 @@
   /// Delegate is strongly referenced until the task completes, after which it is
   /// reset to `nil`.
   set delegate(objc.ObjCObjectBase? value) {
-    return _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setDelegate_, value?.ref.pointer ?? ffi.nullptr);
   }
 
   /// progress
   NSProgress get progress {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_progress);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_progress);
     return NSProgress.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -46308,7 +47316,7 @@
   /// effect for tasks created from other session types.
   objc.NSDate? get earliestBeginDate {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_earliestBeginDate);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_earliestBeginDate);
     return _ret.address == 0
         ? null
         : objc.NSDate.castFromPointer(_ret, retain: true, release: true);
@@ -46320,7 +47328,7 @@
   /// Only applies to tasks created from background NSURLSession instances; has no
   /// effect for tasks created from other session types.
   set earliestBeginDate(objc.NSDate? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setEarliestBeginDate_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setEarliestBeginDate_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -46336,7 +47344,7 @@
   /// be sent and received by this task. These values are used by system scheduling
   /// policy. If unspecified, NSURLSessionTransferSizeUnknown is used.
   set countOfBytesClientExpectsToSend(int value) {
-    return _objc_msgSend_17gvxvj(
+    _objc_msgSend_17gvxvj(
         this.ref.pointer, _sel_setCountOfBytesClientExpectsToSend_, value);
   }
 
@@ -46348,7 +47356,7 @@
 
   /// setCountOfBytesClientExpectsToReceive:
   set countOfBytesClientExpectsToReceive(int value) {
-    return _objc_msgSend_17gvxvj(
+    _objc_msgSend_17gvxvj(
         this.ref.pointer, _sel_setCountOfBytesClientExpectsToReceive_, value);
   }
 
@@ -46377,7 +47385,7 @@
   /// The taskDescription property is available for the developer to
   /// provide a descriptive label for the task.
   objc.NSString? get taskDescription {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_taskDescription);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_taskDescription);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -46386,7 +47394,7 @@
   /// The taskDescription property is available for the developer to
   /// provide a descriptive label for the task.
   set taskDescription(objc.NSString? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setTaskDescription_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setTaskDescription_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -46408,7 +47416,7 @@
   /// The error, if any, delivered via -URLSession:task:didCompleteWithError:
   /// This property will be nil in the event that no error occurred.
   objc.NSError? get error {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_error);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_error);
     return _ret.address == 0
         ? null
         : objc.NSError.castFromPointer(_ret, retain: true, release: true);
@@ -46463,7 +47471,7 @@
   /// priority levels are provided: NSURLSessionTaskPriorityLow and
   /// NSURLSessionTaskPriorityHigh, but use is not restricted to these.
   set priority(double value) {
-    return _objc_msgSend_v5hmet(this.ref.pointer, _sel_setPriority_, value);
+    _objc_msgSend_v5hmet(this.ref.pointer, _sel_setPriority_, value);
   }
 
   /// Provides a hint indicating if incremental delivery of a partial response body
@@ -46488,51 +47496,51 @@
   /// Defaults to true unless this task is created with completion-handler based
   /// convenience methods, or if it is a download task.
   set prefersIncrementalDelivery(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setPrefersIncrementalDelivery_, value);
   }
 
   /// init
   NSURLSessionTask init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLSessionTask.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// new
   static NSURLSessionTask new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLSessionTask, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLSessionTask, _sel_new);
     return NSURLSessionTask.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSURLSessionTask allocWithZone_(ffi.Pointer<_NSZone> zone) {
-    final _ret = _objc_msgSend_hzlb60(
+    final _ret = _objc_msgSend_1cwp428(
         _class_NSURLSessionTask, _sel_allocWithZone_, zone);
     return NSURLSessionTask.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// alloc
   static NSURLSessionTask alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLSessionTask, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLSessionTask, _sel_alloc);
     return NSURLSessionTask.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// self
   NSURLSessionTask self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLSessionTask.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// retain
   NSURLSessionTask retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLSessionTask.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// autorelease
   NSURLSessionTask autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLSessionTask.castFromPointer(_ret, retain: true, release: true);
   }
 }
@@ -46579,6 +47587,39 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_objcObjCObject_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_objcObjCObject_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_objcObjCObject_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_objcObjCObject_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?)>`.
 abstract final class ObjCBlock_ffiVoid_objcObjCObject {
@@ -46641,13 +47682,47 @@
         (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
             ? null
             : objc.ObjCObjectBase(arg0, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?)>(
         wrapper,
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?)>
+      blocking(void Function(objc.ObjCObjectBase?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_blockingCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : objc.ObjCObjectBase(arg0, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : objc.ObjCObjectBase(arg0, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?)>`.
@@ -46672,7 +47747,7 @@
   /// storeCookies:forTask:
   void storeCookies_forTask_(
       objc.ObjCObjectBase cookies, NSURLSessionTask task) {
-    _objc_msgSend_wjvic9(this.ref.pointer, _sel_storeCookies_forTask_,
+    _objc_msgSend_pfv6jd(this.ref.pointer, _sel_storeCookies_forTask_,
         cookies.ref.pointer, task.ref.pointer);
   }
 
@@ -46681,7 +47756,7 @@
       NSURLSessionTask task,
       objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?)>
           completionHandler) {
-    _objc_msgSend_14pxqbs(
+    _objc_msgSend_o762yo(
         this.ref.pointer,
         _sel_getCookiesForTask_completionHandler_,
         task.ref.pointer,
@@ -46696,7 +47771,7 @@
 extension NSExtendedEnumerator on objc.NSEnumerator {
   /// allObjects
   objc.ObjCObjectBase get allObjects {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_allObjects);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_allObjects);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
 }
@@ -46709,7 +47784,7 @@
     objc.registerName("descriptionInStringsFileFormat");
 late final _sel_descriptionWithLocale_indent_ =
     objc.registerName("descriptionWithLocale:indent:");
-final _objc_msgSend_dcd68g = objc.msgSendPointer
+final _objc_msgSend_1k4kd9s = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -46729,7 +47804,7 @@
 late final _sel_objectsForKeys_notFoundMarker_ =
     objc.registerName("objectsForKeys:notFoundMarker:");
 late final _sel_writeToURL_error_ = objc.registerName("writeToURL:error:");
-final _objc_msgSend_blqzg8 = objc.msgSendPointer
+final _objc_msgSend_l9p60w = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Bool Function(
@@ -46745,7 +47820,7 @@
             ffi.Pointer<ffi.Pointer<objc.ObjCObject>>)>();
 late final _sel_keysSortedByValueUsingSelector_ =
     objc.registerName("keysSortedByValueUsingSelector:");
-final _objc_msgSend_19hbqky = objc.msgSendPointer
+final _objc_msgSend_3ctkt6 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -46844,6 +47919,56 @@
                 ffi.Pointer<ffi.Bool>)>.listener(
         _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1,
+    ffi.Pointer<ffi.Bool> arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Bool>))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<ffi.Bool>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<ffi.Bool>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<ffi.Bool>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<ffi.Bool>)>.listener(
+        _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Bool>)>`.
 abstract final class ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool {
@@ -46917,7 +48042,7 @@
                 ffi.Pointer<ffi.Bool> arg2) =>
             fn(objc.ObjCObjectBase(arg0, retain: false, release: true),
                 objc.ObjCObjectBase(arg1, retain: false, release: true), arg2));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1krhfwz(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1o83rbn(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -46925,6 +48050,48 @@
             ffi.Pointer<objc.ObjCObject>,
             ffi.Pointer<ffi.Bool>)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<objc.ObjCObject>,
+          ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Bool>)> blocking(
+      void Function(
+              objc.ObjCObjectBase, objc.ObjCObjectBase, ffi.Pointer<ffi.Bool>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<ffi.Bool> arg2) =>
+            fn(objc.ObjCObjectBase(arg0, retain: false, release: true),
+                objc.ObjCObjectBase(arg1, retain: false, release: true), arg2));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_bool_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<ffi.Bool> arg2) =>
+            fn(objc.ObjCObjectBase(arg0, retain: false, release: true),
+                objc.ObjCObjectBase(arg1, retain: false, release: true), arg2));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1o83rbn, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<ffi.Bool>)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Bool>)>`.
@@ -46981,7 +48148,7 @@
             ffi.Pointer<objc.ObjCBlockImpl>)>();
 late final _sel_keysSortedByValueUsingComparator_ =
     objc.registerName("keysSortedByValueUsingComparator:");
-final _objc_msgSend_cy99le = objc.msgSendPointer
+final _objc_msgSend_nnxkei = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -46993,7 +48160,7 @@
             ffi.Pointer<objc.ObjCSelector>, ffi.Pointer<objc.ObjCBlockImpl>)>();
 late final _sel_keysSortedByValueWithOptions_usingComparator_ =
     objc.registerName("keysSortedByValueWithOptions:usingComparator:");
-final _objc_msgSend_1u2b7ut = objc.msgSendPointer
+final _objc_msgSend_1x5ew3h = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -47132,7 +48299,7 @@
     objc.registerName("keysOfEntriesPassingTest:");
 late final _sel_keysOfEntriesWithOptions_passingTest_ =
     objc.registerName("keysOfEntriesWithOptions:passingTest:");
-final _objc_msgSend_hd4f96 = objc.msgSendPointer
+final _objc_msgSend_13x5boi = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -47151,39 +48318,39 @@
 extension NSExtendedDictionary on objc.NSDictionary {
   /// allKeys
   objc.ObjCObjectBase get allKeys {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_allKeys);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_allKeys);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
 
   /// allKeysForObject:
   objc.ObjCObjectBase allKeysForObject_(objc.ObjCObjectBase anObject) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_allKeysForObject_, anObject.ref.pointer);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
 
   /// allValues
   objc.ObjCObjectBase get allValues {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_allValues);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_allValues);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
 
   /// description
   objc.NSString get description {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_description);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_description);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// descriptionInStringsFileFormat
   objc.NSString get descriptionInStringsFileFormat {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_descriptionInStringsFileFormat);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// descriptionWithLocale:
   objc.NSString descriptionWithLocale_(objc.ObjCObjectBase? locale) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_descriptionWithLocale_, locale?.ref.pointer ?? ffi.nullptr);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -47191,7 +48358,7 @@
   /// descriptionWithLocale:indent:
   objc.NSString descriptionWithLocale_indent_(
       objc.ObjCObjectBase? locale, DartNSUInteger level) {
-    final _ret = _objc_msgSend_dcd68g(
+    final _ret = _objc_msgSend_1k4kd9s(
         this.ref.pointer,
         _sel_descriptionWithLocale_indent_,
         locale?.ref.pointer ?? ffi.nullptr,
@@ -47201,20 +48368,20 @@
 
   /// isEqualToDictionary:
   bool isEqualToDictionary_(objc.NSDictionary otherDictionary) {
-    return _objc_msgSend_69e0x1(this.ref.pointer, _sel_isEqualToDictionary_,
+    return _objc_msgSend_19nvye5(this.ref.pointer, _sel_isEqualToDictionary_,
         otherDictionary.ref.pointer);
   }
 
   /// objectEnumerator
   objc.NSEnumerator objectEnumerator() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_objectEnumerator);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_objectEnumerator);
     return objc.NSEnumerator.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// objectsForKeys:notFoundMarker:
   objc.ObjCObjectBase objectsForKeys_notFoundMarker_(
       objc.ObjCObjectBase keys, objc.ObjCObjectBase marker) {
-    final _ret = _objc_msgSend_rsfdlh(
+    final _ret = _objc_msgSend_15qeuct(
         this.ref.pointer,
         _sel_objectsForKeys_notFoundMarker_,
         keys.ref.pointer,
@@ -47225,14 +48392,14 @@
   /// writeToURL:error:
   bool writeToURL_error_(
       objc.NSURL url, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    return _objc_msgSend_blqzg8(
+    return _objc_msgSend_l9p60w(
         this.ref.pointer, _sel_writeToURL_error_, url.ref.pointer, error);
   }
 
   /// keysSortedByValueUsingSelector:
   objc.ObjCObjectBase keysSortedByValueUsingSelector_(
       ffi.Pointer<objc.ObjCSelector> comparator) {
-    final _ret = _objc_msgSend_19hbqky(
+    final _ret = _objc_msgSend_3ctkt6(
         this.ref.pointer, _sel_keysSortedByValueUsingSelector_, comparator);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
@@ -47248,7 +48415,7 @@
 
   /// objectForKeyedSubscript:
   objc.ObjCObjectBase? objectForKeyedSubscript_(objc.ObjCObjectBase key) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_objectForKeyedSubscript_, key.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47282,7 +48449,7 @@
   /// keysSortedByValueUsingComparator:
   objc.ObjCObjectBase keysSortedByValueUsingComparator_(
       DartNSComparator cmptr) {
-    final _ret = _objc_msgSend_cy99le(this.ref.pointer,
+    final _ret = _objc_msgSend_nnxkei(this.ref.pointer,
         _sel_keysSortedByValueUsingComparator_, cmptr.ref.pointer);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
@@ -47290,7 +48457,7 @@
   /// keysSortedByValueWithOptions:usingComparator:
   objc.ObjCObjectBase keysSortedByValueWithOptions_usingComparator_(
       objc.NSSortOptions opts, DartNSComparator cmptr) {
-    final _ret = _objc_msgSend_1u2b7ut(
+    final _ret = _objc_msgSend_1x5ew3h(
         this.ref.pointer,
         _sel_keysSortedByValueWithOptions_usingComparator_,
         opts.value,
@@ -47304,7 +48471,7 @@
               ffi.Bool Function(ffi.Pointer<objc.ObjCObject>,
                   ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Bool>)>
           predicate) {
-    final _ret = _objc_msgSend_cy99le(this.ref.pointer,
+    final _ret = _objc_msgSend_nnxkei(this.ref.pointer,
         _sel_keysOfEntriesPassingTest_, predicate.ref.pointer);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
@@ -47316,7 +48483,7 @@
               ffi.Bool Function(ffi.Pointer<objc.ObjCObject>,
                   ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Bool>)>
           predicate) {
-    final _ret = _objc_msgSend_hd4f96(
+    final _ret = _objc_msgSend_13x5boi(
         this.ref.pointer,
         _sel_keysOfEntriesWithOptions_passingTest_,
         opts.value,
@@ -47350,7 +48517,7 @@
     objc.registerName("initWithContentsOfURL:");
 late final _sel_writeToFile_atomically_ =
     objc.registerName("writeToFile:atomically:");
-final _objc_msgSend_w8pbfh = objc.msgSendPointer
+final _objc_msgSend_1iyq28l = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Bool Function(
@@ -47378,7 +48545,7 @@
 
   /// dictionaryWithContentsOfFile:
   static objc.NSDictionary? dictionaryWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSDictionary,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSDictionary,
         _sel_dictionaryWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47387,7 +48554,7 @@
 
   /// dictionaryWithContentsOfURL:
   static objc.NSDictionary? dictionaryWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSDictionary,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSDictionary,
         _sel_dictionaryWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47396,7 +48563,7 @@
 
   /// initWithContentsOfFile:
   objc.NSDictionary? initWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47405,7 +48572,7 @@
 
   /// initWithContentsOfURL:
   objc.NSDictionary? initWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47414,13 +48581,13 @@
 
   /// writeToFile:atomically:
   bool writeToFile_atomically_(objc.NSString path, bool useAuxiliaryFile) {
-    return _objc_msgSend_w8pbfh(this.ref.pointer, _sel_writeToFile_atomically_,
+    return _objc_msgSend_1iyq28l(this.ref.pointer, _sel_writeToFile_atomically_,
         path.ref.pointer, useAuxiliaryFile);
   }
 
   /// writeToURL:atomically:
   bool writeToURL_atomically_(objc.NSURL url, bool atomically) {
-    return _objc_msgSend_w8pbfh(this.ref.pointer, _sel_writeToURL_atomically_,
+    return _objc_msgSend_1iyq28l(this.ref.pointer, _sel_writeToURL_atomically_,
         url.ref.pointer, atomically);
   }
 }
@@ -47430,7 +48597,7 @@
     objc.registerName("dictionaryWithObject:forKey:");
 late final _sel_dictionaryWithObjects_forKeys_count_ =
     objc.registerName("dictionaryWithObjects:forKeys:count:");
-final _objc_msgSend_cfqbni = objc.msgSendPointer
+final _objc_msgSend_1dydpdi = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -47457,7 +48624,7 @@
 late final _sel_initWithDictionary_ = objc.registerName("initWithDictionary:");
 late final _sel_initWithDictionary_copyItems_ =
     objc.registerName("initWithDictionary:copyItems:");
-final _objc_msgSend_1bdmr5f = objc.msgSendPointer
+final _objc_msgSend_17amj0z = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -47475,7 +48642,7 @@
     objc.registerName("initWithObjects:forKeys:");
 late final _sel_initWithContentsOfURL_error_ =
     objc.registerName("initWithContentsOfURL:error:");
-final _objc_msgSend_1705co6 = objc.msgSendPointer
+final _objc_msgSend_1lhpu4m = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -47496,14 +48663,14 @@
 extension NSDictionaryCreation on objc.NSDictionary {
   /// dictionary
   static objc.NSDictionary dictionary() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSDictionary, _sel_dictionary);
+    final _ret = _objc_msgSend_151sglz(_class_NSDictionary, _sel_dictionary);
     return objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// dictionaryWithObject:forKey:
   static objc.NSDictionary dictionaryWithObject_forKey_(
       objc.ObjCObjectBase object, objc.ObjCObjectBase key) {
-    final _ret = _objc_msgSend_rsfdlh(_class_NSDictionary,
+    final _ret = _objc_msgSend_15qeuct(_class_NSDictionary,
         _sel_dictionaryWithObject_forKey_, object.ref.pointer, key.ref.pointer);
     return objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
   }
@@ -47513,7 +48680,7 @@
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> objects,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> keys,
       DartNSUInteger cnt) {
-    final _ret = _objc_msgSend_cfqbni(_class_NSDictionary,
+    final _ret = _objc_msgSend_1dydpdi(_class_NSDictionary,
         _sel_dictionaryWithObjects_forKeys_count_, objects, keys, cnt);
     return objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
   }
@@ -47521,14 +48688,14 @@
   /// dictionaryWithObjectsAndKeys:
   static objc.NSDictionary dictionaryWithObjectsAndKeys_(
       objc.ObjCObjectBase firstObject) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSDictionary,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSDictionary,
         _sel_dictionaryWithObjectsAndKeys_, firstObject.ref.pointer);
     return objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// dictionaryWithDictionary:
   static objc.NSDictionary dictionaryWithDictionary_(objc.NSDictionary dict) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSDictionary, _sel_dictionaryWithDictionary_, dict.ref.pointer);
     return objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
   }
@@ -47536,7 +48703,7 @@
   /// dictionaryWithObjects:forKeys:
   static objc.NSDictionary dictionaryWithObjects_forKeys_(
       objc.ObjCObjectBase objects, objc.ObjCObjectBase keys) {
-    final _ret = _objc_msgSend_rsfdlh(
+    final _ret = _objc_msgSend_15qeuct(
         _class_NSDictionary,
         _sel_dictionaryWithObjects_forKeys_,
         objects.ref.pointer,
@@ -47546,7 +48713,7 @@
 
   /// initWithObjectsAndKeys:
   objc.NSDictionary initWithObjectsAndKeys_(objc.ObjCObjectBase firstObject) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithObjectsAndKeys_, firstObject.ref.pointer);
     return objc.NSDictionary.castFromPointer(_ret,
         retain: false, release: true);
@@ -47554,7 +48721,7 @@
 
   /// initWithDictionary:
   objc.NSDictionary initWithDictionary_(objc.NSDictionary otherDictionary) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithDictionary_, otherDictionary.ref.pointer);
     return objc.NSDictionary.castFromPointer(_ret,
         retain: false, release: true);
@@ -47563,7 +48730,7 @@
   /// initWithDictionary:copyItems:
   objc.NSDictionary initWithDictionary_copyItems_(
       objc.NSDictionary otherDictionary, bool flag) {
-    final _ret = _objc_msgSend_1bdmr5f(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_17amj0z(this.ref.retainAndReturnPointer(),
         _sel_initWithDictionary_copyItems_, otherDictionary.ref.pointer, flag);
     return objc.NSDictionary.castFromPointer(_ret,
         retain: false, release: true);
@@ -47572,7 +48739,7 @@
   /// initWithObjects:forKeys:
   objc.NSDictionary initWithObjects_forKeys_(
       objc.ObjCObjectBase objects, objc.ObjCObjectBase keys) {
-    final _ret = _objc_msgSend_rsfdlh(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_15qeuct(this.ref.retainAndReturnPointer(),
         _sel_initWithObjects_forKeys_, objects.ref.pointer, keys.ref.pointer);
     return objc.NSDictionary.castFromPointer(_ret,
         retain: false, release: true);
@@ -47581,7 +48748,7 @@
   /// initWithContentsOfURL:error:
   objc.NSDictionary? initWithContentsOfURL_error_(
       objc.NSURL url, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1705co6(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1lhpu4m(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_error_, url.ref.pointer, error);
     return _ret.address == 0
         ? null
@@ -47591,7 +48758,7 @@
   /// dictionaryWithContentsOfURL:error:
   static objc.NSDictionary? dictionaryWithContentsOfURL_error_(
       objc.NSURL url, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1705co6(_class_NSDictionary,
+    final _ret = _objc_msgSend_1lhpu4m(_class_NSDictionary,
         _sel_dictionaryWithContentsOfURL_error_, url.ref.pointer, error);
     return _ret.address == 0
         ? null
@@ -47613,7 +48780,7 @@
 extension NSExtendedMutableDictionary on objc.NSMutableDictionary {
   /// addEntriesFromDictionary:
   void addEntriesFromDictionary_(objc.NSDictionary otherDictionary) {
-    _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_addEntriesFromDictionary_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_addEntriesFromDictionary_,
         otherDictionary.ref.pointer);
   }
 
@@ -47624,27 +48791,27 @@
 
   /// removeObjectsForKeys:
   void removeObjectsForKeys_(objc.ObjCObjectBase keyArray) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_removeObjectsForKeys_, keyArray.ref.pointer);
   }
 
   /// setDictionary:
   void setDictionary_(objc.NSDictionary otherDictionary) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setDictionary_, otherDictionary.ref.pointer);
   }
 
   /// setObject:forKeyedSubscript:
   void setObject_forKeyedSubscript_(
       objc.ObjCObjectBase? obj, objc.ObjCObjectBase key) {
-    _objc_msgSend_wjvic9(this.ref.pointer, _sel_setObject_forKeyedSubscript_,
+    _objc_msgSend_pfv6jd(this.ref.pointer, _sel_setObject_forKeyedSubscript_,
         obj?.ref.pointer ?? ffi.nullptr, key.ref.pointer);
   }
 }
 
 late final _sel_dictionaryWithCapacity_ =
     objc.registerName("dictionaryWithCapacity:");
-final _objc_msgSend_1qrcblu = objc.msgSendPointer
+final _objc_msgSend_14hpxwa = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -47658,7 +48825,7 @@
   /// dictionaryWithCapacity:
   static objc.NSMutableDictionary dictionaryWithCapacity_(
       DartNSUInteger numItems) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         _class_NSMutableDictionary, _sel_dictionaryWithCapacity_, numItems);
     return objc.NSMutableDictionary.castFromPointer(_ret,
         retain: true, release: true);
@@ -47667,7 +48834,7 @@
   /// dictionaryWithContentsOfFile:
   static objc.NSMutableDictionary? dictionaryWithContentsOfFile_(
       objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSMutableDictionary,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSMutableDictionary,
         _sel_dictionaryWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47678,7 +48845,7 @@
   /// dictionaryWithContentsOfURL:
   static objc.NSMutableDictionary? dictionaryWithContentsOfURL_(
       objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSMutableDictionary,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSMutableDictionary,
         _sel_dictionaryWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47688,7 +48855,7 @@
 
   /// initWithContentsOfFile:
   objc.NSMutableDictionary? initWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47698,7 +48865,7 @@
 
   /// initWithContentsOfURL:
   objc.NSMutableDictionary? initWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -47714,7 +48881,7 @@
 extension NSSharedKeySetDictionary on objc.NSDictionary {
   /// sharedKeySetForKeys:
   static objc.ObjCObjectBase sharedKeySetForKeys_(objc.ObjCObjectBase keys) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSDictionary, _sel_sharedKeySetForKeys_, keys.ref.pointer);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
@@ -47728,7 +48895,7 @@
   /// dictionaryWithSharedKeySet:
   static objc.NSMutableDictionary dictionaryWithSharedKeySet_(
       objc.ObjCObjectBase keyset) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSMutableDictionary,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSMutableDictionary,
         _sel_dictionaryWithSharedKeySet_, keyset.ref.pointer);
     return objc.NSMutableDictionary.castFromPointer(_ret,
         retain: true, release: true);
@@ -48187,8 +49354,6 @@
   external ffi.Pointer<UInt32> format;
 }
 
-typedef wint_t = __darwin_wint_t;
-
 final class _RuneEntry extends ffi.Struct {
   @__darwin_rune_t()
   external int __min;
@@ -48630,6 +49795,25 @@
 
 typedef CFBitVectorRef = ffi.Pointer<__CFBitVector>;
 typedef CFMutableBitVectorRef = ffi.Pointer<__CFBitVector>;
+
+@ffi.Packed(1)
+final class _OSUnalignedU16 extends ffi.Struct {
+  @ffi.Uint16()
+  external int __val;
+}
+
+@ffi.Packed(1)
+final class _OSUnalignedU32 extends ffi.Struct {
+  @ffi.Uint32()
+  external int __val;
+}
+
+@ffi.Packed(1)
+final class _OSUnalignedU64 extends ffi.Struct {
+  @ffi.Uint64()
+  external int __val;
+}
+
 typedef CFByteOrder = CFIndex;
 
 final class CFSwappedFloat32 extends ffi.Struct {
@@ -49013,7 +50197,8 @@
   kCFCalendarUnitQuarter(2048),
   kCFCalendarUnitWeekOfMonth(4096),
   kCFCalendarUnitWeekOfYear(8192),
-  kCFCalendarUnitYearForWeekOfYear(16384);
+  kCFCalendarUnitYearForWeekOfYear(16384),
+  kCFCalendarUnitDayOfYear(65536);
 
   final int value;
   const CFCalendarUnit(this.value);
@@ -49033,6 +50218,7 @@
         4096 => kCFCalendarUnitWeekOfMonth,
         8192 => kCFCalendarUnitWeekOfYear,
         16384 => kCFCalendarUnitYearForWeekOfYear,
+        65536 => kCFCalendarUnitDayOfYear,
         _ => throw ArgumentError("Unknown value for CFCalendarUnit: $value"),
       };
 }
@@ -49743,6 +50929,46 @@
                 CFRunLoopObserverRef, CFOptionFlags)>.listener(
         _ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        CFRunLoopObserverRef arg0,
+        int arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(CFRunLoopObserverRef, int))(
+        arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, CFRunLoopObserverRef, CFOptionFlags)>
+    _ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                CFRunLoopObserverRef,
+                CFOptionFlags)>.isolateLocal(
+        _ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, CFRunLoopObserverRef, CFOptionFlags)>
+    _ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                CFRunLoopObserverRef,
+                CFOptionFlags)>.listener(
+        _ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__CFRunLoopObserver>, CFOptionFlags)>`.
 abstract final class ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity {
@@ -49814,6 +51040,39 @@
         ffi.Void Function(ffi.Pointer<__CFRunLoopObserver>,
             CFOptionFlags)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+          ffi.Void Function(ffi.Pointer<__CFRunLoopObserver>, CFOptionFlags)>
+      blocking(void Function(CFRunLoopObserverRef, CFRunLoopActivity) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity_blockingCallable
+            .nativeFunction
+            .cast(),
+        (CFRunLoopObserverRef arg0, int arg1) =>
+            fn(arg0, CFRunLoopActivity.fromValue(arg1)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_CFRunLoopObserverRef_CFRunLoopActivity_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (CFRunLoopObserverRef arg0, int arg1) =>
+            fn(arg0, CFRunLoopActivity.fromValue(arg1)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_tg5tbv, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<__CFRunLoopObserver>,
+            CFOptionFlags)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__CFRunLoopObserver>, CFOptionFlags)>`.
@@ -49889,6 +51148,36 @@
                 ffi.Pointer<objc.ObjCBlockImpl>, CFRunLoopTimerRef)>.listener(
         _ObjCBlock_ffiVoid_CFRunLoopTimerRef_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_CFRunLoopTimerRef_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    CFRunLoopTimerRef arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(CFRunLoopTimerRef))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, CFRunLoopTimerRef)>
+    _ObjCBlock_ffiVoid_CFRunLoopTimerRef_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, CFRunLoopTimerRef)>.isolateLocal(
+        _ObjCBlock_ffiVoid_CFRunLoopTimerRef_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, CFRunLoopTimerRef)>
+    _ObjCBlock_ffiVoid_CFRunLoopTimerRef_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, CFRunLoopTimerRef)>.listener(
+        _ObjCBlock_ffiVoid_CFRunLoopTimerRef_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__CFRunLoopTimer>)>`.
 abstract final class ObjCBlock_ffiVoid_CFRunLoopTimerRef {
@@ -49952,6 +51241,36 @@
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__CFRunLoopTimer>)>
+      blocking(void Function(CFRunLoopTimerRef) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_CFRunLoopTimerRef_blockingCallable.nativeFunction
+            .cast(),
+        (CFRunLoopTimerRef arg0) => fn(arg0));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_CFRunLoopTimerRef_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (CFRunLoopTimerRef arg0) => fn(arg0));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1dqvvol, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__CFRunLoopTimer>)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__CFRunLoopTimer>)>`.
@@ -50461,6 +51780,36 @@
         ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
             ffi.Size)>.listener(_ObjCBlock_ffiVoid_ffiSize_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_ffiSize_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    int arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(int))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, ffi.Size)>
+    _ObjCBlock_ffiVoid_ffiSize_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Size)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiSize_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, ffi.Size)>
+    _ObjCBlock_ffiVoid_ffiSize_blockingListenerCallable = ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Size)>.listener(_ObjCBlock_ffiVoid_ffiSize_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Size)>`.
 abstract final class ObjCBlock_ffiVoid_ffiSize {
@@ -50518,6 +51867,32 @@
     return objc.ObjCBlock<ffi.Void Function(ffi.Size)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Size)> blocking(
+      void Function(int) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiSize_blockingCallable.nativeFunction.cast(),
+        (int arg0) => fn(arg0));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiSize_blockingListenerCallable.nativeFunction
+            .cast(),
+        (int arg0) => fn(arg0));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_6enxqz, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Size)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Size)>`.
@@ -50990,6 +52365,41 @@
                 ffi.Int)>.listener(
         _ObjCBlock_ffiVoid_dispatchdatat_ffiInt_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_dispatchdatat_ffiInt_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    dispatch_data_t arg0,
+    int arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(dispatch_data_t, int))(
+        arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+    ffi.Void Function(
+        ffi.Pointer<objc.ObjCBlockImpl>,
+        ffi.Pointer<ffi.Void>,
+        dispatch_data_t,
+        ffi.Int)> _ObjCBlock_ffiVoid_dispatchdatat_ffiInt_blockingCallable = ffi
+    .NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, dispatch_data_t, ffi.Int)>.isolateLocal(
+    _ObjCBlock_ffiVoid_dispatchdatat_ffiInt_blockingTrampoline)
+  ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, dispatch_data_t, ffi.Int)>
+    _ObjCBlock_ffiVoid_dispatchdatat_ffiInt_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, dispatch_data_t, ffi.Int)>.listener(
+        _ObjCBlock_ffiVoid_dispatchdatat_ffiInt_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, ffi.Int)>`.
 abstract final class ObjCBlock_ffiVoid_dispatchdatat_ffiInt {
@@ -51050,11 +52460,43 @@
         (dispatch_data_t arg0, int arg1) => fn(
             objc.NSObject.castFromPointer(arg0, retain: false, release: true),
             arg1));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_qxvyq2(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_18kzm6a(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSObject, ffi.Int)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSObject, ffi.Int)> blocking(
+      void Function(Dartdispatch_data_t, int) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_dispatchdatat_ffiInt_blockingCallable.nativeFunction
+            .cast(),
+        (dispatch_data_t arg0, int arg1) => fn(
+            objc.NSObject.castFromPointer(arg0, retain: false, release: true),
+            arg1));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_dispatchdatat_ffiInt_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (dispatch_data_t arg0, int arg1) => fn(
+            objc.NSObject.castFromPointer(arg0, retain: false, release: true),
+            arg1));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_18kzm6a, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSObject, ffi.Int)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, ffi.Int)>`.
@@ -51113,6 +52555,39 @@
                 ffi.Int)>.listener(
         _ObjCBlock_ffiVoid_dispatchdatat_ffiInt1_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_dispatchdatat_ffiInt1_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    dispatch_data_t arg0,
+    int arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(dispatch_data_t, int))(
+        arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, dispatch_data_t, ffi.Int)>
+    _ObjCBlock_ffiVoid_dispatchdatat_ffiInt1_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, dispatch_data_t, ffi.Int)>.isolateLocal(
+        _ObjCBlock_ffiVoid_dispatchdatat_ffiInt1_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, dispatch_data_t, ffi.Int)>
+    _ObjCBlock_ffiVoid_dispatchdatat_ffiInt1_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, dispatch_data_t, ffi.Int)>.listener(
+        _ObjCBlock_ffiVoid_dispatchdatat_ffiInt1_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject?, ffi.Int)>`.
 abstract final class ObjCBlock_ffiVoid_dispatchdatat_ffiInt1 {
@@ -51178,11 +52653,49 @@
                 : objc.NSObject.castFromPointer(arg0,
                     retain: false, release: true),
             arg1));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_qxvyq2(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_18kzm6a(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSObject?, ffi.Int)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSObject?, ffi.Int)> blocking(
+      void Function(Dartdispatch_data_t?, int) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_dispatchdatat_ffiInt1_blockingCallable.nativeFunction
+            .cast(),
+        (dispatch_data_t arg0, int arg1) => fn(
+            arg0.address == 0
+                ? null
+                : objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+            arg1));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_dispatchdatat_ffiInt1_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (dispatch_data_t arg0, int arg1) => fn(
+            arg0.address == 0
+                ? null
+                : objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+            arg1));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_18kzm6a, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSObject?, ffi.Int)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject?, ffi.Int)>`.
@@ -51231,6 +52744,37 @@
         ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
             ffi.Int)>.listener(_ObjCBlock_ffiVoid_ffiInt_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_ffiInt_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    int arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(int))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, ffi.Int)>
+    _ObjCBlock_ffiVoid_ffiInt_blockingCallable = ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Int)>.isolateLocal(_ObjCBlock_ffiVoid_ffiInt_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, ffi.Int)>
+    _ObjCBlock_ffiVoid_ffiInt_blockingListenerCallable = ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Int)>.listener(_ObjCBlock_ffiVoid_ffiInt_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Int)>`.
 abstract final class ObjCBlock_ffiVoid_ffiInt {
@@ -51288,6 +52832,32 @@
     return objc.ObjCBlock<ffi.Void Function(ffi.Int)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Int)> blocking(
+      void Function(int) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiInt_blockingCallable.nativeFunction.cast(),
+        (int arg0) => fn(arg0));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiInt_blockingListenerCallable.nativeFunction
+            .cast(),
+        (int arg0) => fn(arg0));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_9o8504, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Int)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Int)>`.
@@ -51354,6 +52924,48 @@
                 dispatch_data_t, ffi.Int)>.listener(
         _ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    bool arg0,
+    dispatch_data_t arg1,
+    int arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(bool, dispatch_data_t, int))(
+        arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Bool, dispatch_data_t, ffi.Int)>
+    _ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Bool,
+                dispatch_data_t,
+                ffi.Int)>.isolateLocal(
+        _ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Bool, dispatch_data_t, ffi.Int)>
+    _ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Bool,
+                dispatch_data_t,
+                ffi.Int)>.listener(
+        _ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Bool, objc.NSObject?, ffi.Int)>`.
 abstract final class ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt {
@@ -51423,13 +53035,56 @@
                 : objc.NSObject.castFromPointer(arg1,
                     retain: false, release: true),
             arg2));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_12a4qua(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_og5b6y(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(ffi.Bool, objc.NSObject?, ffi.Int)>(
         wrapper,
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Bool, objc.NSObject?, ffi.Int)>
+      blocking(void Function(bool, Dartdispatch_data_t?, int) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt_blockingCallable
+            .nativeFunction
+            .cast(),
+        (bool arg0, dispatch_data_t arg1, int arg2) => fn(
+            arg0,
+            arg1.address == 0
+                ? null
+                : objc.NSObject.castFromPointer(arg1,
+                    retain: false, release: true),
+            arg2));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_bool_dispatchdatat_ffiInt_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (bool arg0, dispatch_data_t arg1, int arg2) => fn(
+            arg0,
+            arg1.address == 0
+                ? null
+                : objc.NSObject.castFromPointer(arg1,
+                    retain: false, release: true),
+            arg2));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_og5b6y, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Bool, objc.NSObject?, ffi.Int)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Bool, objc.NSObject?, ffi.Int)>`.
@@ -55092,6 +56747,39 @@
                 ffi.Uint32)>.listener(
         _ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    SecTrustRef arg0,
+    int arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(SecTrustRef, int))(
+        arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, SecTrustRef, ffi.Uint32)>
+    _ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, SecTrustRef, ffi.Uint32)>.isolateLocal(
+        _ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, SecTrustRef, ffi.Uint32)>
+    _ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, SecTrustRef, ffi.Uint32)>.listener(
+        _ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Uint32)>`.
 abstract final class ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType {
@@ -55158,6 +56846,38 @@
             ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Uint32)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Uint32)>
+      blocking(void Function(SecTrustRef, SecTrustResultType) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType_blockingCallable
+            .nativeFunction
+            .cast(),
+        (SecTrustRef arg0, int arg1) =>
+            fn(arg0, SecTrustResultType.fromValue(arg1)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_SecTrustRef_SecTrustResultType_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (SecTrustRef arg0, int arg1) =>
+            fn(arg0, SecTrustResultType.fromValue(arg1)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_gwxhxt, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Uint32)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Uint32)>`.
@@ -55228,6 +56948,48 @@
                 ffi.Bool, CFErrorRef)>.listener(
         _ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    SecTrustRef arg0,
+    bool arg1,
+    CFErrorRef arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        SecTrustRef, bool, CFErrorRef))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, SecTrustRef, ffi.Bool, CFErrorRef)>
+    _ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                SecTrustRef,
+                ffi.Bool,
+                CFErrorRef)>.isolateLocal(
+        _ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, SecTrustRef, ffi.Bool, CFErrorRef)>
+    _ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                SecTrustRef,
+                ffi.Bool,
+                CFErrorRef)>.listener(
+        _ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Bool, ffi.Pointer<__CFError>)>`.
 abstract final class ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef {
@@ -55300,6 +57062,38 @@
         ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Bool,
             ffi.Pointer<__CFError>)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<__SecTrust>, ffi.Bool, ffi.Pointer<__CFError>)> blocking(
+      void Function(SecTrustRef, bool, CFErrorRef) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef_blockingCallable
+            .nativeFunction
+            .cast(),
+        (SecTrustRef arg0, bool arg1, CFErrorRef arg2) => fn(arg0, arg1, arg2));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_SecTrustRef_bool_CFErrorRef_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (SecTrustRef arg0, bool arg1, CFErrorRef arg2) => fn(arg0, arg1, arg2));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_k73ff5, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Bool,
+            ffi.Pointer<__CFError>)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<__SecTrust>, ffi.Bool, ffi.Pointer<__CFError>)>`.
@@ -55554,6 +57348,36 @@
                 ffi.Pointer<objc.ObjCBlockImpl>, sec_certificate_t)>.listener(
         _ObjCBlock_ffiVoid_seccertificatet_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_seccertificatet_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    sec_certificate_t arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(sec_certificate_t))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, sec_certificate_t)>
+    _ObjCBlock_ffiVoid_seccertificatet_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, sec_certificate_t)>.isolateLocal(
+        _ObjCBlock_ffiVoid_seccertificatet_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, sec_certificate_t)>
+    _ObjCBlock_ffiVoid_seccertificatet_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, sec_certificate_t)>.listener(
+        _ObjCBlock_ffiVoid_seccertificatet_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject)>`.
 abstract final class ObjCBlock_ffiVoid_seccertificatet {
@@ -55611,11 +57435,41 @@
             .cast(),
         (sec_certificate_t arg0) => fn(
             objc.NSObject.castFromPointer(arg0, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSObject)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSObject)> blocking(
+      void Function(Dartsec_certificate_t) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_seccertificatet_blockingCallable.nativeFunction
+            .cast(),
+        (sec_certificate_t arg0) => fn(
+            objc.NSObject.castFromPointer(arg0, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_seccertificatet_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (sec_certificate_t arg0) => fn(
+            objc.NSObject.castFromPointer(arg0, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSObject)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject)>`.
@@ -55663,6 +57517,36 @@
         ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
             ffi.Uint16)>.listener(_ObjCBlock_ffiVoid_Uint16_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_Uint16_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    int arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(int))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, ffi.Uint16)>
+    _ObjCBlock_ffiVoid_Uint16_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Uint16)>.isolateLocal(
+        _ObjCBlock_ffiVoid_Uint16_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, ffi.Uint16)>
+    _ObjCBlock_ffiVoid_Uint16_blockingListenerCallable = ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Uint16)>.listener(_ObjCBlock_ffiVoid_Uint16_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Uint16)>`.
 abstract final class ObjCBlock_ffiVoid_Uint16 {
@@ -55720,6 +57604,32 @@
     return objc.ObjCBlock<ffi.Void Function(ffi.Uint16)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Uint16)> blocking(
+      void Function(int) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_Uint16_blockingCallable.nativeFunction.cast(),
+        (int arg0) => fn(arg0));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_Uint16_blockingListenerCallable.nativeFunction
+            .cast(),
+        (int arg0) => fn(arg0));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_15f11yh, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Uint16)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Uint16)>`.
@@ -55783,6 +57693,45 @@
                 dispatch_data_t)>.listener(
         _ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    dispatch_data_t arg0,
+    dispatch_data_t arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        dispatch_data_t, dispatch_data_t))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, dispatch_data_t, dispatch_data_t)>
+    _ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                dispatch_data_t,
+                dispatch_data_t)>.isolateLocal(
+        _ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, dispatch_data_t, dispatch_data_t)>
+    _ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                dispatch_data_t,
+                dispatch_data_t)>.listener(
+        _ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject)>`.
 abstract final class ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat {
@@ -55846,13 +57795,48 @@
         (dispatch_data_t arg0, dispatch_data_t arg1) => fn(
             objc.NSObject.castFromPointer(arg0, retain: false, release: true),
             objc.NSObject.castFromPointer(arg1, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_wjvic9(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_pfv6jd(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject)>(
         wrapper,
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject)>
+      blocking(void Function(Dartdispatch_data_t, Dartdispatch_data_t) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat_blockingCallable
+            .nativeFunction
+            .cast(),
+        (dispatch_data_t arg0, dispatch_data_t arg1) => fn(
+            objc.NSObject.castFromPointer(arg0, retain: false, release: true),
+            objc.NSObject.castFromPointer(arg1, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_dispatchdatat_dispatchdatat_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (dispatch_data_t arg0, dispatch_data_t arg1) => fn(
+            objc.NSObject.castFromPointer(arg0, retain: false, release: true),
+            objc.NSObject.castFromPointer(arg1, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_pfv6jd, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject)>`.
@@ -55905,6 +57889,36 @@
                 ffi.Pointer<objc.ObjCBlockImpl>, dispatch_data_t)>.listener(
         _ObjCBlock_ffiVoid_dispatchdatat_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_dispatchdatat_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    dispatch_data_t arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(dispatch_data_t))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, dispatch_data_t)>
+    _ObjCBlock_ffiVoid_dispatchdatat_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, dispatch_data_t)>.isolateLocal(
+        _ObjCBlock_ffiVoid_dispatchdatat_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, dispatch_data_t)>
+    _ObjCBlock_ffiVoid_dispatchdatat_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, dispatch_data_t)>.listener(
+        _ObjCBlock_ffiVoid_dispatchdatat_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>`.
 abstract final class ObjCBlock_ffiVoid_dispatchdatat {
@@ -55965,11 +57979,43 @@
             ? null
             : objc.NSObject.castFromPointer(arg0,
                 retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSObject?)> blocking(
+      void Function(Dartdispatch_data_t?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_dispatchdatat_blockingCallable.nativeFunction.cast(),
+        (dispatch_data_t arg0) => fn(arg0.address == 0
+            ? null
+            : objc.NSObject.castFromPointer(arg0,
+                retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_dispatchdatat_blockingListenerCallable.nativeFunction
+            .cast(),
+        (dispatch_data_t arg0) => fn(arg0.address == 0
+            ? null
+            : objc.NSObject.castFromPointer(arg0,
+                retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>`.
@@ -56067,6 +58113,59 @@
                 sec_protocol_pre_shared_key_selection_complete_t)>.listener(
         _ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        sec_protocol_metadata_t arg0,
+        dispatch_data_t arg1,
+        sec_protocol_pre_shared_key_selection_complete_t arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        sec_protocol_metadata_t,
+        dispatch_data_t,
+        sec_protocol_pre_shared_key_selection_complete_t))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            sec_protocol_metadata_t,
+            dispatch_data_t,
+            sec_protocol_pre_shared_key_selection_complete_t)>
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                sec_protocol_metadata_t,
+                dispatch_data_t,
+                sec_protocol_pre_shared_key_selection_complete_t)>.isolateLocal(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            sec_protocol_metadata_t,
+            dispatch_data_t,
+            sec_protocol_pre_shared_key_selection_complete_t)>
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                sec_protocol_metadata_t,
+                dispatch_data_t,
+                sec_protocol_pre_shared_key_selection_complete_t)>.listener(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject?, objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>`.
 abstract final class ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet {
@@ -56144,13 +58243,68 @@
                         retain: false, release: true),
                 ObjCBlock_ffiVoid_dispatchdatat.castFromPointer(arg2,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_91c9gi(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_18qun1e(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(objc.NSObject, objc.NSObject?,
                 objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(objc.NSObject, objc.NSObject?,
+          objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)> blocking(
+      void Function(Dartsec_protocol_metadata_t, Dartdispatch_data_t?,
+              Dartsec_protocol_pre_shared_key_selection_complete_t)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet_blockingCallable
+            .nativeFunction
+            .cast(),
+        (sec_protocol_metadata_t arg0, dispatch_data_t arg1,
+                sec_protocol_pre_shared_key_selection_complete_t arg2) =>
+            fn(
+                objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : objc.NSObject.castFromPointer(arg1,
+                        retain: false, release: true),
+                ObjCBlock_ffiVoid_dispatchdatat.castFromPointer(arg2,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_dispatchdatat_secprotocolpresharedkeyselectioncompletet_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (sec_protocol_metadata_t arg0, dispatch_data_t arg1,
+                sec_protocol_pre_shared_key_selection_complete_t arg2) =>
+            fn(
+                objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : objc.NSObject.castFromPointer(arg1,
+                        retain: false, release: true),
+                ObjCBlock_ffiVoid_dispatchdatat.castFromPointer(arg2,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_18qun1e, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(objc.NSObject, objc.NSObject?,
+                objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject?, objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>`.
@@ -56249,6 +58403,52 @@
                 sec_protocol_key_update_complete_t)>.listener(
         _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        sec_protocol_metadata_t arg0,
+        sec_protocol_key_update_complete_t arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(sec_protocol_metadata_t,
+        sec_protocol_key_update_complete_t))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            sec_protocol_metadata_t,
+            sec_protocol_key_update_complete_t)>
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                sec_protocol_metadata_t,
+                sec_protocol_key_update_complete_t)>.isolateLocal(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            sec_protocol_metadata_t,
+            sec_protocol_key_update_complete_t)>
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                sec_protocol_metadata_t,
+                sec_protocol_key_update_complete_t)>.listener(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.ObjCBlock<ffi.Void Function()>)>`.
 abstract final class ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet {
@@ -56323,13 +58523,60 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid.castFromPointer(arg1,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_14pxqbs(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_o762yo(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
                 objc.NSObject, objc.ObjCBlock<ffi.Void Function()>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+          ffi.Void Function(objc.NSObject, objc.ObjCBlock<ffi.Void Function()>)>
+      blocking(
+          void Function(Dartsec_protocol_metadata_t,
+                  Dartsec_protocol_key_update_complete_t)
+              fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet_blockingCallable
+            .nativeFunction
+            .cast(),
+        (sec_protocol_metadata_t arg0,
+                sec_protocol_key_update_complete_t arg1) =>
+            fn(
+                objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolkeyupdatecompletet_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (sec_protocol_metadata_t arg0,
+                sec_protocol_key_update_complete_t arg1) =>
+            fn(
+                objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_o762yo, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                objc.NSObject, objc.ObjCBlock<ffi.Void Function()>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.ObjCBlock<ffi.Void Function()>)>`.
@@ -56418,6 +58665,52 @@
                 sec_protocol_challenge_complete_t)>.listener(
         _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        sec_protocol_metadata_t arg0,
+        sec_protocol_challenge_complete_t arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(sec_protocol_metadata_t,
+        sec_protocol_challenge_complete_t))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            sec_protocol_metadata_t,
+            sec_protocol_challenge_complete_t)>
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                sec_protocol_metadata_t,
+                sec_protocol_challenge_complete_t)>.isolateLocal(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            sec_protocol_metadata_t,
+            sec_protocol_challenge_complete_t)>
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                sec_protocol_metadata_t,
+                sec_protocol_challenge_complete_t)>.listener(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>`.
 abstract final class ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet {
@@ -56495,13 +58788,61 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_dispatchdatat.castFromPointer(arg1,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_14pxqbs(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_o762yo(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(objc.NSObject,
                 objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+          ffi.Void Function(
+              objc.NSObject, objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>
+      blocking(
+          void Function(Dartsec_protocol_metadata_t,
+                  Dartsec_protocol_challenge_complete_t)
+              fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet_blockingCallable
+            .nativeFunction
+            .cast(),
+        (sec_protocol_metadata_t arg0,
+                sec_protocol_challenge_complete_t arg1) =>
+            fn(
+                objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_dispatchdatat.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_secprotocolchallengecompletet_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (sec_protocol_metadata_t arg0,
+                sec_protocol_challenge_complete_t arg1) =>
+            fn(
+                objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_dispatchdatat.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_o762yo, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(objc.NSObject,
+                objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.ObjCBlock<ffi.Void Function(objc.NSObject?)>)>`.
@@ -56559,6 +58900,37 @@
         ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
             ffi.Bool)>.listener(_ObjCBlock_ffiVoid_bool_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_bool_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    bool arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(bool))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, ffi.Bool)>
+    _ObjCBlock_ffiVoid_bool_blockingCallable = ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Bool)>.isolateLocal(_ObjCBlock_ffiVoid_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, ffi.Bool)>
+    _ObjCBlock_ffiVoid_bool_blockingListenerCallable = ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Bool)>.listener(_ObjCBlock_ffiVoid_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Bool)>`.
 abstract final class ObjCBlock_ffiVoid_bool {
@@ -56616,6 +58988,31 @@
     return objc.ObjCBlock<ffi.Void Function(ffi.Bool)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Bool)> blocking(
+      void Function(bool) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_bool_blockingCallable.nativeFunction.cast(),
+        (bool arg0) => fn(arg0));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_bool_blockingListenerCallable.nativeFunction.cast(),
+        (bool arg0) => fn(arg0));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1s56lr9, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Bool)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Bool)>`.
@@ -56703,6 +59100,57 @@
                 sec_protocol_verify_complete_t)>.listener(
         _ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        sec_protocol_metadata_t arg0,
+        sec_trust_t arg1,
+        sec_protocol_verify_complete_t arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(sec_protocol_metadata_t,
+        sec_trust_t, sec_protocol_verify_complete_t))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            sec_protocol_metadata_t,
+            sec_trust_t,
+            sec_protocol_verify_complete_t)>
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                sec_protocol_metadata_t,
+                sec_trust_t,
+                sec_protocol_verify_complete_t)>.isolateLocal(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            sec_protocol_metadata_t,
+            sec_trust_t,
+            sec_protocol_verify_complete_t)>
+    _ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                sec_protocol_metadata_t,
+                sec_trust_t,
+                sec_protocol_verify_complete_t)>.listener(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject, objc.ObjCBlock<ffi.Void Function(ffi.Bool)>)>`.
 abstract final class ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet {
@@ -56779,13 +59227,64 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_bool.castFromPointer(arg2,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_91c9gi(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_18qun1e(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(objc.NSObject, objc.NSObject,
                 objc.ObjCBlock<ffi.Void Function(ffi.Bool)>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(objc.NSObject, objc.NSObject,
+          objc.ObjCBlock<ffi.Void Function(ffi.Bool)>)> blocking(
+      void Function(Dartsec_protocol_metadata_t, Dartsec_trust_t,
+              Dartsec_protocol_verify_complete_t)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet_blockingCallable
+            .nativeFunction
+            .cast(),
+        (sec_protocol_metadata_t arg0, sec_trust_t arg1,
+                sec_protocol_verify_complete_t arg2) =>
+            fn(
+                objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+                objc.NSObject.castFromPointer(arg1,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_bool.castFromPointer(arg2,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_secprotocolmetadatat_sectrustt_secprotocolverifycompletet_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (sec_protocol_metadata_t arg0, sec_trust_t arg1,
+                sec_protocol_verify_complete_t arg2) =>
+            fn(
+                objc.NSObject.castFromPointer(arg0,
+                    retain: false, release: true),
+                objc.NSObject.castFromPointer(arg1,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_bool.castFromPointer(arg2,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_18qun1e, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(objc.NSObject, objc.NSObject,
+                objc.ObjCBlock<ffi.Void Function(ffi.Bool)>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSObject, objc.NSObject, objc.ObjCBlock<ffi.Void Function(ffi.Bool)>)>`.
@@ -57024,6 +59523,58 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1,
+    ffi.Pointer<objc.ObjCObject> arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSData?, NSURLResponse?, objc.NSError?)>`.
 abstract final class ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError {
@@ -57105,12 +59656,71 @@
                     ? null
                     : objc.NSError.castFromPointer(arg2,
                         retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1hcfngn(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_r8gdi7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(objc.NSData?, NSURLResponse?,
             objc.NSError?)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc
+      .ObjCBlock<ffi.Void Function(objc.NSData?, NSURLResponse?, objc.NSError?)>
+      blocking(void Function(objc.NSData?, NSURLResponse?, objc.NSError?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.NSData.castFromPointer(arg0,
+                        retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : NSURLResponse.castFromPointer(arg1,
+                        retain: false, release: true),
+                arg2.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg2,
+                        retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.NSData.castFromPointer(arg0,
+                        retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : NSURLResponse.castFromPointer(arg1,
+                        retain: false, release: true),
+                arg2.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg2,
+                        retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_r8gdi7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(objc.NSData?, NSURLResponse?,
+            objc.NSError?)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSData?, NSURLResponse?, objc.NSError?)>`.
@@ -57139,7 +59749,7 @@
 
 late final _sel_dataTaskWithRequest_completionHandler_ =
     objc.registerName("dataTaskWithRequest:completionHandler:");
-final _objc_msgSend_o4sqyk = objc.msgSendPointer
+final _objc_msgSend_r0bo0s = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -57180,7 +59790,7 @@
 
 late final _sel_uploadTaskWithRequest_fromFile_completionHandler_ =
     objc.registerName("uploadTaskWithRequest:fromFile:completionHandler:");
-final _objc_msgSend_but05y = objc.msgSendPointer
+final _objc_msgSend_2wiv66 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -57242,6 +59852,38 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSData_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSData_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSData_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSData_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSData_blockingListenerCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSData_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSData?)>`.
 abstract final class ObjCBlock_ffiVoid_NSData {
@@ -57302,11 +59944,41 @@
         (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
             ? null
             : objc.NSData.castFromPointer(arg0, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSData?)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSData?)> blocking(
+      void Function(objc.NSData?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSData_blockingCallable.nativeFunction.cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : objc.NSData.castFromPointer(arg0, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSData_blockingListenerCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : objc.NSData.castFromPointer(arg0, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSData?)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSData?)>`.
@@ -57344,7 +60016,7 @@
 
   /// Returns whether [obj] is an instance of [NSURLSessionDownloadTask].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSURLSessionDownloadTask);
   }
 
@@ -57363,7 +60035,7 @@
   /// init
   NSURLSessionDownloadTask init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: false, release: true);
   }
@@ -57371,14 +60043,14 @@
   /// new
   static NSURLSessionDownloadTask new1() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSURLSessionDownloadTask, _sel_new);
+        _objc_msgSend_151sglz(_class_NSURLSessionDownloadTask, _sel_new);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSURLSessionDownloadTask allocWithZone_(ffi.Pointer<_NSZone> zone) {
-    final _ret = _objc_msgSend_hzlb60(
+    final _ret = _objc_msgSend_1cwp428(
         _class_NSURLSessionDownloadTask, _sel_allocWithZone_, zone);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: false, release: true);
@@ -57387,28 +60059,28 @@
   /// alloc
   static NSURLSessionDownloadTask alloc() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSURLSessionDownloadTask, _sel_alloc);
+        _objc_msgSend_151sglz(_class_NSURLSessionDownloadTask, _sel_alloc);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// self
   NSURLSessionDownloadTask self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// retain
   NSURLSessionDownloadTask retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// autorelease
   NSURLSessionDownloadTask autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: true, release: true);
   }
@@ -57487,6 +60159,58 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1,
+    ffi.Pointer<objc.ObjCObject> arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSURL?, NSURLResponse?, objc.NSError?)>`.
 abstract final class ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError {
@@ -57568,12 +60292,71 @@
                     ? null
                     : objc.NSError.castFromPointer(arg2,
                         retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1hcfngn(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_r8gdi7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(objc.NSURL?, NSURLResponse?,
             objc.NSError?)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc
+      .ObjCBlock<ffi.Void Function(objc.NSURL?, NSURLResponse?, objc.NSError?)>
+      blocking(void Function(objc.NSURL?, NSURLResponse?, objc.NSError?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.NSURL
+                        .castFromPointer(arg0, retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : NSURLResponse.castFromPointer(arg1,
+                        retain: false, release: true),
+                arg2.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg2,
+                        retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.NSURL
+                        .castFromPointer(arg0, retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : NSURLResponse.castFromPointer(arg1,
+                        retain: false, release: true),
+                arg2.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg2,
+                        retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_r8gdi7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(objc.NSURL?, NSURLResponse?,
+            objc.NSError?)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSURL?, NSURLResponse?, objc.NSError?)>`.
@@ -57626,7 +60409,7 @@
       objc.ObjCBlock<
               ffi.Void Function(objc.NSData?, NSURLResponse?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_o4sqyk(
+    final _ret = _objc_msgSend_r0bo0s(
         this.ref.pointer,
         _sel_dataTaskWithRequest_completionHandler_,
         request.ref.pointer,
@@ -57641,7 +60424,7 @@
       objc.ObjCBlock<
               ffi.Void Function(objc.NSData?, NSURLResponse?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_o4sqyk(
+    final _ret = _objc_msgSend_r0bo0s(
         this.ref.pointer,
         _sel_dataTaskWithURL_completionHandler_,
         url.ref.pointer,
@@ -57657,7 +60440,7 @@
       objc.ObjCBlock<
               ffi.Void Function(objc.NSData?, NSURLResponse?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_but05y(
+    final _ret = _objc_msgSend_2wiv66(
         this.ref.pointer,
         _sel_uploadTaskWithRequest_fromFile_completionHandler_,
         request.ref.pointer,
@@ -57674,7 +60457,7 @@
       objc.ObjCBlock<
               ffi.Void Function(objc.NSData?, NSURLResponse?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_but05y(
+    final _ret = _objc_msgSend_2wiv66(
         this.ref.pointer,
         _sel_uploadTaskWithRequest_fromData_completionHandler_,
         request.ref.pointer,
@@ -57695,7 +60478,7 @@
       objc.ObjCBlock<
               ffi.Void Function(objc.NSData?, NSURLResponse?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_o4sqyk(
+    final _ret = _objc_msgSend_r0bo0s(
         this.ref.pointer,
         _sel_uploadTaskWithResumeData_completionHandler_,
         resumeData.ref.pointer,
@@ -57713,7 +60496,7 @@
       objc.ObjCBlock<
               ffi.Void Function(objc.NSURL?, NSURLResponse?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_o4sqyk(
+    final _ret = _objc_msgSend_r0bo0s(
         this.ref.pointer,
         _sel_downloadTaskWithRequest_completionHandler_,
         request.ref.pointer,
@@ -57728,7 +60511,7 @@
       objc.ObjCBlock<
               ffi.Void Function(objc.NSURL?, NSURLResponse?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_o4sqyk(
+    final _ret = _objc_msgSend_r0bo0s(
         this.ref.pointer,
         _sel_downloadTaskWithURL_completionHandler_,
         url.ref.pointer,
@@ -57743,7 +60526,7 @@
       objc.ObjCBlock<
               ffi.Void Function(objc.NSURL?, NSURLResponse?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_o4sqyk(
+    final _ret = _objc_msgSend_r0bo0s(
         this.ref.pointer,
         _sel_downloadTaskWithResumeData_completionHandler_,
         resumeData.ref.pointer,
@@ -57764,7 +60547,7 @@
   /// backgroundSessionConfiguration:
   static NSURLSessionConfiguration backgroundSessionConfiguration_(
       objc.NSString identifier) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSURLSessionConfiguration,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSURLSessionConfiguration,
         _sel_backgroundSessionConfiguration_, identifier.ref.pointer);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: true, release: true);
@@ -57997,8 +60780,8 @@
 /// created, a copy of the configuration object is made - you cannot
 /// modify the configuration of a session after it has been created.
 ///
-/// The shared session uses the global singleton credential, cache
-/// and cookie storage objects.
+/// The shared session uses the global credential, cache and cookie
+/// storage objects.
 ///
 /// An ephemeral session has no persistent disk storage for cookies,
 /// cache or credentials.
@@ -58021,13 +60804,13 @@
 
   /// Returns whether [obj] is an instance of [NSURLSessionConfiguration].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSURLSessionConfiguration);
   }
 
   /// defaultSessionConfiguration
   static NSURLSessionConfiguration getDefaultSessionConfiguration() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSURLSessionConfiguration, _sel_defaultSessionConfiguration);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: true, release: true);
@@ -58035,7 +60818,7 @@
 
   /// ephemeralSessionConfiguration
   static NSURLSessionConfiguration getEphemeralSessionConfiguration() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSURLSessionConfiguration, _sel_ephemeralSessionConfiguration);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: true, release: true);
@@ -58044,7 +60827,7 @@
   /// backgroundSessionConfigurationWithIdentifier:
   static NSURLSessionConfiguration
       backgroundSessionConfigurationWithIdentifier_(objc.NSString identifier) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSURLSessionConfiguration,
         _sel_backgroundSessionConfigurationWithIdentifier_,
         identifier.ref.pointer);
@@ -58054,7 +60837,7 @@
 
   /// identifier for the background session configuration
   objc.NSString? get identifier {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_identifier);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_identifier);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -58069,7 +60852,7 @@
 
   /// default cache policy for requests
   set requestCachePolicy(NSURLRequestCachePolicy value) {
-    return _objc_msgSend_1yjxuv2(
+    _objc_msgSend_1yjxuv2(
         this.ref.pointer, _sel_setRequestCachePolicy_, value.value);
   }
 
@@ -58084,7 +60867,7 @@
 
   /// default timeout for requests.  This will cause a timeout if no data is transmitted for the given timeout value, and is reset whenever data is transmitted.
   set timeoutIntervalForRequest(DartNSTimeInterval value) {
-    return _objc_msgSend_hwm8nu(
+    _objc_msgSend_hwm8nu(
         this.ref.pointer, _sel_setTimeoutIntervalForRequest_, value);
   }
 
@@ -58099,7 +60882,7 @@
 
   /// default timeout for requests.  This will cause a timeout if a resource is not able to be retrieved within a given timeout.
   set timeoutIntervalForResource(DartNSTimeInterval value) {
-    return _objc_msgSend_hwm8nu(
+    _objc_msgSend_hwm8nu(
         this.ref.pointer, _sel_setTimeoutIntervalForResource_, value);
   }
 
@@ -58112,7 +60895,7 @@
 
   /// type of service for requests.
   set networkServiceType(NSURLRequestNetworkServiceType value) {
-    return _objc_msgSend_1mse4s1(
+    _objc_msgSend_1mse4s1(
         this.ref.pointer, _sel_setNetworkServiceType_, value.value);
   }
 
@@ -58123,7 +60906,7 @@
 
   /// allow request to route over cellular.
   set allowsCellularAccess(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setAllowsCellularAccess_, value);
   }
 
@@ -58135,7 +60918,7 @@
 
   /// allow request to route over expensive networks.  Defaults to YES.
   set allowsExpensiveNetworkAccess(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setAllowsExpensiveNetworkAccess_, value);
   }
 
@@ -58147,7 +60930,7 @@
 
   /// allow request to route over networks in constrained mode. Defaults to YES.
   set allowsConstrainedNetworkAccess(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setAllowsConstrainedNetworkAccess_, value);
   }
 
@@ -58159,7 +60942,7 @@
 
   /// requires requests from the session to be made with DNSSEC validation enabled. Defaults to NO.
   set requiresDNSSECValidation(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setRequiresDNSSECValidation_, value);
   }
 
@@ -58192,7 +60975,7 @@
   /// Default value is NO. Ignored by background sessions, as background sessions
   /// always wait for connectivity.
   set waitsForConnectivity(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setWaitsForConnectivity_, value);
   }
 
@@ -58203,8 +60986,7 @@
 
   /// allows background tasks to be scheduled at the discretion of the system for optimal performance.
   set discretionary(bool value) {
-    return _objc_msgSend_1s56lr9(
-        this.ref.pointer, _sel_setDiscretionary_, value);
+    _objc_msgSend_1s56lr9(this.ref.pointer, _sel_setDiscretionary_, value);
   }
 
   /// The identifier of the shared data container into which files in background sessions should be downloaded.
@@ -58212,7 +60994,7 @@
   /// all transfers in that session will fail with NSURLErrorBackgroundSessionRequiresSharedContainer.
   objc.NSString? get sharedContainerIdentifier {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_sharedContainerIdentifier);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_sharedContainerIdentifier);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -58222,8 +61004,8 @@
   /// App extensions wishing to use background sessions *must* set this property to a valid container identifier, or
   /// all transfers in that session will fail with NSURLErrorBackgroundSessionRequiresSharedContainer.
   set sharedContainerIdentifier(objc.NSString? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer,
-        _sel_setSharedContainerIdentifier_, value?.ref.pointer ?? ffi.nullptr);
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setSharedContainerIdentifier_,
+        value?.ref.pointer ?? ffi.nullptr);
   }
 
   /// Allows the app to be resumed or launched in the background when tasks in background sessions complete
@@ -58242,14 +61024,14 @@
   ///
   /// NOTE: macOS apps based on AppKit do not support background launch.
   set sessionSendsLaunchEvents(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setSessionSendsLaunchEvents_, value);
   }
 
   /// The proxy dictionary, as described by <CFNetwork/CFHTTPStream.h>
   objc.NSDictionary? get connectionProxyDictionary {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_connectionProxyDictionary);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_connectionProxyDictionary);
     return _ret.address == 0
         ? null
         : objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
@@ -58257,8 +61039,8 @@
 
   /// The proxy dictionary, as described by <CFNetwork/CFHTTPStream.h>
   set connectionProxyDictionary(objc.NSDictionary? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer,
-        _sel_setConnectionProxyDictionary_, value?.ref.pointer ?? ffi.nullptr);
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setConnectionProxyDictionary_,
+        value?.ref.pointer ?? ffi.nullptr);
   }
 
   /// The minimum allowable versions of the TLS protocol, from <Security/SecureTransport.h>
@@ -58270,7 +61052,7 @@
 
   /// The minimum allowable versions of the TLS protocol, from <Security/SecureTransport.h>
   set TLSMinimumSupportedProtocol(SSLProtocol value) {
-    return _objc_msgSend_268k8x(
+    _objc_msgSend_268k8x(
         this.ref.pointer, _sel_setTLSMinimumSupportedProtocol_, value.value);
   }
 
@@ -58283,7 +61065,7 @@
 
   /// The maximum allowable versions of the TLS protocol, from <Security/SecureTransport.h>
   set TLSMaximumSupportedProtocol(SSLProtocol value) {
-    return _objc_msgSend_268k8x(
+    _objc_msgSend_268k8x(
         this.ref.pointer, _sel_setTLSMaximumSupportedProtocol_, value.value);
   }
 
@@ -58296,7 +61078,7 @@
 
   /// The minimum allowable versions of the TLS protocol, from <Security/SecProtocolTypes.h>
   set TLSMinimumSupportedProtocolVersion(tls_protocol_version_t value) {
-    return _objc_msgSend_1mvuct7(this.ref.pointer,
+    _objc_msgSend_1mvuct7(this.ref.pointer,
         _sel_setTLSMinimumSupportedProtocolVersion_, value.value);
   }
 
@@ -58309,7 +61091,7 @@
 
   /// The maximum allowable versions of the TLS protocol, from <Security/SecProtocolTypes.h>
   set TLSMaximumSupportedProtocolVersion(tls_protocol_version_t value) {
-    return _objc_msgSend_1mvuct7(this.ref.pointer,
+    _objc_msgSend_1mvuct7(this.ref.pointer,
         _sel_setTLSMaximumSupportedProtocolVersion_, value.value);
   }
 
@@ -58320,7 +61102,7 @@
 
   /// Allow the use of HTTP pipelining
   set HTTPShouldUsePipelining(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setHTTPShouldUsePipelining_, value);
   }
 
@@ -58331,7 +61113,7 @@
 
   /// Allow the session to set cookies on requests
   set HTTPShouldSetCookies(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setHTTPShouldSetCookies_, value);
   }
 
@@ -58344,7 +61126,7 @@
 
   /// Policy for accepting cookies.  This overrides the policy otherwise specified by the cookie storage.
   set HTTPCookieAcceptPolicy(NSHTTPCookieAcceptPolicy value) {
-    return _objc_msgSend_3q55ys(
+    _objc_msgSend_3q55ys(
         this.ref.pointer, _sel_setHTTPCookieAcceptPolicy_, value.value);
   }
 
@@ -58352,7 +61134,7 @@
   /// Note that these headers are added to the request only if not already present.
   objc.NSDictionary? get HTTPAdditionalHeaders {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_HTTPAdditionalHeaders);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_HTTPAdditionalHeaders);
     return _ret.address == 0
         ? null
         : objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
@@ -58361,8 +61143,8 @@
   /// Specifies additional headers which will be set on outgoing requests.
   /// Note that these headers are added to the request only if not already present.
   set HTTPAdditionalHeaders(objc.NSDictionary? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer,
-        _sel_setHTTPAdditionalHeaders_, value?.ref.pointer ?? ffi.nullptr);
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setHTTPAdditionalHeaders_,
+        value?.ref.pointer ?? ffi.nullptr);
   }
 
   /// The maximum number of simultaneous persistent connections per host
@@ -58373,14 +61155,14 @@
 
   /// The maximum number of simultaneous persistent connections per host
   set HTTPMaximumConnectionsPerHost(DartNSInteger value) {
-    return _objc_msgSend_4sp4xj(
+    _objc_msgSend_4sp4xj(
         this.ref.pointer, _sel_setHTTPMaximumConnectionsPerHost_, value);
   }
 
   /// The cookie storage object to use, or nil to indicate that no cookies should be handled
   NSHTTPCookieStorage? get HTTPCookieStorage {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_HTTPCookieStorage);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_HTTPCookieStorage);
     return _ret.address == 0
         ? null
         : NSHTTPCookieStorage.castFromPointer(_ret,
@@ -58389,14 +61171,14 @@
 
   /// The cookie storage object to use, or nil to indicate that no cookies should be handled
   set HTTPCookieStorage(NSHTTPCookieStorage? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setHTTPCookieStorage_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setHTTPCookieStorage_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
   /// The credential storage object, or nil to indicate that no credential storage is to be used
   NSURLCredentialStorage? get URLCredentialStorage {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_URLCredentialStorage);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_URLCredentialStorage);
     return _ret.address == 0
         ? null
         : NSURLCredentialStorage.castFromPointer(_ret,
@@ -58405,13 +61187,13 @@
 
   /// The credential storage object, or nil to indicate that no credential storage is to be used
   set URLCredentialStorage(NSURLCredentialStorage? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer,
-        _sel_setURLCredentialStorage_, value?.ref.pointer ?? ffi.nullptr);
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setURLCredentialStorage_,
+        value?.ref.pointer ?? ffi.nullptr);
   }
 
   /// The URL resource cache, or nil to indicate that no caching is to be performed
   NSURLCache? get URLCache {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_URLCache);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_URLCache);
     return _ret.address == 0
         ? null
         : NSURLCache.castFromPointer(_ret, retain: true, release: true);
@@ -58419,7 +61201,7 @@
 
   /// The URL resource cache, or nil to indicate that no caching is to be performed
   set URLCache(NSURLCache? value) {
-    return _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setURLCache_, value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -58433,7 +61215,7 @@
   /// Enable extended background idle mode for any tcp sockets created.    Enabling this mode asks the system to keep the socket open
   /// and delay reclaiming it when the process moves to the background (see https://developer.apple.com/library/ios/technotes/tn2277/_index.html)
   set shouldUseExtendedBackgroundIdleMode(bool value) {
-    return _objc_msgSend_1s56lr9(
+    _objc_msgSend_1s56lr9(
         this.ref.pointer, _sel_setShouldUseExtendedBackgroundIdleMode_, value);
   }
 
@@ -58446,7 +61228,7 @@
   /// Custom NSURLProtocol subclasses are not available to background
   /// sessions.
   objc.ObjCObjectBase? get protocolClasses {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_protocolClasses);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_protocolClasses);
     return _ret.address == 0
         ? null
         : objc.ObjCObjectBase(_ret, retain: true, release: true);
@@ -58461,7 +61243,7 @@
   /// Custom NSURLProtocol subclasses are not available to background
   /// sessions.
   set protocolClasses(objc.ObjCObjectBase? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setProtocolClasses_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setProtocolClasses_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -58474,14 +61256,14 @@
 
   /// multipath service type to use for connections.  The default is NSURLSessionMultipathServiceTypeNone
   set multipathServiceType(NSURLSessionMultipathServiceType value) {
-    return _objc_msgSend_1hx005a(
+    _objc_msgSend_1hx005a(
         this.ref.pointer, _sel_setMultipathServiceType_, value.value);
   }
 
   /// init
   NSURLSessionConfiguration init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: false, release: true);
   }
@@ -58489,14 +61271,14 @@
   /// new
   static NSURLSessionConfiguration new1() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSURLSessionConfiguration, _sel_new);
+        _objc_msgSend_151sglz(_class_NSURLSessionConfiguration, _sel_new);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSURLSessionConfiguration allocWithZone_(ffi.Pointer<_NSZone> zone) {
-    final _ret = _objc_msgSend_hzlb60(
+    final _ret = _objc_msgSend_1cwp428(
         _class_NSURLSessionConfiguration, _sel_allocWithZone_, zone);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: false, release: true);
@@ -58505,28 +61287,28 @@
   /// alloc
   static NSURLSessionConfiguration alloc() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSURLSessionConfiguration, _sel_alloc);
+        _objc_msgSend_151sglz(_class_NSURLSessionConfiguration, _sel_alloc);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// self
   NSURLSessionConfiguration self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// retain
   NSURLSessionConfiguration retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// autorelease
   NSURLSessionConfiguration autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: true, release: true);
   }
@@ -58542,7 +61324,7 @@
 extension NSDeprecated1 on NSOperationQueue {
   /// These two functions are inherently a race condition and should be avoided if possible
   objc.NSArray get operations {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_operations);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_operations);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -58574,7 +61356,7 @@
 late final _sel_addOperation_ = objc.registerName("addOperation:");
 late final _sel_addOperations_waitUntilFinished_ =
     objc.registerName("addOperations:waitUntilFinished:");
-final _objc_msgSend_gk45w7 = objc.msgSendPointer
+final _objc_msgSend_6p7ndb = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -58618,6 +61400,29 @@
     .asFunction<
         void Function(ffi.Pointer<objc.ObjCObject>,
             ffi.Pointer<objc.ObjCSelector>, int)>();
+
+/// !
+/// @typedef dispatch_queue_t
+///
+/// @abstract
+/// Dispatch queues invoke workitems submitted to them.
+///
+/// @discussion
+/// Dispatch queues come in many flavors, the most common one being the dispatch
+/// serial queue (See dispatch_queue_serial_t).
+///
+/// The system manages a pool of threads which process dispatch queues and invoke
+/// workitems submitted to them.
+///
+/// Conceptually a dispatch queue may have its own thread of execution, and
+/// interaction between queues is highly asynchronous.
+///
+/// Dispatch queues are reference counted via calls to dispatch_retain() and
+/// dispatch_release(). Pending workitems submitted to a queue also hold a
+/// reference to the queue until they have finished. Once all references to a
+/// queue have been released, the queue will be deallocated by the system.
+typedef dispatch_queue_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_queue_t1 = objc.NSObject;
 late final _sel_underlyingQueue = objc.registerName("underlyingQueue");
 late final _sel_setUnderlyingQueue_ = objc.registerName("setUnderlyingQueue:");
 late final _sel_cancelAllOperations = objc.registerName("cancelAllOperations");
@@ -58643,24 +61448,24 @@
 
   /// Returns whether [obj] is an instance of [NSOperationQueue].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSOperationQueue);
   }
 
   /// progress
   NSProgress get progress {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_progress);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_progress);
     return NSProgress.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// addOperation:
   void addOperation_(NSOperation op) {
-    _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_addOperation_, op.ref.pointer);
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_addOperation_, op.ref.pointer);
   }
 
   /// addOperations:waitUntilFinished:
   void addOperations_waitUntilFinished_(objc.NSArray ops, bool wait) {
-    _objc_msgSend_gk45w7(this.ref.pointer,
+    _objc_msgSend_6p7ndb(this.ref.pointer,
         _sel_addOperations_waitUntilFinished_, ops.ref.pointer, wait);
   }
 
@@ -58688,7 +61493,7 @@
 
   /// setMaxConcurrentOperationCount:
   set maxConcurrentOperationCount(DartNSInteger value) {
-    return _objc_msgSend_4sp4xj(
+    _objc_msgSend_4sp4xj(
         this.ref.pointer, _sel_setMaxConcurrentOperationCount_, value);
   }
 
@@ -58699,12 +61504,12 @@
 
   /// setSuspended:
   set suspended(bool value) {
-    return _objc_msgSend_1s56lr9(this.ref.pointer, _sel_setSuspended_, value);
+    _objc_msgSend_1s56lr9(this.ref.pointer, _sel_setSuspended_, value);
   }
 
   /// name
   objc.NSString? get name {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_name);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_name);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -58712,7 +61517,7 @@
 
   /// setName:
   set name(objc.NSString? value) {
-    return _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setName_, value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -58724,21 +61529,21 @@
 
   /// setQualityOfService:
   set qualityOfService(NSQualityOfService value) {
-    return _objc_msgSend_n2da1l(
+    _objc_msgSend_n2da1l(
         this.ref.pointer, _sel_setQualityOfService_, value.value);
   }
 
   /// actually retain
-  Dartdispatch_queue_t? get underlyingQueue {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_underlyingQueue);
+  Dartdispatch_queue_t1? get underlyingQueue {
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_underlyingQueue);
     return _ret.address == 0
         ? null
         : objc.NSObject.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// actually retain
-  set underlyingQueue(Dartdispatch_queue_t? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setUnderlyingQueue_,
+  set underlyingQueue(Dartdispatch_queue_t1? value) {
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setUnderlyingQueue_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -58756,7 +61561,7 @@
   /// currentQueue
   static NSOperationQueue? getCurrentQueue() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSOperationQueue, _sel_currentQueue);
+        _objc_msgSend_151sglz(_class_NSOperationQueue, _sel_currentQueue);
     return _ret.address == 0
         ? null
         : NSOperationQueue.castFromPointer(_ret, retain: true, release: true);
@@ -58764,51 +61569,51 @@
 
   /// mainQueue
   static NSOperationQueue getMainQueue() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSOperationQueue, _sel_mainQueue);
+    final _ret = _objc_msgSend_151sglz(_class_NSOperationQueue, _sel_mainQueue);
     return NSOperationQueue.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// init
   NSOperationQueue init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSOperationQueue.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// new
   static NSOperationQueue new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSOperationQueue, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSOperationQueue, _sel_new);
     return NSOperationQueue.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSOperationQueue allocWithZone_(ffi.Pointer<_NSZone> zone) {
-    final _ret = _objc_msgSend_hzlb60(
+    final _ret = _objc_msgSend_1cwp428(
         _class_NSOperationQueue, _sel_allocWithZone_, zone);
     return NSOperationQueue.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// alloc
   static NSOperationQueue alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSOperationQueue, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSOperationQueue, _sel_alloc);
     return NSOperationQueue.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// self
   NSOperationQueue self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSOperationQueue.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// retain
   NSOperationQueue retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSOperationQueue.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// autorelease
   NSOperationQueue autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSOperationQueue.castFromPointer(_ret, retain: true, release: true);
   }
 }
@@ -58903,6 +61708,59 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<objc.ObjCObject> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCObject>)>`.
 abstract final class ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject {
@@ -58980,7 +61838,7 @@
                 objc.ObjCObjectBase(arg0, retain: false, release: true),
                 objc.ObjCObjectBase(arg1, retain: false, release: true),
                 objc.ObjCObjectBase(arg2, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1hcfngn(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_r8gdi7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -58989,6 +61847,53 @@
                 ffi.Pointer<objc.ObjCObject>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<objc.ObjCObject>,
+          ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCObject>)> blocking(
+      void Function(
+              objc.ObjCObjectBase, objc.ObjCObjectBase, objc.ObjCObjectBase)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                objc.ObjCObjectBase(arg0, retain: false, release: true),
+                objc.ObjCObjectBase(arg1, retain: false, release: true),
+                objc.ObjCObjectBase(arg2, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_objcObjCObject_objcObjCObject_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                objc.ObjCObjectBase(arg0, retain: false, release: true),
+                objc.ObjCObjectBase(arg1, retain: false, release: true),
+                objc.ObjCObjectBase(arg2, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_r8gdi7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCObject>, ffi.Pointer<objc.ObjCObject>)>`.
@@ -59057,6 +61962,39 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_objcObjCObject1_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_objcObjCObject1_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_objcObjCObject1_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_objcObjCObject1_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_objcObjCObject1_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_objcObjCObject1_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>)>`.
 abstract final class ObjCBlock_ffiVoid_objcObjCObject1 {
@@ -59116,13 +62054,45 @@
             .cast(),
         (ffi.Pointer<objc.ObjCObject> arg0) =>
             fn(objc.ObjCObjectBase(arg0, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>)>(
         wrapper,
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>)>
+      blocking(void Function(objc.ObjCObjectBase) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject1_blockingCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) =>
+            fn(objc.ObjCObjectBase(arg0, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject1_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) =>
+            fn(objc.ObjCObjectBase(arg0, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>)>`.
@@ -59198,7 +62168,7 @@
 
 late final _sel_streamTaskWithHostName_port_ =
     objc.registerName("streamTaskWithHostName:port:");
-final _objc_msgSend_1i26p99 = objc.msgSendPointer
+final _objc_msgSend_9slupp = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -59290,13 +62260,13 @@
 
   /// Returns whether [obj] is an instance of [NSURLSessionWebSocketMessage].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(obj.ref.pointer, _sel_isKindOfClass_,
+    return _objc_msgSend_19nvye5(obj.ref.pointer, _sel_isKindOfClass_,
         _class_NSURLSessionWebSocketMessage);
   }
 
   /// Create a message with data type
   NSURLSessionWebSocketMessage initWithData_(objc.NSData data) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithData_, data.ref.pointer);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: false, release: true);
@@ -59304,7 +62274,7 @@
 
   /// Create a message with string type
   NSURLSessionWebSocketMessage initWithString_(objc.NSString string) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithString_, string.ref.pointer);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: false, release: true);
@@ -59318,7 +62288,7 @@
 
   /// data
   objc.NSData? get data {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_data);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_data);
     return _ret.address == 0
         ? null
         : objc.NSData.castFromPointer(_ret, retain: true, release: true);
@@ -59326,7 +62296,7 @@
 
   /// string
   objc.NSString? get string {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_string);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_string);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -59335,7 +62305,7 @@
   /// init
   NSURLSessionWebSocketMessage init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: false, release: true);
   }
@@ -59343,7 +62313,7 @@
   /// new
   static NSURLSessionWebSocketMessage new1() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSURLSessionWebSocketMessage, _sel_new);
+        _objc_msgSend_151sglz(_class_NSURLSessionWebSocketMessage, _sel_new);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: false, release: true);
   }
@@ -59351,7 +62321,7 @@
   /// allocWithZone:
   static NSURLSessionWebSocketMessage allocWithZone_(
       ffi.Pointer<_NSZone> zone) {
-    final _ret = _objc_msgSend_hzlb60(
+    final _ret = _objc_msgSend_1cwp428(
         _class_NSURLSessionWebSocketMessage, _sel_allocWithZone_, zone);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: false, release: true);
@@ -59360,28 +62330,28 @@
   /// alloc
   static NSURLSessionWebSocketMessage alloc() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSURLSessionWebSocketMessage, _sel_alloc);
+        _objc_msgSend_151sglz(_class_NSURLSessionWebSocketMessage, _sel_alloc);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// self
   NSURLSessionWebSocketMessage self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// retain
   NSURLSessionWebSocketMessage retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// autorelease
   NSURLSessionWebSocketMessage autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLSessionWebSocketMessage.castFromPointer(_ret,
         retain: true, release: true);
   }
@@ -59427,6 +62397,38 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSError_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSError_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSError_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSError_blockingListenerCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSError?)>`.
 abstract final class ObjCBlock_ffiVoid_NSError {
@@ -59488,11 +62490,43 @@
             ? null
             : objc.NSError.castFromPointer(arg0,
                 retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSError?)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSError?)> blocking(
+      void Function(objc.NSError?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSError_blockingCallable.nativeFunction.cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : objc.NSError.castFromPointer(arg0,
+                retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSError_blockingListenerCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : objc.NSError.castFromPointer(arg0,
+                retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSError?)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSError?)>`.
@@ -59567,6 +62601,51 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(NSURLSessionWebSocketMessage?, objc.NSError?)>`.
 abstract final class ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError {
@@ -59640,12 +62719,63 @@
                     ? null
                     : objc.NSError.castFromPointer(arg1,
                         retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_wjvic9(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_pfv6jd(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(NSURLSessionWebSocketMessage?,
             objc.NSError?)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+          ffi.Void Function(NSURLSessionWebSocketMessage?, objc.NSError?)>
+      blocking(void Function(NSURLSessionWebSocketMessage?, objc.NSError?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : NSURLSessionWebSocketMessage.castFromPointer(arg0,
+                        retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg1,
+                        retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : NSURLSessionWebSocketMessage.castFromPointer(arg0,
+                        retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg1,
+                        retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_pfv6jd, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(NSURLSessionWebSocketMessage?,
+            objc.NSError?)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(NSURLSessionWebSocketMessage?, objc.NSError?)>`.
@@ -59692,7 +62822,7 @@
 
 late final _sel_cancelWithCloseCode_reason_ =
     objc.registerName("cancelWithCloseCode:reason:");
-final _objc_msgSend_xb0psz = objc.msgSendPointer
+final _objc_msgSend_tqzk0b = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -59744,7 +62874,7 @@
 
   /// Returns whether [obj] is an instance of [NSURLSessionWebSocketTask].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSURLSessionWebSocketTask);
   }
 
@@ -59754,7 +62884,7 @@
   /// that they have been written to the kernel.
   void sendMessage_completionHandler_(NSURLSessionWebSocketMessage message,
       objc.ObjCBlock<ffi.Void Function(objc.NSError?)> completionHandler) {
-    _objc_msgSend_14pxqbs(this.ref.pointer, _sel_sendMessage_completionHandler_,
+    _objc_msgSend_o762yo(this.ref.pointer, _sel_sendMessage_completionHandler_,
         message.ref.pointer, completionHandler.ref.pointer);
   }
 
@@ -59785,7 +62915,7 @@
   /// Simply calling cancel on the task will result in a cancellation frame being sent without any reason.
   void cancelWithCloseCode_reason_(
       DartNSInteger closeCode, objc.NSData? reason) {
-    _objc_msgSend_xb0psz(this.ref.pointer, _sel_cancelWithCloseCode_reason_,
+    _objc_msgSend_tqzk0b(this.ref.pointer, _sel_cancelWithCloseCode_reason_,
         closeCode, reason?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -59796,8 +62926,7 @@
 
   /// The maximum number of bytes to be buffered before erroring out. This includes the sum of all bytes from continuation frames. Receive calls will error out if this value is reached
   set maximumMessageSize(DartNSInteger value) {
-    return _objc_msgSend_4sp4xj(
-        this.ref.pointer, _sel_setMaximumMessageSize_, value);
+    _objc_msgSend_4sp4xj(this.ref.pointer, _sel_setMaximumMessageSize_, value);
   }
 
   /// A task can be queried for it's close code at any point. When the task is not closed, it will be set to NSURLSessionWebSocketCloseCodeInvalid
@@ -59807,7 +62936,7 @@
 
   /// A task can be queried for it's close reason at any point. A nil value indicates no closeReason or that the task is still running
   objc.NSData? get closeReason {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_closeReason);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_closeReason);
     return _ret.address == 0
         ? null
         : objc.NSData.castFromPointer(_ret, retain: true, release: true);
@@ -59816,7 +62945,7 @@
   /// init
   NSURLSessionWebSocketTask init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: false, release: true);
   }
@@ -59824,14 +62953,14 @@
   /// new
   static NSURLSessionWebSocketTask new1() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSURLSessionWebSocketTask, _sel_new);
+        _objc_msgSend_151sglz(_class_NSURLSessionWebSocketTask, _sel_new);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSURLSessionWebSocketTask allocWithZone_(ffi.Pointer<_NSZone> zone) {
-    final _ret = _objc_msgSend_hzlb60(
+    final _ret = _objc_msgSend_1cwp428(
         _class_NSURLSessionWebSocketTask, _sel_allocWithZone_, zone);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: false, release: true);
@@ -59840,28 +62969,28 @@
   /// alloc
   static NSURLSessionWebSocketTask alloc() {
     final _ret =
-        _objc_msgSend_1x359cv(_class_NSURLSessionWebSocketTask, _sel_alloc);
+        _objc_msgSend_151sglz(_class_NSURLSessionWebSocketTask, _sel_alloc);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// self
   NSURLSessionWebSocketTask self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// retain
   NSURLSessionWebSocketTask retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: true, release: true);
   }
 
   /// autorelease
   NSURLSessionWebSocketTask autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: true, release: true);
   }
@@ -59949,14 +63078,14 @@
 
   /// Returns whether [obj] is an instance of [NSURLSession].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSURLSession);
   }
 
   /// The shared session uses the currently set global NSURLCache,
   /// NSHTTPCookieStorage and NSURLCredentialStorage objects.
   static NSURLSession getSharedSession() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLSession, _sel_sharedSession);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLSession, _sel_sharedSession);
     return NSURLSession.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -59967,7 +63096,7 @@
   /// the delegate has been sent the URLSession:didBecomeInvalidWithError: message.
   static NSURLSession sessionWithConfiguration_(
       NSURLSessionConfiguration configuration) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSURLSession,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSURLSession,
         _sel_sessionWithConfiguration_, configuration.ref.pointer);
     return NSURLSession.castFromPointer(_ret, retain: true, release: true);
   }
@@ -59977,7 +63106,7 @@
       NSURLSessionConfiguration configuration,
       objc.ObjCObjectBase? delegate,
       NSOperationQueue? queue) {
-    final _ret = _objc_msgSend_582s3n(
+    final _ret = _objc_msgSend_11spmsz(
         _class_NSURLSession,
         _sel_sessionWithConfiguration_delegate_delegateQueue_,
         configuration.ref.pointer,
@@ -59988,13 +63117,13 @@
 
   /// delegateQueue
   NSOperationQueue get delegateQueue {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_delegateQueue);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_delegateQueue);
     return NSOperationQueue.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// delegate
   objc.ObjCObjectBase? get delegate {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_delegate);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_delegate);
     return _ret.address == 0
         ? null
         : objc.ObjCObjectBase(_ret, retain: true, release: true);
@@ -60002,7 +63131,7 @@
 
   /// configuration
   NSURLSessionConfiguration get configuration {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_configuration);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_configuration);
     return NSURLSessionConfiguration.castFromPointer(_ret,
         retain: true, release: true);
   }
@@ -60011,7 +63140,7 @@
   /// provide a descriptive label for the session.
   objc.NSString? get sessionDescription {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_sessionDescription);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_sessionDescription);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -60020,7 +63149,7 @@
   /// The sessionDescription property is available for the developer to
   /// provide a descriptive label for the session.
   set sessionDescription(objc.NSString? value) {
-    return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setSessionDescription_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_setSessionDescription_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
@@ -60030,7 +63159,7 @@
   /// has been issued.
   ///
   /// -finishTasksAndInvalidate and -invalidateAndCancel do not
-  /// have any effect on the shared session singleton.
+  /// have any effect on the shared session instance.
   ///
   /// When invalidating a background session, it is not safe to create another background
   /// session with the same identifier until URLSession:didBecomeInvalidWithError: has
@@ -60081,7 +63210,7 @@
 
   /// Creates a data task with the given request.  The request may have a body stream.
   NSURLSessionDataTask dataTaskWithRequest_(NSURLRequest request) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_dataTaskWithRequest_, request.ref.pointer);
     return NSURLSessionDataTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60089,7 +63218,7 @@
 
   /// Creates a data task to retrieve the contents of the given URL.
   NSURLSessionDataTask dataTaskWithURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_dataTaskWithURL_, url.ref.pointer);
     return NSURLSessionDataTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60098,7 +63227,7 @@
   /// Creates an upload task with the given request.  The body of the request will be created from the file referenced by fileURL
   NSURLSessionUploadTask uploadTaskWithRequest_fromFile_(
       NSURLRequest request, objc.NSURL fileURL) {
-    final _ret = _objc_msgSend_rsfdlh(
+    final _ret = _objc_msgSend_15qeuct(
         this.ref.pointer,
         _sel_uploadTaskWithRequest_fromFile_,
         request.ref.pointer,
@@ -60110,7 +63239,7 @@
   /// Creates an upload task with the given request.  The body of the request is provided from the bodyData.
   NSURLSessionUploadTask uploadTaskWithRequest_fromData_(
       NSURLRequest request, objc.NSData bodyData) {
-    final _ret = _objc_msgSend_rsfdlh(
+    final _ret = _objc_msgSend_15qeuct(
         this.ref.pointer,
         _sel_uploadTaskWithRequest_fromData_,
         request.ref.pointer,
@@ -60128,7 +63257,7 @@
   /// - Parameter resumeData: Resume data blob from an incomplete upload, such as data returned by the cancelByProducingResumeData: method.
   /// - Returns: A new session upload task, or nil if the resumeData is invalid.
   NSURLSessionUploadTask uploadTaskWithResumeData_(objc.NSData resumeData) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_uploadTaskWithResumeData_, resumeData.ref.pointer);
     return NSURLSessionUploadTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60136,7 +63265,7 @@
 
   /// Creates an upload task with the given request.  The previously set body stream of the request (if any) is ignored and the URLSession:task:needNewBodyStream: delegate will be called when the body payload is required.
   NSURLSessionUploadTask uploadTaskWithStreamedRequest_(NSURLRequest request) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_uploadTaskWithStreamedRequest_, request.ref.pointer);
     return NSURLSessionUploadTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60144,7 +63273,7 @@
 
   /// Creates a download task with the given request.
   NSURLSessionDownloadTask downloadTaskWithRequest_(NSURLRequest request) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_downloadTaskWithRequest_, request.ref.pointer);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60152,7 +63281,7 @@
 
   /// Creates a download task to download the contents of the given URL.
   NSURLSessionDownloadTask downloadTaskWithURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_downloadTaskWithURL_, url.ref.pointer);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60160,7 +63289,7 @@
 
   /// Creates a download task with the resume data.  If the download cannot be successfully resumed, URLSession:task:didCompleteWithError: will be called.
   NSURLSessionDownloadTask downloadTaskWithResumeData_(objc.NSData resumeData) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_downloadTaskWithResumeData_, resumeData.ref.pointer);
     return NSURLSessionDownloadTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60169,7 +63298,7 @@
   /// Creates a bidirectional stream task to a given host and port.
   NSURLSessionStreamTask streamTaskWithHostName_port_(
       objc.NSString hostname, DartNSInteger port) {
-    final _ret = _objc_msgSend_1i26p99(this.ref.pointer,
+    final _ret = _objc_msgSend_9slupp(this.ref.pointer,
         _sel_streamTaskWithHostName_port_, hostname.ref.pointer, port);
     return NSURLSessionStreamTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60178,7 +63307,7 @@
   /// Creates a bidirectional stream task with an NSNetService to identify the endpoint.
   /// The NSNetService will be resolved before any IO completes.
   NSURLSessionStreamTask streamTaskWithNetService_(NSNetService service) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_streamTaskWithNetService_, service.ref.pointer);
     return NSURLSessionStreamTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60186,7 +63315,7 @@
 
   /// Creates a WebSocket task given the url. The given url must have a ws or wss scheme.
   NSURLSessionWebSocketTask webSocketTaskWithURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_webSocketTaskWithURL_, url.ref.pointer);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60197,7 +63326,7 @@
   /// Note - The protocol will not affect the WebSocket framing. More details on the protocol can be found by reading the WebSocket RFC
   NSURLSessionWebSocketTask webSocketTaskWithURL_protocols_(
       objc.NSURL url, objc.ObjCObjectBase protocols) {
-    final _ret = _objc_msgSend_rsfdlh(
+    final _ret = _objc_msgSend_15qeuct(
         this.ref.pointer,
         _sel_webSocketTaskWithURL_protocols_,
         url.ref.pointer,
@@ -60210,7 +63339,7 @@
   /// Clients who want to add custom protocols can do so by directly adding headers with the key Sec-WebSocket-Protocol
   /// and a comma separated list of protocols they wish to negotiate with the server. The custom HTTP headers provided by the client will remain unchanged for the handshake with the server.
   NSURLSessionWebSocketTask webSocketTaskWithRequest_(NSURLRequest request) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_webSocketTaskWithRequest_, request.ref.pointer);
     return NSURLSessionWebSocketTask.castFromPointer(_ret,
         retain: true, release: true);
@@ -60219,44 +63348,44 @@
   /// init
   NSURLSession init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSURLSession.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// new
   static NSURLSession new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLSession, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLSession, _sel_new);
     return NSURLSession.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSURLSession allocWithZone_(ffi.Pointer<_NSZone> zone) {
     final _ret =
-        _objc_msgSend_hzlb60(_class_NSURLSession, _sel_allocWithZone_, zone);
+        _objc_msgSend_1cwp428(_class_NSURLSession, _sel_allocWithZone_, zone);
     return NSURLSession.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// alloc
   static NSURLSession alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSURLSession, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSURLSession, _sel_alloc);
     return NSURLSession.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// self
   NSURLSession self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSURLSession.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// retain
   NSURLSession retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSURLSession.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// autorelease
   NSURLSession autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSURLSession.castFromPointer(_ret, retain: true, release: true);
   }
 }
@@ -60375,6 +63504,37 @@
                 ffi.Pointer<objc.ObjCBlockImpl>, NSInteger)>.listener(
         _ObjCBlock_ffiVoid_NSURLSessionResponseDisposition_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSURLSessionResponseDisposition_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    int arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(int))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, NSInteger)>
+    _ObjCBlock_ffiVoid_NSURLSessionResponseDisposition_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, NSInteger)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSURLSessionResponseDisposition_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>, ffi.Pointer<ffi.Void>, NSInteger)>
+    _ObjCBlock_ffiVoid_NSURLSessionResponseDisposition_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, NSInteger)>.listener(
+        _ObjCBlock_ffiVoid_NSURLSessionResponseDisposition_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(NSInteger)>`.
 abstract final class ObjCBlock_ffiVoid_NSURLSessionResponseDisposition {
@@ -60437,6 +63597,35 @@
     return objc.ObjCBlock<ffi.Void Function(NSInteger)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(NSInteger)> blocking(
+      void Function(NSURLSessionResponseDisposition) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLSessionResponseDisposition_blockingCallable
+            .nativeFunction
+            .cast(),
+        (int arg0) => fn(NSURLSessionResponseDisposition.fromValue(arg0)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLSessionResponseDisposition_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (int arg0) => fn(NSURLSessionResponseDisposition.fromValue(arg0)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_16sve1d, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(NSInteger)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(NSInteger)>`.
@@ -60552,6 +63741,71 @@
                 ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3,
+        ffi.Pointer<objc.ObjCBlockImpl> arg4) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCBlockImpl>))(arg0, arg1, arg2, arg3, arg4);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, NSURLResponse, objc.ObjCBlock<ffi.Void Function(NSInteger)>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition {
@@ -60653,7 +63907,7 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_NSURLSessionResponseDisposition
                     .castFromPointer(arg4, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1f43wec(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xx612k(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -60664,6 +63918,77 @@
                 objc.ObjCBlock<ffi.Void Function(NSInteger)>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<ffi.Void>,
+          NSURLSession,
+          NSURLSessionDataTask,
+          NSURLResponse,
+          objc.ObjCBlock<ffi.Void Function(NSInteger)>)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask,
+              NSURLResponse, objc.ObjCBlock<ffi.Void Function(NSInteger)>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLResponse.castFromPointer(arg3,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLSessionResponseDisposition
+                    .castFromPointer(arg4, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLResponse.castFromPointer(arg3,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLSessionResponseDisposition
+                    .castFromPointer(arg4, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xx612k, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<ffi.Void>,
+                NSURLSession,
+                NSURLSessionDataTask,
+                NSURLResponse,
+                objc.ObjCBlock<ffi.Void Function(NSInteger)>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, NSURLResponse, objc.ObjCBlock<ffi.Void Function(NSInteger)>)>`.
@@ -60796,6 +64121,65 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask {
@@ -60878,7 +64262,7 @@
                     retain: false, release: true),
                 NSURLSessionDownloadTask.castFromPointer(arg3,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -60887,6 +64271,65 @@
             NSURLSessionDataTask,
             NSURLSessionDownloadTask)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+          NSURLSessionDataTask, NSURLSessionDownloadTask)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask,
+              NSURLSessionDownloadTask)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLSessionDownloadTask.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLSessionDownloadTask.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionDataTask,
+            NSURLSessionDownloadTask)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask)>`.
@@ -61004,6 +64447,65 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, NSURLSessionStreamTask)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask {
@@ -61086,7 +64588,7 @@
                     retain: false, release: true),
                 NSURLSessionStreamTask.castFromPointer(arg3,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -61095,6 +64597,65 @@
             NSURLSessionDataTask,
             NSURLSessionStreamTask)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+          NSURLSessionDataTask, NSURLSessionStreamTask)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask,
+              NSURLSessionStreamTask)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLSessionStreamTask.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLSessionStreamTask.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionDataTask,
+            NSURLSessionStreamTask)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, NSURLSessionStreamTask)>`.
@@ -61212,6 +64773,65 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, objc.NSData)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData {
@@ -61296,7 +64916,7 @@
                     retain: false, release: true),
                 objc.NSData.castFromPointer(arg3,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -61305,6 +64925,65 @@
             NSURLSessionDataTask,
             objc.NSData)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+          NSURLSessionDataTask, objc.NSData)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask,
+              objc.NSData)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                objc.NSData.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                objc.NSData.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionDataTask,
+            objc.NSData)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, objc.NSData)>`.
@@ -61434,6 +65113,71 @@
                 ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3,
+        ffi.Pointer<objc.ObjCBlockImpl> arg4) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCBlockImpl>))(arg0, arg1, arg2, arg3, arg4);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, NSCachedURLResponse, objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse {
@@ -61539,7 +65283,7 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_NSCachedURLResponse.castFromPointer(arg4,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1f43wec(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xx612k(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -61552,6 +65296,83 @@
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<ffi.Void>,
+          NSURLSession,
+          NSURLSessionDataTask,
+          NSCachedURLResponse,
+          objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>)> blocking(
+      void Function(
+              ffi.Pointer<ffi.Void>,
+              NSURLSession,
+              NSURLSessionDataTask,
+              NSCachedURLResponse,
+              objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSCachedURLResponse.castFromPointer(arg3,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSCachedURLResponse.castFromPointer(arg4,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDataTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSCachedURLResponse.castFromPointer(arg3,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSCachedURLResponse.castFromPointer(arg4,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xx612k, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<ffi.Void>,
+                NSURLSession,
+                NSURLSessionDataTask,
+                NSCachedURLResponse,
+                objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDataTask, NSCachedURLResponse, objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>)>`.
@@ -61669,6 +65490,59 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask {
@@ -61745,12 +65619,58 @@
                     retain: false, release: true),
                 NSURLSessionTask.castFromPointer(arg2,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_ao4xm9(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_fjrv01(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
             NSURLSessionTask)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_fjrv01, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+            NSURLSessionTask)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask)>`.
@@ -61829,6 +65749,46 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        int arg0,
+        ffi.Pointer<objc.ObjCObject> arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        int, ffi.Pointer<objc.ObjCObject>))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, NSInteger, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                NSInteger,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, NSInteger, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                NSInteger,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>`.
 abstract final class ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest {
@@ -61894,11 +65854,50 @@
                 ? null
                 : NSURLRequest.castFromPointer(arg1,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_mn1xu3(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1otpo83(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)> blocking(
+      void Function(NSURLSessionDelayedRequestDisposition, NSURLRequest?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest_blockingCallable
+            .nativeFunction
+            .cast(),
+        (int arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
+            NSURLSessionDelayedRequestDisposition.fromValue(arg0),
+            arg1.address == 0
+                ? null
+                : NSURLRequest.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (int arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
+            NSURLSessionDelayedRequestDisposition.fromValue(arg0),
+            arg1.address == 0
+                ? null
+                : NSURLRequest.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1otpo83, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>`.
@@ -62018,6 +66017,71 @@
                 ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3,
+        ffi.Pointer<objc.ObjCBlockImpl> arg4) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCBlockImpl>))(arg0, arg1, arg2, arg3, arg4);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest {
@@ -62124,7 +66188,7 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest
                     .castFromPointer(arg4, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1f43wec(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xx612k(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -62137,6 +66201,84 @@
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+          ffi.Void Function(
+              ffi.Pointer<ffi.Void>,
+              NSURLSession,
+              NSURLSessionTask,
+              NSURLRequest,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)>
+      blocking(
+          void Function(
+                  ffi.Pointer<ffi.Void>,
+                  NSURLSession,
+                  NSURLSessionTask,
+                  NSURLRequest,
+                  objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)
+              fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLRequest.castFromPointer(arg3,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest
+                    .castFromPointer(arg4, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLRequest.castFromPointer(arg3,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLSessionDelayedRequestDisposition_NSURLRequest
+                    .castFromPointer(arg4, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xx612k, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<ffi.Void>,
+                NSURLSession,
+                NSURLSessionTask,
+                NSURLRequest,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)>`.
@@ -62185,7 +66327,7 @@
 late final _class_NSHTTPURLResponse = objc.getClass("NSHTTPURLResponse");
 late final _sel_initWithURL_statusCode_HTTPVersion_headerFields_ =
     objc.registerName("initWithURL:statusCode:HTTPVersion:headerFields:");
-final _objc_msgSend_1pmy6mh = objc.msgSendPointer
+final _objc_msgSend_xw7l5 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -62207,7 +66349,7 @@
 late final _sel_allHeaderFields = objc.registerName("allHeaderFields");
 late final _sel_localizedStringForStatusCode_ =
     objc.registerName("localizedStringForStatusCode:");
-final _objc_msgSend_8o14b = objc.msgSendPointer
+final _objc_msgSend_qugqlf = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -62233,7 +66375,7 @@
 
   /// Returns whether [obj] is an instance of [NSHTTPURLResponse].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSHTTPURLResponse);
   }
 
@@ -62251,7 +66393,7 @@
       DartNSInteger statusCode,
       objc.NSString? HTTPVersion,
       objc.NSDictionary? headerFields) {
-    final _ret = _objc_msgSend_1pmy6mh(
+    final _ret = _objc_msgSend_xw7l5(
         this.ref.retainAndReturnPointer(),
         _sel_initWithURL_statusCode_HTTPVersion_headerFields_,
         url.ref.pointer,
@@ -62280,7 +66422,7 @@
   /// @result A dictionary containing all the HTTP header fields of the
   /// receiver.
   objc.NSDictionary get allHeaderFields {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_allHeaderFields);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_allHeaderFields);
     return objc.NSDictionary.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -62294,7 +66436,7 @@
   /// @result the value associated with the given header field, or nil if
   /// there is no value associated with the given header field.
   objc.NSString? valueForHTTPHeaderField_(objc.NSString field) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_valueForHTTPHeaderField_, field.ref.pointer);
     return _ret.address == 0
         ? null
@@ -62308,7 +66450,7 @@
   /// @param statusCode the status code to use to produce a localized string.
   /// @result A localized string corresponding to the given status code.
   static objc.NSString localizedStringForStatusCode_(DartNSInteger statusCode) {
-    final _ret = _objc_msgSend_8o14b(_class_NSHTTPURLResponse,
+    final _ret = _objc_msgSend_qugqlf(_class_NSHTTPURLResponse,
         _sel_localizedStringForStatusCode_, statusCode);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -62328,7 +66470,7 @@
           objc.NSString? MIMEType,
           DartNSInteger length,
           objc.NSString? name) {
-    final _ret = _objc_msgSend_13tl325(
+    final _ret = _objc_msgSend_l9ppnx(
         this.ref.retainAndReturnPointer(),
         _sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_,
         URL.ref.pointer,
@@ -62342,21 +66484,21 @@
   /// init
   NSHTTPURLResponse init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSHTTPURLResponse.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// new
   static NSHTTPURLResponse new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSHTTPURLResponse, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSHTTPURLResponse, _sel_new);
     return NSHTTPURLResponse.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSHTTPURLResponse allocWithZone_(ffi.Pointer<_NSZone> zone) {
-    final _ret = _objc_msgSend_hzlb60(
+    final _ret = _objc_msgSend_1cwp428(
         _class_NSHTTPURLResponse, _sel_allocWithZone_, zone);
     return NSHTTPURLResponse.castFromPointer(_ret,
         retain: false, release: true);
@@ -62364,26 +66506,26 @@
 
   /// alloc
   static NSHTTPURLResponse alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSHTTPURLResponse, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSHTTPURLResponse, _sel_alloc);
     return NSHTTPURLResponse.castFromPointer(_ret,
         retain: false, release: true);
   }
 
   /// self
   NSHTTPURLResponse self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSHTTPURLResponse.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// retain
   NSHTTPURLResponse retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSHTTPURLResponse.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// autorelease
   NSHTTPURLResponse autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSHTTPURLResponse.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -62395,7 +66537,7 @@
 
   /// initWithCoder:
   NSHTTPURLResponse? initWithCoder_(objc.NSCoder coder) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithCoder_, coder.ref.pointer);
     return _ret.address == 0
         ? null
@@ -62443,6 +66585,39 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSURLRequest_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSURLRequest_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURLRequest_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSURLRequest_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURLRequest_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSURLRequest_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>`.
 abstract final class ObjCBlock_ffiVoid_NSURLRequest {
@@ -62504,11 +66679,43 @@
             ? null
             : NSURLRequest.castFromPointer(arg0,
                 retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(NSURLRequest?)> blocking(
+      void Function(NSURLRequest?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLRequest_blockingCallable.nativeFunction.cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : NSURLRequest.castFromPointer(arg0,
+                retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLRequest_blockingListenerCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : NSURLRequest.castFromPointer(arg0,
+                retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>`.
@@ -62639,6 +66846,77 @@
                 ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3,
+        ffi.Pointer<objc.ObjCObject> arg4,
+        ffi.Pointer<objc.ObjCBlockImpl> arg5) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCBlockImpl>))(arg0, arg1, arg2, arg3, arg4, arg5);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest {
@@ -62754,7 +67032,7 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_NSURLRequest.castFromPointer(arg5,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_13vswqm(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_l2g8ke(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -62766,6 +67044,90 @@
                 objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<ffi.Void>,
+          NSURLSession,
+          NSURLSessionTask,
+          NSHTTPURLResponse,
+          NSURLRequest,
+          objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)> blocking(
+      void Function(
+              ffi.Pointer<ffi.Void>,
+              NSURLSession,
+              NSURLSessionTask,
+              NSHTTPURLResponse,
+              NSURLRequest,
+              objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCObject> arg4,
+                ffi.Pointer<objc.ObjCBlockImpl> arg5) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSHTTPURLResponse.castFromPointer(arg3,
+                    retain: false, release: true),
+                NSURLRequest.castFromPointer(arg4,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLRequest.castFromPointer(arg5,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCObject> arg4,
+                ffi.Pointer<objc.ObjCBlockImpl> arg5) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSHTTPURLResponse.castFromPointer(arg3,
+                    retain: false, release: true),
+                NSURLRequest.castFromPointer(arg4,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLRequest.castFromPointer(arg5,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_l2g8ke, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<ffi.Void>,
+                NSURLSession,
+                NSURLSessionTask,
+                NSHTTPURLResponse,
+                NSURLRequest,
+                objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)>`.
@@ -62906,6 +67268,46 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        int arg0,
+        ffi.Pointer<objc.ObjCObject> arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        int, ffi.Pointer<objc.ObjCObject>))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, NSInteger, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                NSInteger,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, NSInteger, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                NSInteger,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>`.
 abstract final class ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential {
@@ -62975,13 +67377,56 @@
                 ? null
                 : NSURLCredential.castFromPointer(arg1,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_37btrl(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_n8yd09(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>(
         wrapper,
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>
+      blocking(
+          void Function(NSURLSessionAuthChallengeDisposition, NSURLCredential?)
+              fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential_blockingCallable
+            .nativeFunction
+            .cast(),
+        (int arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
+            NSURLSessionAuthChallengeDisposition.fromValue(arg0),
+            arg1.address == 0
+                ? null
+                : NSURLCredential.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (int arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
+            NSURLSessionAuthChallengeDisposition.fromValue(arg0),
+            arg1.address == 0
+                ? null
+                : NSURLCredential.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_n8yd09, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>`.
@@ -63100,6 +67545,71 @@
                 ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3,
+        ffi.Pointer<objc.ObjCBlockImpl> arg4) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCBlockImpl>))(arg0, arg1, arg2, arg3, arg4);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential {
@@ -63206,7 +67716,7 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential
                     .castFromPointer(arg4, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1f43wec(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xx612k(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -63218,6 +67728,83 @@
                     ffi.Void Function(NSInteger, NSURLCredential?)>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<ffi.Void>,
+          NSURLSession,
+          NSURLSessionTask,
+          NSURLAuthenticationChallenge,
+          objc.ObjCBlock<
+              ffi.Void Function(NSInteger, NSURLCredential?)>)> blocking(
+      void Function(
+              ffi.Pointer<ffi.Void>,
+              NSURLSession,
+              NSURLSessionTask,
+              NSURLAuthenticationChallenge,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLAuthenticationChallenge.castFromPointer(arg3,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential
+                    .castFromPointer(arg4, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLAuthenticationChallenge.castFromPointer(arg3,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential
+                    .castFromPointer(arg4, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xx612k, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<ffi.Void>,
+                NSURLSession,
+                NSURLSessionTask,
+                NSURLAuthenticationChallenge,
+                objc.ObjCBlock<
+                    ffi.Void Function(NSInteger, NSURLCredential?)>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)>`.
@@ -63297,6 +67884,39 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSInputStream_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSInputStream_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSInputStream_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSInputStream_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSInputStream_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSInputStream_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>`.
 abstract final class ObjCBlock_ffiVoid_NSInputStream {
@@ -63358,11 +67978,43 @@
             ? null
             : objc.NSInputStream.castFromPointer(arg0,
                 retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1jdvcbf(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_xtuoz7(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)> blocking(
+      void Function(objc.NSInputStream?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSInputStream_blockingCallable.nativeFunction.cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : objc.NSInputStream.castFromPointer(arg0,
+                retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSInputStream_blockingListenerCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0) => fn(arg0.address == 0
+            ? null
+            : objc.NSInputStream.castFromPointer(arg0,
+                retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_xtuoz7, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>`.
@@ -63468,6 +68120,65 @@
                 ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCBlockImpl> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCBlockImpl>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream {
@@ -63558,7 +68269,7 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_NSInputStream.castFromPointer(arg3,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_12nszru(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_bklti2(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -63570,6 +68281,68 @@
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+          objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+              objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCBlockImpl> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSInputStream.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCBlockImpl> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSInputStream.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_bklti2, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<ffi.Void>,
+                NSURLSession,
+                NSURLSessionTask,
+                objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)>`.
@@ -63703,6 +68476,71 @@
                 ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        int arg3,
+        ffi.Pointer<objc.ObjCBlockImpl> arg4) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        int,
+        ffi.Pointer<objc.ObjCBlockImpl>))(arg0, arg1, arg2, arg3, arg4);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Int64,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Int64,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Int64,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Int64,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, ffi.Int64, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream {
@@ -63800,7 +68638,7 @@
                 arg3,
                 ObjCBlock_ffiVoid_NSInputStream.castFromPointer(arg4,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_qm01og(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_jyim80(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -63813,6 +68651,77 @@
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<ffi.Void>,
+          NSURLSession,
+          NSURLSessionTask,
+          ffi.Int64,
+          objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, int,
+              objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                int arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                ObjCBlock_ffiVoid_NSInputStream.castFromPointer(arg4,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                int arg3,
+                ffi.Pointer<objc.ObjCBlockImpl> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                ObjCBlock_ffiVoid_NSInputStream.castFromPointer(arg4,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_jyim80, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<ffi.Void>,
+                NSURLSession,
+                NSURLSessionTask,
+                ffi.Int64,
+                objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, ffi.Int64, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)>`.
@@ -63963,6 +68872,77 @@
                 ffi.Int64)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        int arg3,
+        int arg4,
+        int arg5) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        int,
+        int,
+        int))(arg0, arg1, arg2, arg3, arg4, arg5);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Int64,
+            ffi.Int64,
+            ffi.Int64)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Int64,
+                ffi.Int64,
+                ffi.Int64)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Int64,
+            ffi.Int64,
+            ffi.Int64)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Int64,
+                ffi.Int64,
+                ffi.Int64)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, ffi.Int64, ffi.Int64, ffi.Int64)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64 {
@@ -64060,7 +69040,7 @@
                 arg3,
                 arg4,
                 arg5));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1uuez7b(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_h68abb(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -64071,6 +69051,73 @@
             ffi.Int64,
             ffi.Int64)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+          ffi.Int64, ffi.Int64, ffi.Int64)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, int,
+              int, int)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                int arg3,
+                int arg4,
+                int arg5) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                arg4,
+                arg5));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                int arg3,
+                int arg4,
+                int arg5) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                arg4,
+                arg5));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_h68abb, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionTask,
+            ffi.Int64,
+            ffi.Int64,
+            ffi.Int64)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, ffi.Int64, ffi.Int64, ffi.Int64)>`.
@@ -64192,6 +69239,65 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSHTTPURLResponse)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse {
@@ -64275,12 +69381,68 @@
                     retain: false, release: true),
                 NSHTTPURLResponse.castFromPointer(arg3,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
             NSHTTPURLResponse)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+          NSHTTPURLResponse)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+              NSHTTPURLResponse)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSHTTPURLResponse.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSHTTPURLResponse.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+            NSHTTPURLResponse)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSHTTPURLResponse)>`.
@@ -64417,6 +69579,65 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics {
@@ -64499,12 +69720,68 @@
                     retain: false, release: true),
                 NSURLSessionTaskMetrics.castFromPointer(arg3,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
             NSURLSessionTaskMetrics)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+          NSURLSessionTaskMetrics)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+              NSURLSessionTaskMetrics)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLSessionTaskMetrics.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                NSURLSessionTaskMetrics.castFromPointer(arg3,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+            NSURLSessionTaskMetrics)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)>`.
@@ -64622,6 +69899,65 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, objc.NSError?)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError {
@@ -64708,12 +70044,72 @@
                     ? null
                     : objc.NSError.castFromPointer(arg3,
                         retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
             objc.NSError?)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+          objc.NSError?)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+              objc.NSError?)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg3,
+                        retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg3,
+                        retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask,
+            objc.NSError?)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionTask, objc.NSError?)>`.
@@ -64815,6 +70211,58 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<ffi.Void> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1,
+    ffi.Pointer<objc.ObjCObject> arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, objc.NSError?)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError {
@@ -64889,12 +70337,62 @@
                     ? null
                     : objc.NSError.castFromPointer(arg2,
                         retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_ao4xm9(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_fjrv01(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
             objc.NSError?)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<ffi.Void>, NSURLSession, objc.NSError?)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession, objc.NSError?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                arg2.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg2,
+                        retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                arg2.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg2,
+                        retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_fjrv01, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+            objc.NSError?)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, objc.NSError?)>`.
@@ -65009,6 +70507,65 @@
                 ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCBlockImpl> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCBlockImpl>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCBlockImpl>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCBlockImpl>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential {
@@ -65106,7 +70663,7 @@
                     retain: false, release: true),
                 ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential
                     .castFromPointer(arg3, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_12nszru(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_bklti2(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(
@@ -65117,6 +70674,74 @@
                     ffi.Void Function(NSInteger, NSURLCredential?)>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          ffi.Pointer<ffi.Void>,
+          NSURLSession,
+          NSURLAuthenticationChallenge,
+          objc.ObjCBlock<
+              ffi.Void Function(NSInteger, NSURLCredential?)>)> blocking(
+      void Function(
+              ffi.Pointer<ffi.Void>,
+              NSURLSession,
+              NSURLAuthenticationChallenge,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCBlockImpl> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLAuthenticationChallenge.castFromPointer(arg2,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential
+                    .castFromPointer(arg3, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCBlockImpl> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLAuthenticationChallenge.castFromPointer(arg2,
+                    retain: false, release: true),
+                ObjCBlock_ffiVoid_NSURLSessionAuthChallengeDisposition_NSURLCredential
+                    .castFromPointer(arg3, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_bklti2, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(
+                ffi.Pointer<ffi.Void>,
+                NSURLSession,
+                NSURLAuthenticationChallenge,
+                objc.ObjCBlock<
+                    ffi.Void Function(NSInteger, NSURLCredential?)>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)>`.
@@ -65202,6 +70827,51 @@
                 ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<ffi.Void> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>, ffi.Pointer<objc.ObjCObject>))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession {
@@ -65265,12 +70935,45 @@
         (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
             arg0,
             NSURLSession.castFromPointer(arg1, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_wjovn7(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_18v1jvf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession)>
+      blocking(void Function(ffi.Pointer<ffi.Void>, NSURLSession) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_blockingCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
+            arg0,
+            NSURLSession.castFromPointer(arg1, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1) => fn(
+            arg0,
+            NSURLSession.castFromPointer(arg1, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_18v1jvf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession)>`.
@@ -65653,6 +71356,192 @@
             builder, URLSessionDidFinishEventsForBackgroundURLSession_);
   }
 
+  /// Builds an object that implements the NSURLSessionDataDelegate protocol. To implement
+  /// multiple protocols, use [addToBuilder] or [objc.ObjCProtocolBuilder] directly. All
+  /// methods that can be implemented as blocking listeners will be.
+  static objc.ObjCObjectBase implementAsBlocking(
+      {void Function(NSURLSession, NSURLSessionDataTask, NSURLResponse, objc.ObjCBlock<ffi.Void Function(NSInteger)>)?
+          URLSession_dataTask_didReceiveResponse_completionHandler_,
+      void Function(NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask)?
+          URLSession_dataTask_didBecomeDownloadTask_,
+      void Function(NSURLSession, NSURLSessionDataTask, NSURLSessionStreamTask)?
+          URLSession_dataTask_didBecomeStreamTask_,
+      void Function(NSURLSession, NSURLSessionDataTask, objc.NSData)?
+          URLSession_dataTask_didReceiveData_,
+      void Function(NSURLSession, NSURLSessionDataTask, NSCachedURLResponse,
+              objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>)?
+          URLSession_dataTask_willCacheResponse_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask)? URLSession_didCreateTask_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)?
+          URLSession_task_willBeginDelayedRequest_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask)?
+          URLSession_taskIsWaitingForConnectivity_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+              NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)?
+          URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)? URLSession_task_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)? URLSession_task_needNewBodyStream_,
+      void Function(NSURLSession, NSURLSessionTask, int, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)? URLSession_task_needNewBodyStreamFromOffset_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, int, int, int)? URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse)? URLSession_task_didReceiveInformationalResponse_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)? URLSession_task_didFinishCollectingMetrics_,
+      void Function(NSURLSession, NSURLSessionTask, objc.NSError?)? URLSession_task_didCompleteWithError_,
+      void Function(NSURLSession, objc.NSError?)? URLSession_didBecomeInvalidWithError_,
+      void Function(NSURLSession, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)? URLSession_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession)? URLSessionDidFinishEventsForBackgroundURLSession_}) {
+    final builder = objc.ObjCProtocolBuilder();
+    NSURLSessionDataDelegate
+            .URLSession_dataTask_didReceiveResponse_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_dataTask_didReceiveResponse_completionHandler_);
+    NSURLSessionDataDelegate.URLSession_dataTask_didBecomeDownloadTask_
+        .implementAsBlocking(
+            builder, URLSession_dataTask_didBecomeDownloadTask_);
+    NSURLSessionDataDelegate.URLSession_dataTask_didBecomeStreamTask_
+        .implementAsBlocking(builder, URLSession_dataTask_didBecomeStreamTask_);
+    NSURLSessionDataDelegate.URLSession_dataTask_didReceiveData_
+        .implementAsBlocking(builder, URLSession_dataTask_didReceiveData_);
+    NSURLSessionDataDelegate
+            .URLSession_dataTask_willCacheResponse_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_dataTask_willCacheResponse_completionHandler_);
+    NSURLSessionDataDelegate.URLSession_didCreateTask_.implementAsBlocking(
+        builder, URLSession_didCreateTask_);
+    NSURLSessionDataDelegate
+            .URLSession_task_willBeginDelayedRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willBeginDelayedRequest_completionHandler_);
+    NSURLSessionDataDelegate.URLSession_taskIsWaitingForConnectivity_
+        .implementAsBlocking(builder, URLSession_taskIsWaitingForConnectivity_);
+    NSURLSessionDataDelegate
+            .URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_);
+    NSURLSessionDataDelegate
+            .URLSession_task_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveChallenge_completionHandler_);
+    NSURLSessionDataDelegate.URLSession_task_needNewBodyStream_
+        .implementAsBlocking(builder, URLSession_task_needNewBodyStream_);
+    NSURLSessionDataDelegate
+            .URLSession_task_needNewBodyStreamFromOffset_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_needNewBodyStreamFromOffset_completionHandler_);
+    NSURLSessionDataDelegate
+            .URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_
+        .implementAsBlocking(builder,
+            URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_);
+    NSURLSessionDataDelegate.URLSession_task_didReceiveInformationalResponse_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveInformationalResponse_);
+    NSURLSessionDataDelegate.URLSession_task_didFinishCollectingMetrics_
+        .implementAsBlocking(
+            builder, URLSession_task_didFinishCollectingMetrics_);
+    NSURLSessionDataDelegate.URLSession_task_didCompleteWithError_
+        .implementAsBlocking(builder, URLSession_task_didCompleteWithError_);
+    NSURLSessionDataDelegate.URLSession_didBecomeInvalidWithError_
+        .implementAsBlocking(builder, URLSession_didBecomeInvalidWithError_);
+    NSURLSessionDataDelegate.URLSession_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_didReceiveChallenge_completionHandler_);
+    NSURLSessionDataDelegate.URLSessionDidFinishEventsForBackgroundURLSession_
+        .implementAsBlocking(
+            builder, URLSessionDidFinishEventsForBackgroundURLSession_);
+    return builder.build();
+  }
+
+  /// Adds the implementation of the NSURLSessionDataDelegate protocol to an existing
+  /// [objc.ObjCProtocolBuilder]. All methods that can be implemented as blocking
+  /// listeners will be.
+  static void addToBuilderAsBlocking(objc.ObjCProtocolBuilder builder,
+      {void Function(NSURLSession, NSURLSessionDataTask, NSURLResponse, objc.ObjCBlock<ffi.Void Function(NSInteger)>)?
+          URLSession_dataTask_didReceiveResponse_completionHandler_,
+      void Function(NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask)?
+          URLSession_dataTask_didBecomeDownloadTask_,
+      void Function(NSURLSession, NSURLSessionDataTask, NSURLSessionStreamTask)?
+          URLSession_dataTask_didBecomeStreamTask_,
+      void Function(NSURLSession, NSURLSessionDataTask, objc.NSData)?
+          URLSession_dataTask_didReceiveData_,
+      void Function(NSURLSession, NSURLSessionDataTask, NSCachedURLResponse,
+              objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>)?
+          URLSession_dataTask_willCacheResponse_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask)? URLSession_didCreateTask_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)?
+          URLSession_task_willBeginDelayedRequest_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask)?
+          URLSession_taskIsWaitingForConnectivity_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+              NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)?
+          URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)? URLSession_task_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)? URLSession_task_needNewBodyStream_,
+      void Function(NSURLSession, NSURLSessionTask, int, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)? URLSession_task_needNewBodyStreamFromOffset_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, int, int, int)? URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse)? URLSession_task_didReceiveInformationalResponse_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)? URLSession_task_didFinishCollectingMetrics_,
+      void Function(NSURLSession, NSURLSessionTask, objc.NSError?)? URLSession_task_didCompleteWithError_,
+      void Function(NSURLSession, objc.NSError?)? URLSession_didBecomeInvalidWithError_,
+      void Function(NSURLSession, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)? URLSession_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession)? URLSessionDidFinishEventsForBackgroundURLSession_}) {
+    NSURLSessionDataDelegate
+            .URLSession_dataTask_didReceiveResponse_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_dataTask_didReceiveResponse_completionHandler_);
+    NSURLSessionDataDelegate.URLSession_dataTask_didBecomeDownloadTask_
+        .implementAsBlocking(
+            builder, URLSession_dataTask_didBecomeDownloadTask_);
+    NSURLSessionDataDelegate.URLSession_dataTask_didBecomeStreamTask_
+        .implementAsBlocking(builder, URLSession_dataTask_didBecomeStreamTask_);
+    NSURLSessionDataDelegate.URLSession_dataTask_didReceiveData_
+        .implementAsBlocking(builder, URLSession_dataTask_didReceiveData_);
+    NSURLSessionDataDelegate
+            .URLSession_dataTask_willCacheResponse_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_dataTask_willCacheResponse_completionHandler_);
+    NSURLSessionDataDelegate.URLSession_didCreateTask_.implementAsBlocking(
+        builder, URLSession_didCreateTask_);
+    NSURLSessionDataDelegate
+            .URLSession_task_willBeginDelayedRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willBeginDelayedRequest_completionHandler_);
+    NSURLSessionDataDelegate.URLSession_taskIsWaitingForConnectivity_
+        .implementAsBlocking(builder, URLSession_taskIsWaitingForConnectivity_);
+    NSURLSessionDataDelegate
+            .URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_);
+    NSURLSessionDataDelegate
+            .URLSession_task_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveChallenge_completionHandler_);
+    NSURLSessionDataDelegate.URLSession_task_needNewBodyStream_
+        .implementAsBlocking(builder, URLSession_task_needNewBodyStream_);
+    NSURLSessionDataDelegate
+            .URLSession_task_needNewBodyStreamFromOffset_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_needNewBodyStreamFromOffset_completionHandler_);
+    NSURLSessionDataDelegate
+            .URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_
+        .implementAsBlocking(builder,
+            URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_);
+    NSURLSessionDataDelegate.URLSession_task_didReceiveInformationalResponse_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveInformationalResponse_);
+    NSURLSessionDataDelegate.URLSession_task_didFinishCollectingMetrics_
+        .implementAsBlocking(
+            builder, URLSession_task_didFinishCollectingMetrics_);
+    NSURLSessionDataDelegate.URLSession_task_didCompleteWithError_
+        .implementAsBlocking(builder, URLSession_task_didCompleteWithError_);
+    NSURLSessionDataDelegate.URLSession_didBecomeInvalidWithError_
+        .implementAsBlocking(builder, URLSession_didBecomeInvalidWithError_);
+    NSURLSessionDataDelegate.URLSession_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_didReceiveChallenge_completionHandler_);
+    NSURLSessionDataDelegate.URLSessionDidFinishEventsForBackgroundURLSession_
+        .implementAsBlocking(
+            builder, URLSessionDidFinishEventsForBackgroundURLSession_);
+  }
+
   /// The task has received a response and no further messages will be
   /// received until the completion block is called. The disposition
   /// allows you to cancel a request or to turn a data task into a
@@ -65692,6 +71581,16 @@
                     NSURLResponse arg3,
                     objc.ObjCBlock<ffi.Void Function(NSInteger)> arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionDataTask, NSURLResponse,
+                objc.ObjCBlock<ffi.Void Function(NSInteger)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLResponse_ffiVoidNSURLSessionResponseDisposition
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionDataTask arg2,
+                    NSURLResponse arg3,
+                    objc.ObjCBlock<ffi.Void Function(NSInteger)> arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Notification that a data task has become a download task.  No
@@ -65720,6 +71619,12 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionDataTask arg2, NSURLSessionDownloadTask arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionDownloadTask
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionDataTask arg2, NSURLSessionDownloadTask arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Notification that a data task has become a bidirectional stream
@@ -65760,6 +71665,12 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionDataTask arg2, NSURLSessionStreamTask arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionDataTask, NSURLSessionStreamTask)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSURLSessionStreamTask
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionDataTask arg2, NSURLSessionStreamTask arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Sent when data is available for the delegate to consume.  As the
@@ -65786,6 +71697,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionDataTask arg2, objc.NSData arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionDataTask, objc.NSData) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSData
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionDataTask arg2, objc.NSData arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Invoke the completion routine with a valid NSCachedURLResponse to
@@ -65827,6 +71743,17 @@
                     objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionDataTask, NSCachedURLResponse,
+                objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDataTask_NSCachedURLResponse_ffiVoidNSCachedURLResponse
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionDataTask arg2,
+                    NSCachedURLResponse arg3,
+                    objc.ObjCBlock<ffi.Void Function(NSCachedURLResponse?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Notification that a task has been created.  This method is the first message
@@ -65854,6 +71781,11 @@
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, NSURLSessionTask) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2) =>
+                func(arg1, arg2)),
   );
 
   /// Sent when the system is ready to begin work for a task with a delayed start
@@ -65910,6 +71842,17 @@
                     objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLRequest,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSURLRequest arg3,
+                    objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent when a task cannot start the network loading process because the current
@@ -65942,6 +71885,11 @@
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, NSURLSessionTask) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2) =>
+                func(arg1, arg2)),
   );
 
   /// An HTTP request is attempting to perform a redirection to a different
@@ -65986,6 +71934,17 @@
                     NSURLRequest arg4,
                     objc.ObjCBlock<ffi.Void Function(NSURLRequest?)> arg5) =>
                 func(arg1, arg2, arg3, arg4, arg5)),
+    (void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+                NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSHTTPURLResponse arg3,
+                    NSURLRequest arg4,
+                    objc.ObjCBlock<ffi.Void Function(NSURLRequest?)> arg5) =>
+                func(arg1, arg2, arg3, arg4, arg5)),
   );
 
   /// The task has received a request specific authentication challenge.
@@ -66031,6 +71990,18 @@
                             ffi.Void Function(NSInteger, NSURLCredential?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSURLAuthenticationChallenge arg3,
+                    objc.ObjCBlock<
+                            ffi.Void Function(NSInteger, NSURLCredential?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent if a task requires a new, unopened body stream.  This may be
@@ -66068,6 +72039,16 @@
                     objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
                         arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask,
+                objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
+                        arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Tells the delegate if a task requires a new body stream starting from the given offset. This may be
@@ -66111,6 +72092,17 @@
                     objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, int,
+                objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    int arg3,
+                    objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent periodically to notify the delegate of upload progress.  This
@@ -66136,6 +72128,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, int arg3, int arg4, int arg5) =>
                 func(arg1, arg2, arg3, arg4, arg5)),
+    (void Function(NSURLSession, NSURLSessionTask, int, int, int) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, int arg3, int arg4, int arg5) =>
+                func(arg1, arg2, arg3, arg4, arg5)),
   );
 
   /// Sent for each informational response received except 101 switching protocols.
@@ -66160,6 +72157,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, NSHTTPURLResponse arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, NSHTTPURLResponse arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Sent when complete statistics information has been collected for the task.
@@ -66187,6 +72189,12 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, NSURLSessionTaskMetrics arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, NSURLSessionTaskMetrics arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Sent as the last message related to a specific task.  Error may be
@@ -66212,6 +72220,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, objc.NSError? arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, objc.NSError?) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, objc.NSError? arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// The last message a session receives.  A session will only become
@@ -66235,6 +72248,10 @@
         ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError.listener(
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1, objc.NSError? arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, objc.NSError?) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1, objc.NSError? arg2) =>
+                func(arg1, arg2)),
   );
 
   /// If implemented, when a connection level authentication challenge
@@ -66279,6 +72296,17 @@
                             ffi.Void Function(NSInteger, NSURLCredential?)>
                         arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLAuthenticationChallenge,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLAuthenticationChallenge arg2,
+                    objc.ObjCBlock<
+                            ffi.Void Function(NSInteger, NSURLCredential?)>
+                        arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// If an application has received an
@@ -66304,6 +72332,9 @@
     (void Function(NSURLSession) func) =>
         ObjCBlock_ffiVoid_ffiVoid_NSURLSession.listener(
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1) => func(arg1)),
+    (void Function(NSURLSession) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1) => func(arg1)),
   );
 }
 
@@ -66398,6 +72429,65 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL {
@@ -66482,7 +72572,7 @@
                     retain: false, release: true),
                 objc.NSURL
                     .castFromPointer(arg3, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -66491,6 +72581,65 @@
             NSURLSessionDownloadTask,
             objc.NSURL)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+          NSURLSessionDownloadTask, objc.NSURL)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+              NSURLSessionDownloadTask, objc.NSURL)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDownloadTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                objc.NSURL
+                    .castFromPointer(arg3, retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDownloadTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                objc.NSURL
+                    .castFromPointer(arg3, retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionDownloadTask,
+            objc.NSURL)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)>`.
@@ -66631,6 +72780,77 @@
                 ffi.Int64)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        int arg3,
+        int arg4,
+        int arg5) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        int,
+        int,
+        int))(arg0, arg1, arg2, arg3, arg4, arg5);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Int64,
+            ffi.Int64,
+            ffi.Int64)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Int64,
+                ffi.Int64,
+                ffi.Int64)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Int64,
+            ffi.Int64,
+            ffi.Int64)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Int64,
+                ffi.Int64,
+                ffi.Int64)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDownloadTask, ffi.Int64, ffi.Int64, ffi.Int64)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64 {
@@ -66728,7 +72948,7 @@
                 arg3,
                 arg4,
                 arg5));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1uuez7b(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_h68abb(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -66739,6 +72959,73 @@
             ffi.Int64,
             ffi.Int64)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+          NSURLSessionDownloadTask, ffi.Int64, ffi.Int64, ffi.Int64)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+              NSURLSessionDownloadTask, int, int, int)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                int arg3,
+                int arg4,
+                int arg5) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDownloadTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                arg4,
+                arg5));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                int arg3,
+                int arg4,
+                int arg5) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDownloadTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                arg4,
+                arg5));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_h68abb, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionDownloadTask,
+            ffi.Int64,
+            ffi.Int64,
+            ffi.Int64)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDownloadTask, ffi.Int64, ffi.Int64, ffi.Int64)>`.
@@ -66872,6 +73159,71 @@
                 ffi.Int64)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        int arg3,
+        int arg4) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        int,
+        int))(arg0, arg1, arg2, arg3, arg4);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Int64,
+            ffi.Int64)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Int64,
+                ffi.Int64)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Int64,
+            ffi.Int64)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Int64,
+                ffi.Int64)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDownloadTask, ffi.Int64, ffi.Int64)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64 {
@@ -66953,7 +73305,7 @@
                     retain: false, release: true),
                 arg3,
                 arg4));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_9qxjkl(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_ly2579(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -66963,6 +73315,62 @@
             ffi.Int64,
             ffi.Int64)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+          NSURLSessionDownloadTask, ffi.Int64, ffi.Int64)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+              NSURLSessionDownloadTask, int, int)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2, int arg3, int arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDownloadTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                arg4));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2, int arg3, int arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionDownloadTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                arg4));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_ly2579, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionDownloadTask,
+            ffi.Int64,
+            ffi.Int64)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionDownloadTask, ffi.Int64, ffi.Int64)>`.
@@ -67368,6 +73776,198 @@
             builder, URLSessionDidFinishEventsForBackgroundURLSession_);
   }
 
+  /// Builds an object that implements the NSURLSessionDownloadDelegate protocol. To implement
+  /// multiple protocols, use [addToBuilder] or [objc.ObjCProtocolBuilder] directly. All
+  /// methods that can be implemented as blocking listeners will be.
+  static objc.ObjCObjectBase implementAsBlocking(
+      {required void Function(NSURLSession, NSURLSessionDownloadTask, objc.NSURL)
+          URLSession_downloadTask_didFinishDownloadingToURL_,
+      void Function(NSURLSession, NSURLSessionDownloadTask, int, int, int)?
+          URLSession_downloadTask_didWriteData_totalBytesWritten_totalBytesExpectedToWrite_,
+      void Function(NSURLSession, NSURLSessionDownloadTask, int, int)?
+          URLSession_downloadTask_didResumeAtOffset_expectedTotalBytes_,
+      void Function(NSURLSession, NSURLSessionTask)? URLSession_didCreateTask_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLRequest,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)?
+          URLSession_task_willBeginDelayedRequest_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask)?
+          URLSession_taskIsWaitingForConnectivity_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+              NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)?
+          URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_,
+      void Function(
+              NSURLSession,
+              NSURLSessionTask,
+              NSURLAuthenticationChallenge,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)?
+          URLSession_task_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask,
+              objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)?
+          URLSession_task_needNewBodyStream_,
+      void Function(NSURLSession, NSURLSessionTask, int, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)? URLSession_task_needNewBodyStreamFromOffset_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, int, int, int)? URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse)? URLSession_task_didReceiveInformationalResponse_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)? URLSession_task_didFinishCollectingMetrics_,
+      void Function(NSURLSession, NSURLSessionTask, objc.NSError?)? URLSession_task_didCompleteWithError_,
+      void Function(NSURLSession, objc.NSError?)? URLSession_didBecomeInvalidWithError_,
+      void Function(NSURLSession, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)? URLSession_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession)? URLSessionDidFinishEventsForBackgroundURLSession_}) {
+    final builder = objc.ObjCProtocolBuilder();
+    NSURLSessionDownloadDelegate
+            .URLSession_downloadTask_didFinishDownloadingToURL_
+        .implementAsBlocking(
+            builder, URLSession_downloadTask_didFinishDownloadingToURL_);
+    NSURLSessionDownloadDelegate
+            .URLSession_downloadTask_didWriteData_totalBytesWritten_totalBytesExpectedToWrite_
+        .implementAsBlocking(builder,
+            URLSession_downloadTask_didWriteData_totalBytesWritten_totalBytesExpectedToWrite_);
+    NSURLSessionDownloadDelegate
+            .URLSession_downloadTask_didResumeAtOffset_expectedTotalBytes_
+        .implementAsBlocking(builder,
+            URLSession_downloadTask_didResumeAtOffset_expectedTotalBytes_);
+    NSURLSessionDownloadDelegate.URLSession_didCreateTask_.implementAsBlocking(
+        builder, URLSession_didCreateTask_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_willBeginDelayedRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willBeginDelayedRequest_completionHandler_);
+    NSURLSessionDownloadDelegate.URLSession_taskIsWaitingForConnectivity_
+        .implementAsBlocking(builder, URLSession_taskIsWaitingForConnectivity_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveChallenge_completionHandler_);
+    NSURLSessionDownloadDelegate.URLSession_task_needNewBodyStream_
+        .implementAsBlocking(builder, URLSession_task_needNewBodyStream_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_needNewBodyStreamFromOffset_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_needNewBodyStreamFromOffset_completionHandler_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_
+        .implementAsBlocking(builder,
+            URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_didReceiveInformationalResponse_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveInformationalResponse_);
+    NSURLSessionDownloadDelegate.URLSession_task_didFinishCollectingMetrics_
+        .implementAsBlocking(
+            builder, URLSession_task_didFinishCollectingMetrics_);
+    NSURLSessionDownloadDelegate.URLSession_task_didCompleteWithError_
+        .implementAsBlocking(builder, URLSession_task_didCompleteWithError_);
+    NSURLSessionDownloadDelegate.URLSession_didBecomeInvalidWithError_
+        .implementAsBlocking(builder, URLSession_didBecomeInvalidWithError_);
+    NSURLSessionDownloadDelegate
+            .URLSession_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_didReceiveChallenge_completionHandler_);
+    NSURLSessionDownloadDelegate
+            .URLSessionDidFinishEventsForBackgroundURLSession_
+        .implementAsBlocking(
+            builder, URLSessionDidFinishEventsForBackgroundURLSession_);
+    return builder.build();
+  }
+
+  /// Adds the implementation of the NSURLSessionDownloadDelegate protocol to an existing
+  /// [objc.ObjCProtocolBuilder]. All methods that can be implemented as blocking
+  /// listeners will be.
+  static void addToBuilderAsBlocking(objc.ObjCProtocolBuilder builder,
+      {required void Function(NSURLSession, NSURLSessionDownloadTask, objc.NSURL)
+          URLSession_downloadTask_didFinishDownloadingToURL_,
+      void Function(NSURLSession, NSURLSessionDownloadTask, int, int, int)?
+          URLSession_downloadTask_didWriteData_totalBytesWritten_totalBytesExpectedToWrite_,
+      void Function(NSURLSession, NSURLSessionDownloadTask, int, int)?
+          URLSession_downloadTask_didResumeAtOffset_expectedTotalBytes_,
+      void Function(NSURLSession, NSURLSessionTask)? URLSession_didCreateTask_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLRequest,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)?
+          URLSession_task_willBeginDelayedRequest_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask)?
+          URLSession_taskIsWaitingForConnectivity_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+              NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)?
+          URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_,
+      void Function(
+              NSURLSession,
+              NSURLSessionTask,
+              NSURLAuthenticationChallenge,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)?
+          URLSession_task_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask,
+              objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)?
+          URLSession_task_needNewBodyStream_,
+      void Function(NSURLSession, NSURLSessionTask, int, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)? URLSession_task_needNewBodyStreamFromOffset_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, int, int, int)? URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse)? URLSession_task_didReceiveInformationalResponse_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)? URLSession_task_didFinishCollectingMetrics_,
+      void Function(NSURLSession, NSURLSessionTask, objc.NSError?)? URLSession_task_didCompleteWithError_,
+      void Function(NSURLSession, objc.NSError?)? URLSession_didBecomeInvalidWithError_,
+      void Function(NSURLSession, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)? URLSession_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession)? URLSessionDidFinishEventsForBackgroundURLSession_}) {
+    NSURLSessionDownloadDelegate
+            .URLSession_downloadTask_didFinishDownloadingToURL_
+        .implementAsBlocking(
+            builder, URLSession_downloadTask_didFinishDownloadingToURL_);
+    NSURLSessionDownloadDelegate
+            .URLSession_downloadTask_didWriteData_totalBytesWritten_totalBytesExpectedToWrite_
+        .implementAsBlocking(builder,
+            URLSession_downloadTask_didWriteData_totalBytesWritten_totalBytesExpectedToWrite_);
+    NSURLSessionDownloadDelegate
+            .URLSession_downloadTask_didResumeAtOffset_expectedTotalBytes_
+        .implementAsBlocking(builder,
+            URLSession_downloadTask_didResumeAtOffset_expectedTotalBytes_);
+    NSURLSessionDownloadDelegate.URLSession_didCreateTask_.implementAsBlocking(
+        builder, URLSession_didCreateTask_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_willBeginDelayedRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willBeginDelayedRequest_completionHandler_);
+    NSURLSessionDownloadDelegate.URLSession_taskIsWaitingForConnectivity_
+        .implementAsBlocking(builder, URLSession_taskIsWaitingForConnectivity_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveChallenge_completionHandler_);
+    NSURLSessionDownloadDelegate.URLSession_task_needNewBodyStream_
+        .implementAsBlocking(builder, URLSession_task_needNewBodyStream_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_needNewBodyStreamFromOffset_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_needNewBodyStreamFromOffset_completionHandler_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_
+        .implementAsBlocking(builder,
+            URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_);
+    NSURLSessionDownloadDelegate
+            .URLSession_task_didReceiveInformationalResponse_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveInformationalResponse_);
+    NSURLSessionDownloadDelegate.URLSession_task_didFinishCollectingMetrics_
+        .implementAsBlocking(
+            builder, URLSession_task_didFinishCollectingMetrics_);
+    NSURLSessionDownloadDelegate.URLSession_task_didCompleteWithError_
+        .implementAsBlocking(builder, URLSession_task_didCompleteWithError_);
+    NSURLSessionDownloadDelegate.URLSession_didBecomeInvalidWithError_
+        .implementAsBlocking(builder, URLSession_didBecomeInvalidWithError_);
+    NSURLSessionDownloadDelegate
+            .URLSession_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_didReceiveChallenge_completionHandler_);
+    NSURLSessionDownloadDelegate
+            .URLSessionDidFinishEventsForBackgroundURLSession_
+        .implementAsBlocking(
+            builder, URLSessionDidFinishEventsForBackgroundURLSession_);
+  }
+
   /// Sent when a download task that has completed a download.  The delegate should
   /// copy or move the file at the given location to a new location as it will be
   /// removed when the delegate message returns. URLSession:task:didCompleteWithError: will
@@ -67393,6 +73993,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionDownloadTask arg2, objc.NSURL arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionDownloadTask, objc.NSURL) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_NSURL
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionDownloadTask arg2, objc.NSURL arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Sent periodically to notify the delegate of download progress.
@@ -67427,6 +74032,16 @@
                     int arg4,
                     int arg5) =>
                 func(arg1, arg2, arg3, arg4, arg5)),
+    (void Function(NSURLSession, NSURLSessionDownloadTask, int, int, int)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64_Int64
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionDownloadTask arg2,
+                    int arg3,
+                    int arg4,
+                    int arg5) =>
+                func(arg1, arg2, arg3, arg4, arg5)),
   );
 
   /// Sent when a download has been resumed. If a download failed with an
@@ -67454,6 +74069,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionDownloadTask arg2, int arg3, int arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionDownloadTask, int, int) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionDownloadTask_Int64_Int64
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionDownloadTask arg2, int arg3, int arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Notification that a task has been created.  This method is the first message
@@ -67481,6 +74101,11 @@
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, NSURLSessionTask) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2) =>
+                func(arg1, arg2)),
   );
 
   /// Sent when the system is ready to begin work for a task with a delayed start
@@ -67537,6 +74162,17 @@
                     objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLRequest,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSURLRequest arg3,
+                    objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent when a task cannot start the network loading process because the current
@@ -67569,6 +74205,11 @@
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, NSURLSessionTask) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2) =>
+                func(arg1, arg2)),
   );
 
   /// An HTTP request is attempting to perform a redirection to a different
@@ -67613,6 +74254,17 @@
                     NSURLRequest arg4,
                     objc.ObjCBlock<ffi.Void Function(NSURLRequest?)> arg5) =>
                 func(arg1, arg2, arg3, arg4, arg5)),
+    (void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+                NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSHTTPURLResponse arg3,
+                    NSURLRequest arg4,
+                    objc.ObjCBlock<ffi.Void Function(NSURLRequest?)> arg5) =>
+                func(arg1, arg2, arg3, arg4, arg5)),
   );
 
   /// The task has received a request specific authentication challenge.
@@ -67658,6 +74310,18 @@
                             ffi.Void Function(NSInteger, NSURLCredential?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSURLAuthenticationChallenge arg3,
+                    objc.ObjCBlock<
+                            ffi.Void Function(NSInteger, NSURLCredential?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent if a task requires a new, unopened body stream.  This may be
@@ -67695,6 +74359,16 @@
                     objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
                         arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask,
+                objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
+                        arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Tells the delegate if a task requires a new body stream starting from the given offset. This may be
@@ -67738,6 +74412,17 @@
                     objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, int,
+                objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    int arg3,
+                    objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent periodically to notify the delegate of upload progress.  This
@@ -67763,6 +74448,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, int arg3, int arg4, int arg5) =>
                 func(arg1, arg2, arg3, arg4, arg5)),
+    (void Function(NSURLSession, NSURLSessionTask, int, int, int) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, int arg3, int arg4, int arg5) =>
+                func(arg1, arg2, arg3, arg4, arg5)),
   );
 
   /// Sent for each informational response received except 101 switching protocols.
@@ -67787,6 +74477,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, NSHTTPURLResponse arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, NSHTTPURLResponse arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Sent when complete statistics information has been collected for the task.
@@ -67814,6 +74509,12 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, NSURLSessionTaskMetrics arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, NSURLSessionTaskMetrics arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Sent as the last message related to a specific task.  Error may be
@@ -67839,6 +74540,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, objc.NSError? arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, objc.NSError?) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, objc.NSError? arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// The last message a session receives.  A session will only become
@@ -67862,6 +74568,10 @@
         ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError.listener(
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1, objc.NSError? arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, objc.NSError?) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1, objc.NSError? arg2) =>
+                func(arg1, arg2)),
   );
 
   /// If implemented, when a connection level authentication challenge
@@ -67906,6 +74616,17 @@
                             ffi.Void Function(NSInteger, NSURLCredential?)>
                         arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLAuthenticationChallenge,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLAuthenticationChallenge arg2,
+                    objc.ObjCBlock<
+                            ffi.Void Function(NSInteger, NSURLCredential?)>
+                        arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// If an application has received an
@@ -67931,6 +74652,9 @@
     (void Function(NSURLSession) func) =>
         ObjCBlock_ffiVoid_ffiVoid_NSURLSession.listener(
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1) => func(arg1)),
+    (void Function(NSURLSession) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1) => func(arg1)),
   );
 }
 
@@ -68025,6 +74749,65 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        ffi.Pointer<objc.ObjCObject> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionWebSocketTask, objc.NSString?)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString {
@@ -68111,7 +74894,7 @@
                     ? null
                     : objc.NSString.castFromPointer(arg3,
                         retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1r3kn8f(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1tz5yf(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -68120,6 +74903,69 @@
             NSURLSessionWebSocketTask,
             objc.NSString?)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+          NSURLSessionWebSocketTask, objc.NSString?)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+              NSURLSessionWebSocketTask, objc.NSString?)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionWebSocketTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3.address == 0
+                    ? null
+                    : objc.NSString.castFromPointer(arg3,
+                        retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                ffi.Pointer<objc.ObjCObject> arg3) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionWebSocketTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3.address == 0
+                    ? null
+                    : objc.NSString.castFromPointer(arg3,
+                        retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1tz5yf, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionWebSocketTask,
+            objc.NSString?)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionWebSocketTask, objc.NSString?)>`.
@@ -68249,6 +75095,71 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        ffi.Pointer<ffi.Void> arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2,
+        int arg3,
+        ffi.Pointer<objc.ObjCObject> arg4) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<ffi.Void>,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>,
+        int,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3, arg4);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            NSInteger,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                NSInteger,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>,
+            NSInteger,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>,
+                NSInteger,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionWebSocketTask, NSInteger, objc.NSData?)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData {
@@ -68340,7 +75251,7 @@
                     ? null
                     : objc.NSData.castFromPointer(arg4,
                         retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_3lo3bb(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1lx650f(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -68350,6 +75261,74 @@
             NSInteger,
             objc.NSData?)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+          NSURLSessionWebSocketTask, NSInteger, objc.NSData?)> blocking(
+      void Function(ffi.Pointer<ffi.Void>, NSURLSession,
+              NSURLSessionWebSocketTask, DartNSInteger, objc.NSData?)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                int arg3,
+                ffi.Pointer<objc.ObjCObject> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionWebSocketTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                arg4.address == 0
+                    ? null
+                    : objc.NSData.castFromPointer(arg4,
+                        retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2,
+                int arg3,
+                ffi.Pointer<objc.ObjCObject> arg4) =>
+            fn(
+                arg0,
+                NSURLSession.castFromPointer(arg1,
+                    retain: false, release: true),
+                NSURLSessionWebSocketTask.castFromPointer(arg2,
+                    retain: false, release: true),
+                arg3,
+                arg4.address == 0
+                    ? null
+                    : objc.NSData.castFromPointer(arg4,
+                        retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1lx650f, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            ffi.Pointer<ffi.Void>,
+            NSURLSession,
+            NSURLSessionWebSocketTask,
+            NSInteger,
+            objc.NSData?)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession, NSURLSessionWebSocketTask, NSInteger, objc.NSData?)>`.
@@ -68733,6 +75712,184 @@
             builder, URLSessionDidFinishEventsForBackgroundURLSession_);
   }
 
+  /// Builds an object that implements the NSURLSessionWebSocketDelegate protocol. To implement
+  /// multiple protocols, use [addToBuilder] or [objc.ObjCProtocolBuilder] directly. All
+  /// methods that can be implemented as blocking listeners will be.
+  static objc.ObjCObjectBase implementAsBlocking(
+      {void Function(NSURLSession, NSURLSessionWebSocketTask, objc.NSString?)?
+          URLSession_webSocketTask_didOpenWithProtocol_,
+      void Function(NSURLSession, NSURLSessionWebSocketTask, DartNSInteger, objc.NSData?)?
+          URLSession_webSocketTask_didCloseWithCode_reason_,
+      void Function(NSURLSession, NSURLSessionTask)? URLSession_didCreateTask_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLRequest,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)?
+          URLSession_task_willBeginDelayedRequest_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask)?
+          URLSession_taskIsWaitingForConnectivity_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+              NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)?
+          URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_,
+      void Function(
+              NSURLSession,
+              NSURLSessionTask,
+              NSURLAuthenticationChallenge,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)?
+          URLSession_task_didReceiveChallenge_completionHandler_,
+      void Function(
+              NSURLSession, NSURLSessionTask, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)?
+          URLSession_task_needNewBodyStream_,
+      void Function(NSURLSession, NSURLSessionTask, int, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)? URLSession_task_needNewBodyStreamFromOffset_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, int, int, int)? URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse)? URLSession_task_didReceiveInformationalResponse_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)? URLSession_task_didFinishCollectingMetrics_,
+      void Function(NSURLSession, NSURLSessionTask, objc.NSError?)? URLSession_task_didCompleteWithError_,
+      void Function(NSURLSession, objc.NSError?)? URLSession_didBecomeInvalidWithError_,
+      void Function(NSURLSession, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)? URLSession_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession)? URLSessionDidFinishEventsForBackgroundURLSession_}) {
+    final builder = objc.ObjCProtocolBuilder();
+    NSURLSessionWebSocketDelegate.URLSession_webSocketTask_didOpenWithProtocol_
+        .implementAsBlocking(
+            builder, URLSession_webSocketTask_didOpenWithProtocol_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_webSocketTask_didCloseWithCode_reason_
+        .implementAsBlocking(
+            builder, URLSession_webSocketTask_didCloseWithCode_reason_);
+    NSURLSessionWebSocketDelegate.URLSession_didCreateTask_.implementAsBlocking(
+        builder, URLSession_didCreateTask_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_willBeginDelayedRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willBeginDelayedRequest_completionHandler_);
+    NSURLSessionWebSocketDelegate.URLSession_taskIsWaitingForConnectivity_
+        .implementAsBlocking(builder, URLSession_taskIsWaitingForConnectivity_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveChallenge_completionHandler_);
+    NSURLSessionWebSocketDelegate.URLSession_task_needNewBodyStream_
+        .implementAsBlocking(builder, URLSession_task_needNewBodyStream_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_needNewBodyStreamFromOffset_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_needNewBodyStreamFromOffset_completionHandler_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_
+        .implementAsBlocking(builder,
+            URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_didReceiveInformationalResponse_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveInformationalResponse_);
+    NSURLSessionWebSocketDelegate.URLSession_task_didFinishCollectingMetrics_
+        .implementAsBlocking(
+            builder, URLSession_task_didFinishCollectingMetrics_);
+    NSURLSessionWebSocketDelegate.URLSession_task_didCompleteWithError_
+        .implementAsBlocking(builder, URLSession_task_didCompleteWithError_);
+    NSURLSessionWebSocketDelegate.URLSession_didBecomeInvalidWithError_
+        .implementAsBlocking(builder, URLSession_didBecomeInvalidWithError_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_didReceiveChallenge_completionHandler_);
+    NSURLSessionWebSocketDelegate
+            .URLSessionDidFinishEventsForBackgroundURLSession_
+        .implementAsBlocking(
+            builder, URLSessionDidFinishEventsForBackgroundURLSession_);
+    return builder.build();
+  }
+
+  /// Adds the implementation of the NSURLSessionWebSocketDelegate protocol to an existing
+  /// [objc.ObjCProtocolBuilder]. All methods that can be implemented as blocking
+  /// listeners will be.
+  static void addToBuilderAsBlocking(objc.ObjCProtocolBuilder builder,
+      {void Function(NSURLSession, NSURLSessionWebSocketTask, objc.NSString?)?
+          URLSession_webSocketTask_didOpenWithProtocol_,
+      void Function(NSURLSession, NSURLSessionWebSocketTask, DartNSInteger, objc.NSData?)?
+          URLSession_webSocketTask_didCloseWithCode_reason_,
+      void Function(NSURLSession, NSURLSessionTask)? URLSession_didCreateTask_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLRequest,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)?
+          URLSession_task_willBeginDelayedRequest_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask)?
+          URLSession_taskIsWaitingForConnectivity_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+              NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)?
+          URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_,
+      void Function(
+              NSURLSession,
+              NSURLSessionTask,
+              NSURLAuthenticationChallenge,
+              objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)?
+          URLSession_task_didReceiveChallenge_completionHandler_,
+      void Function(
+              NSURLSession, NSURLSessionTask, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)?
+          URLSession_task_needNewBodyStream_,
+      void Function(NSURLSession, NSURLSessionTask, int, objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)? URLSession_task_needNewBodyStreamFromOffset_completionHandler_,
+      void Function(NSURLSession, NSURLSessionTask, int, int, int)? URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_,
+      void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse)? URLSession_task_didReceiveInformationalResponse_,
+      void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)? URLSession_task_didFinishCollectingMetrics_,
+      void Function(NSURLSession, NSURLSessionTask, objc.NSError?)? URLSession_task_didCompleteWithError_,
+      void Function(NSURLSession, objc.NSError?)? URLSession_didBecomeInvalidWithError_,
+      void Function(NSURLSession, NSURLAuthenticationChallenge, objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)? URLSession_didReceiveChallenge_completionHandler_,
+      void Function(NSURLSession)? URLSessionDidFinishEventsForBackgroundURLSession_}) {
+    NSURLSessionWebSocketDelegate.URLSession_webSocketTask_didOpenWithProtocol_
+        .implementAsBlocking(
+            builder, URLSession_webSocketTask_didOpenWithProtocol_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_webSocketTask_didCloseWithCode_reason_
+        .implementAsBlocking(
+            builder, URLSession_webSocketTask_didCloseWithCode_reason_);
+    NSURLSessionWebSocketDelegate.URLSession_didCreateTask_.implementAsBlocking(
+        builder, URLSession_didCreateTask_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_willBeginDelayedRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willBeginDelayedRequest_completionHandler_);
+    NSURLSessionWebSocketDelegate.URLSession_taskIsWaitingForConnectivity_
+        .implementAsBlocking(builder, URLSession_taskIsWaitingForConnectivity_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_willPerformHTTPRedirection_newRequest_completionHandler_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveChallenge_completionHandler_);
+    NSURLSessionWebSocketDelegate.URLSession_task_needNewBodyStream_
+        .implementAsBlocking(builder, URLSession_task_needNewBodyStream_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_needNewBodyStreamFromOffset_completionHandler_
+        .implementAsBlocking(builder,
+            URLSession_task_needNewBodyStreamFromOffset_completionHandler_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_
+        .implementAsBlocking(builder,
+            URLSession_task_didSendBodyData_totalBytesSent_totalBytesExpectedToSend_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_task_didReceiveInformationalResponse_
+        .implementAsBlocking(
+            builder, URLSession_task_didReceiveInformationalResponse_);
+    NSURLSessionWebSocketDelegate.URLSession_task_didFinishCollectingMetrics_
+        .implementAsBlocking(
+            builder, URLSession_task_didFinishCollectingMetrics_);
+    NSURLSessionWebSocketDelegate.URLSession_task_didCompleteWithError_
+        .implementAsBlocking(builder, URLSession_task_didCompleteWithError_);
+    NSURLSessionWebSocketDelegate.URLSession_didBecomeInvalidWithError_
+        .implementAsBlocking(builder, URLSession_didBecomeInvalidWithError_);
+    NSURLSessionWebSocketDelegate
+            .URLSession_didReceiveChallenge_completionHandler_
+        .implementAsBlocking(
+            builder, URLSession_didReceiveChallenge_completionHandler_);
+    NSURLSessionWebSocketDelegate
+            .URLSessionDidFinishEventsForBackgroundURLSession_
+        .implementAsBlocking(
+            builder, URLSessionDidFinishEventsForBackgroundURLSession_);
+  }
+
   /// Indicates that the WebSocket handshake was successful and the connection has been upgraded to webSockets.
   /// It will also provide the protocol that is picked in the handshake. If the handshake fails, this delegate will not be invoked.
   static final URLSession_webSocketTask_didOpenWithProtocol_ =
@@ -68759,6 +75916,12 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionWebSocketTask arg2, objc.NSString? arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionWebSocketTask, objc.NSString?)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSString
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionWebSocketTask arg2, objc.NSString? arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Indicates that the WebSocket has received a close frame from the server endpoint.
@@ -68796,6 +75959,16 @@
                     DartNSInteger arg3,
                     objc.NSData? arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionWebSocketTask, DartNSInteger,
+                objc.NSData?)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionWebSocketTask_NSURLSessionWebSocketCloseCode_NSData
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionWebSocketTask arg2,
+                    DartNSInteger arg3,
+                    objc.NSData? arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Notification that a task has been created.  This method is the first message
@@ -68823,6 +75996,11 @@
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, NSURLSessionTask) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2) =>
+                func(arg1, arg2)),
   );
 
   /// Sent when the system is ready to begin work for a task with a delayed start
@@ -68879,6 +76057,17 @@
                     objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLRequest,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLRequest_ffiVoidNSURLSessionDelayedRequestDispositionNSURLRequest
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSURLRequest arg3,
+                    objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLRequest?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent when a task cannot start the network loading process because the current
@@ -68911,6 +76100,11 @@
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, NSURLSessionTask) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2) =>
+                func(arg1, arg2)),
   );
 
   /// An HTTP request is attempting to perform a redirection to a different
@@ -68955,6 +76149,17 @@
                     NSURLRequest arg4,
                     objc.ObjCBlock<ffi.Void Function(NSURLRequest?)> arg5) =>
                 func(arg1, arg2, arg3, arg4, arg5)),
+    (void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse,
+                NSURLRequest, objc.ObjCBlock<ffi.Void Function(NSURLRequest?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse_NSURLRequest_ffiVoidNSURLRequest
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSHTTPURLResponse arg3,
+                    NSURLRequest arg4,
+                    objc.ObjCBlock<ffi.Void Function(NSURLRequest?)> arg5) =>
+                func(arg1, arg2, arg3, arg4, arg5)),
   );
 
   /// The task has received a request specific authentication challenge.
@@ -69000,6 +76205,18 @@
                             ffi.Void Function(NSInteger, NSURLCredential?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    NSURLAuthenticationChallenge arg3,
+                    objc.ObjCBlock<
+                            ffi.Void Function(NSInteger, NSURLCredential?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent if a task requires a new, unopened body stream.  This may be
@@ -69037,6 +76254,16 @@
                     objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
                         arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask,
+                objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_ffiVoidNSInputStream
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
+                        arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Tells the delegate if a task requires a new body stream starting from the given offset. This may be
@@ -69080,6 +76307,17 @@
                     objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
                         arg4) =>
                 func(arg1, arg2, arg3, arg4)),
+    (void Function(NSURLSession, NSURLSessionTask, int,
+                objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_ffiVoidNSInputStream
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLSessionTask arg2,
+                    int arg3,
+                    objc.ObjCBlock<ffi.Void Function(objc.NSInputStream?)>
+                        arg4) =>
+                func(arg1, arg2, arg3, arg4)),
   );
 
   /// Sent periodically to notify the delegate of upload progress.  This
@@ -69105,6 +76343,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, int arg3, int arg4, int arg5) =>
                 func(arg1, arg2, arg3, arg4, arg5)),
+    (void Function(NSURLSession, NSURLSessionTask, int, int, int) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_Int64_Int64_Int64
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, int arg3, int arg4, int arg5) =>
+                func(arg1, arg2, arg3, arg4, arg5)),
   );
 
   /// Sent for each informational response received except 101 switching protocols.
@@ -69129,6 +76372,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, NSHTTPURLResponse arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, NSHTTPURLResponse) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSHTTPURLResponse
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, NSHTTPURLResponse arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Sent when complete statistics information has been collected for the task.
@@ -69156,6 +76404,12 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, NSURLSessionTaskMetrics arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, NSURLSessionTaskMetrics)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSURLSessionTaskMetrics
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, NSURLSessionTaskMetrics arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// Sent as the last message related to a specific task.  Error may be
@@ -69181,6 +76435,11 @@
             .listener((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
                     NSURLSessionTask arg2, objc.NSError? arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLSessionTask, objc.NSError?) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLSessionTask_NSError
+            .blocking((ffi.Pointer<ffi.Void> _, NSURLSession arg1,
+                    NSURLSessionTask arg2, objc.NSError? arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// The last message a session receives.  A session will only become
@@ -69204,6 +76463,10 @@
         ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError.listener(
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1, objc.NSError? arg2) =>
                 func(arg1, arg2)),
+    (void Function(NSURLSession, objc.NSError?) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSError.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1, objc.NSError? arg2) =>
+                func(arg1, arg2)),
   );
 
   /// If implemented, when a connection level authentication challenge
@@ -69248,6 +76511,17 @@
                             ffi.Void Function(NSInteger, NSURLCredential?)>
                         arg3) =>
                 func(arg1, arg2, arg3)),
+    (void Function(NSURLSession, NSURLAuthenticationChallenge,
+                objc.ObjCBlock<ffi.Void Function(NSInteger, NSURLCredential?)>)
+            func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession_NSURLAuthenticationChallenge_ffiVoidNSURLSessionAuthChallengeDispositionNSURLCredential
+            .blocking((ffi.Pointer<ffi.Void> _,
+                    NSURLSession arg1,
+                    NSURLAuthenticationChallenge arg2,
+                    objc.ObjCBlock<
+                            ffi.Void Function(NSInteger, NSURLCredential?)>
+                        arg3) =>
+                func(arg1, arg2, arg3)),
   );
 
   /// If an application has received an
@@ -69273,6 +76547,9 @@
     (void Function(NSURLSession) func) =>
         ObjCBlock_ffiVoid_ffiVoid_NSURLSession.listener(
             (ffi.Pointer<ffi.Void> _, NSURLSession arg1) => func(arg1)),
+    (void Function(NSURLSession) func) =>
+        ObjCBlock_ffiVoid_ffiVoid_NSURLSession.blocking(
+            (ffi.Pointer<ffi.Void> _, NSURLSession arg1) => func(arg1)),
   );
 }
 
@@ -69281,7 +76558,7 @@
 late final _class_NSValue = objc.getClass("NSValue");
 late final _sel_valueWithBytes_objCType_ =
     objc.registerName("valueWithBytes:objCType:");
-final _objc_msgSend_qtxoq7 = objc.msgSendPointer
+final _objc_msgSend_e9mncn = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -69302,7 +76579,7 @@
   /// valueWithBytes:objCType:
   static objc.NSValue valueWithBytes_objCType_(
       ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
-    final _ret = _objc_msgSend_qtxoq7(
+    final _ret = _objc_msgSend_e9mncn(
         _class_NSValue, _sel_valueWithBytes_objCType_, value, type);
     return objc.NSValue.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69310,7 +76587,7 @@
   /// value:withObjCType:
   static objc.NSValue value_withObjCType_(
       ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
-    final _ret = _objc_msgSend_qtxoq7(
+    final _ret = _objc_msgSend_e9mncn(
         _class_NSValue, _sel_value_withObjCType_, value, type);
     return objc.NSValue.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69321,7 +76598,7 @@
 late final _sel_nonretainedObjectValue =
     objc.registerName("nonretainedObjectValue");
 late final _sel_valueWithPointer_ = objc.registerName("valueWithPointer:");
-final _objc_msgSend_1yesha9 = objc.msgSendPointer
+final _objc_msgSend_1mbt9g9 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69345,7 +76622,7 @@
   /// valueWithNonretainedObject:
   static objc.NSValue valueWithNonretainedObject_(
       objc.ObjCObjectBase? anObject) {
-    final _ret = _objc_msgSend_62nh5j(_class_NSValue,
+    final _ret = _objc_msgSend_1sotr3r(_class_NSValue,
         _sel_valueWithNonretainedObject_, anObject?.ref.pointer ?? ffi.nullptr);
     return objc.NSValue.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69353,7 +76630,7 @@
   /// nonretainedObjectValue
   objc.ObjCObjectBase? get nonretainedObjectValue {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_nonretainedObjectValue);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_nonretainedObjectValue);
     return _ret.address == 0
         ? null
         : objc.ObjCObjectBase(_ret, retain: true, release: true);
@@ -69362,7 +76639,7 @@
   /// valueWithPointer:
   static objc.NSValue valueWithPointer_(ffi.Pointer<ffi.Void> pointer) {
     final _ret =
-        _objc_msgSend_1yesha9(_class_NSValue, _sel_valueWithPointer_, pointer);
+        _objc_msgSend_1mbt9g9(_class_NSValue, _sel_valueWithPointer_, pointer);
     return objc.NSValue.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -69373,14 +76650,14 @@
 
   /// isEqualToValue:
   bool isEqualToValue_(objc.NSValue value) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_isEqualToValue_, value.ref.pointer);
   }
 }
 
 late final _class_NSNumber = objc.getClass("NSNumber");
 late final _sel_numberWithChar_ = objc.registerName("numberWithChar:");
-final _objc_msgSend_vx1f2d = objc.msgSendPointer
+final _objc_msgSend_13mclwd = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69390,7 +76667,7 @@
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_numberWithUnsignedChar_ =
     objc.registerName("numberWithUnsignedChar:");
-final _objc_msgSend_uzucl8 = objc.msgSendPointer
+final _objc_msgSend_7uautw = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69399,7 +76676,7 @@
         ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_numberWithShort_ = objc.registerName("numberWithShort:");
-final _objc_msgSend_cvzqr9 = objc.msgSendPointer
+final _objc_msgSend_68x6r1 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69409,7 +76686,7 @@
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_numberWithUnsignedShort_ =
     objc.registerName("numberWithUnsignedShort:");
-final _objc_msgSend_onx6bi = objc.msgSendPointer
+final _objc_msgSend_1njucl2 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69418,7 +76695,7 @@
         ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_numberWithInt_ = objc.registerName("numberWithInt:");
-final _objc_msgSend_1a0iyvk = objc.msgSendPointer
+final _objc_msgSend_14hvw5k = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69428,7 +76705,7 @@
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_numberWithUnsignedInt_ =
     objc.registerName("numberWithUnsignedInt:");
-final _objc_msgSend_12mhqtk = objc.msgSendPointer
+final _objc_msgSend_degb40 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69440,7 +76717,7 @@
 late final _sel_numberWithUnsignedLong_ =
     objc.registerName("numberWithUnsignedLong:");
 late final _sel_numberWithLongLong_ = objc.registerName("numberWithLongLong:");
-final _objc_msgSend_94zdgv = objc.msgSendPointer
+final _objc_msgSend_16f0drb = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69450,7 +76727,7 @@
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_numberWithUnsignedLongLong_ =
     objc.registerName("numberWithUnsignedLongLong:");
-final _objc_msgSend_98pnic = objc.msgSendPointer
+final _objc_msgSend_1x2hskc = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69459,7 +76736,7 @@
         ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
             ffi.Pointer<objc.ObjCSelector>, int)>();
 late final _sel_numberWithFloat_ = objc.registerName("numberWithFloat:");
-final _objc_msgSend_1f4qa0h = objc.msgSendPointer
+final _objc_msgSend_et8cuh = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69469,7 +76746,7 @@
             ffi.Pointer<objc.ObjCSelector>, double)>();
 late final _sel_numberWithDouble_ = objc.registerName("numberWithDouble:");
 late final _sel_numberWithBool_ = objc.registerName("numberWithBool:");
-final _objc_msgSend_1l3kbc1 = objc.msgSendPointer
+final _objc_msgSend_1t6aok9 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69486,13 +76763,13 @@
   /// numberWithChar:
   static objc.NSNumber numberWithChar_(int value) {
     final _ret =
-        _objc_msgSend_vx1f2d(_class_NSNumber, _sel_numberWithChar_, value);
+        _objc_msgSend_13mclwd(_class_NSNumber, _sel_numberWithChar_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithUnsignedChar:
   static objc.NSNumber numberWithUnsignedChar_(int value) {
-    final _ret = _objc_msgSend_uzucl8(
+    final _ret = _objc_msgSend_7uautw(
         _class_NSNumber, _sel_numberWithUnsignedChar_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69500,13 +76777,13 @@
   /// numberWithShort:
   static objc.NSNumber numberWithShort_(int value) {
     final _ret =
-        _objc_msgSend_cvzqr9(_class_NSNumber, _sel_numberWithShort_, value);
+        _objc_msgSend_68x6r1(_class_NSNumber, _sel_numberWithShort_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithUnsignedShort:
   static objc.NSNumber numberWithUnsignedShort_(int value) {
-    final _ret = _objc_msgSend_onx6bi(
+    final _ret = _objc_msgSend_1njucl2(
         _class_NSNumber, _sel_numberWithUnsignedShort_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69514,13 +76791,13 @@
   /// numberWithInt:
   static objc.NSNumber numberWithInt_(int value) {
     final _ret =
-        _objc_msgSend_1a0iyvk(_class_NSNumber, _sel_numberWithInt_, value);
+        _objc_msgSend_14hvw5k(_class_NSNumber, _sel_numberWithInt_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithUnsignedInt:
   static objc.NSNumber numberWithUnsignedInt_(int value) {
-    final _ret = _objc_msgSend_12mhqtk(
+    final _ret = _objc_msgSend_degb40(
         _class_NSNumber, _sel_numberWithUnsignedInt_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69528,13 +76805,13 @@
   /// numberWithLong:
   static objc.NSNumber numberWithLong_(int value) {
     final _ret =
-        _objc_msgSend_8o14b(_class_NSNumber, _sel_numberWithLong_, value);
+        _objc_msgSend_qugqlf(_class_NSNumber, _sel_numberWithLong_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithUnsignedLong:
   static objc.NSNumber numberWithUnsignedLong_(int value) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         _class_NSNumber, _sel_numberWithUnsignedLong_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69542,13 +76819,13 @@
   /// numberWithLongLong:
   static objc.NSNumber numberWithLongLong_(int value) {
     final _ret =
-        _objc_msgSend_94zdgv(_class_NSNumber, _sel_numberWithLongLong_, value);
+        _objc_msgSend_16f0drb(_class_NSNumber, _sel_numberWithLongLong_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithUnsignedLongLong:
   static objc.NSNumber numberWithUnsignedLongLong_(int value) {
-    final _ret = _objc_msgSend_98pnic(
+    final _ret = _objc_msgSend_1x2hskc(
         _class_NSNumber, _sel_numberWithUnsignedLongLong_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69556,34 +76833,34 @@
   /// numberWithFloat:
   static objc.NSNumber numberWithFloat_(double value) {
     final _ret =
-        _objc_msgSend_1f4qa0h(_class_NSNumber, _sel_numberWithFloat_, value);
+        _objc_msgSend_et8cuh(_class_NSNumber, _sel_numberWithFloat_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithDouble:
   static objc.NSNumber numberWithDouble_(double value) {
     final _ret =
-        _objc_msgSend_1x911p2(_class_NSNumber, _sel_numberWithDouble_, value);
+        _objc_msgSend_oa8mke(_class_NSNumber, _sel_numberWithDouble_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithBool:
   static objc.NSNumber numberWithBool_(bool value) {
     final _ret =
-        _objc_msgSend_1l3kbc1(_class_NSNumber, _sel_numberWithBool_, value);
+        _objc_msgSend_1t6aok9(_class_NSNumber, _sel_numberWithBool_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithInteger:
   static objc.NSNumber numberWithInteger_(DartNSInteger value) {
     final _ret =
-        _objc_msgSend_8o14b(_class_NSNumber, _sel_numberWithInteger_, value);
+        _objc_msgSend_qugqlf(_class_NSNumber, _sel_numberWithInteger_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// numberWithUnsignedInteger:
   static objc.NSNumber numberWithUnsignedInteger_(DartNSUInteger value) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         _class_NSNumber, _sel_numberWithUnsignedInteger_, value);
     return objc.NSNumber.castFromPointer(_ret, retain: true, release: true);
   }
@@ -69610,7 +76887,7 @@
 typedef NSRange = objc.NSRange;
 typedef NSRangePointer = ffi.Pointer<NSRange>;
 late final _sel_valueWithRange_ = objc.registerName("valueWithRange:");
-final _objc_msgSend_83z673 = objc.msgSendPointer
+final _objc_msgSend_1k1o1s7 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -69643,7 +76920,7 @@
   /// valueWithRange:
   static objc.NSValue valueWithRange_(NSRange range) {
     final _ret =
-        _objc_msgSend_83z673(_class_NSValue, _sel_valueWithRange_, range);
+        _objc_msgSend_1k1o1s7(_class_NSValue, _sel_valueWithRange_, range);
     return objc.NSValue.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -69686,7 +76963,7 @@
             ffi.Pointer<ffi.Pointer<objc.ObjCObject>>,
             objc.NSRange)>();
 late final _sel_indexOfObject_ = objc.registerName("indexOfObject:");
-final _objc_msgSend_1p4b7x4 = objc.msgSendPointer
+final _objc_msgSend_1vd1c5m = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.UnsignedLong Function(
@@ -69698,7 +76975,7 @@
             ffi.Pointer<objc.ObjCSelector>, ffi.Pointer<objc.ObjCObject>)>();
 late final _sel_indexOfObject_inRange_ =
     objc.registerName("indexOfObject:inRange:");
-final _objc_msgSend_1c913oo = objc.msgSendPointer
+final _objc_msgSend_zug4wi = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.UnsignedLong Function(
@@ -69724,7 +77001,7 @@
 late final _sel_sortedArrayHint = objc.registerName("sortedArrayHint");
 late final _sel_sortedArrayUsingFunction_context_ =
     objc.registerName("sortedArrayUsingFunction:context:");
-final _objc_msgSend_1iiv4px = objc.msgSendPointer
+final _objc_msgSend_1ffoev1 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -69748,7 +77025,7 @@
             ffi.Pointer<ffi.Void>)>();
 late final _sel_sortedArrayUsingFunction_context_hint_ =
     objc.registerName("sortedArrayUsingFunction:context:hint:");
-final _objc_msgSend_iqbzrn = objc.msgSendPointer
+final _objc_msgSend_1i2r70j = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -69789,7 +77066,7 @@
             ffi.Pointer<objc.ObjCSelector>, ffi.Pointer<objc.ObjCSelector>)>();
 late final _sel_makeObjectsPerformSelector_withObject_ =
     objc.registerName("makeObjectsPerformSelector:withObject:");
-final _objc_msgSend_1c03bya = objc.msgSendPointer
+final _objc_msgSend_1qv0eq4 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -69868,6 +77145,56 @@
                 ffi.Pointer<ffi.Bool>)>.listener(
         _ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    int arg1,
+    ffi.Pointer<ffi.Bool> arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<objc.ObjCObject>,
+        int, ffi.Pointer<ffi.Bool>))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            NSUInteger,
+            ffi.Pointer<ffi.Bool>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                NSUInteger,
+                ffi.Pointer<ffi.Bool>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            NSUInteger,
+            ffi.Pointer<ffi.Bool>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                NSUInteger,
+                ffi.Pointer<ffi.Bool>)>.listener(
+        _ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong, ffi.Pointer<ffi.Bool>)>`.
 abstract final class ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool {
@@ -69938,12 +77265,51 @@
                 ffi.Pointer<ffi.Bool> arg2) =>
             fn(objc.ObjCObjectBase(arg0, retain: false, release: true), arg1,
                 arg2));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_16ko9u(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1p9ui4q(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong,
             ffi.Pointer<ffi.Bool>)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong,
+          ffi.Pointer<ffi.Bool>)> blocking(
+      void Function(objc.ObjCObjectBase, DartNSUInteger, ffi.Pointer<ffi.Bool>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, int arg1,
+                ffi.Pointer<ffi.Bool> arg2) =>
+            fn(objc.ObjCObjectBase(arg0, retain: false, release: true), arg1,
+                arg2));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_NSUInteger_bool_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, int arg1,
+                ffi.Pointer<ffi.Bool> arg2) =>
+            fn(objc.ObjCObjectBase(arg0, retain: false, release: true), arg1,
+                arg2));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1p9ui4q, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong,
+            ffi.Pointer<ffi.Bool>)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong, ffi.Pointer<ffi.Bool>)>`.
@@ -69976,7 +77342,7 @@
     objc.registerName("enumerateObjectsWithOptions:usingBlock:");
 late final _sel_enumerateObjectsAtIndexes_options_usingBlock_ =
     objc.registerName("enumerateObjectsAtIndexes:options:usingBlock:");
-final _objc_msgSend_p1bhs = objc.msgSendPointer
+final _objc_msgSend_a3wp08 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -70137,7 +77503,7 @@
             ffi.Pointer<objc.ObjCBlockImpl>)>();
 late final _sel_indexOfObjectAtIndexes_options_passingTest_ =
     objc.registerName("indexOfObjectAtIndexes:options:passingTest:");
-final _objc_msgSend_viax9j = objc.msgSendPointer
+final _objc_msgSend_k1x6mt = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.UnsignedLong Function(
@@ -70159,7 +77525,7 @@
     objc.registerName("indexesOfObjectsWithOptions:passingTest:");
 late final _sel_indexesOfObjectsAtIndexes_options_passingTest_ =
     objc.registerName("indexesOfObjectsAtIndexes:options:passingTest:");
-final _objc_msgSend_1bj2f0k = objc.msgSendPointer
+final _objc_msgSend_1i9v144 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -70181,7 +77547,7 @@
     objc.registerName("sortedArrayWithOptions:usingComparator:");
 late final _sel_indexOfObject_inSortedRange_options_usingComparator_ =
     objc.registerName("indexOfObject:inSortedRange:options:usingComparator:");
-final _objc_msgSend_9efhbf = objc.msgSendPointer
+final _objc_msgSend_kshx9d = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.UnsignedLong Function(
@@ -70204,40 +77570,40 @@
 extension NSExtendedArray on objc.NSArray {
   /// arrayByAddingObject:
   objc.NSArray arrayByAddingObject_(objc.ObjCObjectBase anObject) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_arrayByAddingObject_, anObject.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// arrayByAddingObjectsFromArray:
   objc.NSArray arrayByAddingObjectsFromArray_(objc.NSArray otherArray) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_arrayByAddingObjectsFromArray_, otherArray.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// componentsJoinedByString:
   objc.NSString componentsJoinedByString_(objc.NSString separator) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_componentsJoinedByString_, separator.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// containsObject:
   bool containsObject_(objc.ObjCObjectBase anObject) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_containsObject_, anObject.ref.pointer);
   }
 
   /// description
   objc.NSString get description {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_description);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_description);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// descriptionWithLocale:
   objc.NSString descriptionWithLocale_(objc.ObjCObjectBase? locale) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_descriptionWithLocale_, locale?.ref.pointer ?? ffi.nullptr);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -70245,7 +77611,7 @@
   /// descriptionWithLocale:indent:
   objc.NSString descriptionWithLocale_indent_(
       objc.ObjCObjectBase? locale, DartNSUInteger level) {
-    final _ret = _objc_msgSend_dcd68g(
+    final _ret = _objc_msgSend_1k4kd9s(
         this.ref.pointer,
         _sel_descriptionWithLocale_indent_,
         locale?.ref.pointer ?? ffi.nullptr,
@@ -70255,7 +77621,7 @@
 
   /// firstObjectCommonWithArray:
   objc.ObjCObjectBase? firstObjectCommonWithArray_(objc.NSArray otherArray) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_firstObjectCommonWithArray_, otherArray.ref.pointer);
     return _ret.address == 0
         ? null
@@ -70271,39 +77637,39 @@
 
   /// indexOfObject:
   DartNSUInteger indexOfObject_(objc.ObjCObjectBase anObject) {
-    return _objc_msgSend_1p4b7x4(
+    return _objc_msgSend_1vd1c5m(
         this.ref.pointer, _sel_indexOfObject_, anObject.ref.pointer);
   }
 
   /// indexOfObject:inRange:
   DartNSUInteger indexOfObject_inRange_(
       objc.ObjCObjectBase anObject, NSRange range) {
-    return _objc_msgSend_1c913oo(this.ref.pointer, _sel_indexOfObject_inRange_,
+    return _objc_msgSend_zug4wi(this.ref.pointer, _sel_indexOfObject_inRange_,
         anObject.ref.pointer, range);
   }
 
   /// indexOfObjectIdenticalTo:
   DartNSUInteger indexOfObjectIdenticalTo_(objc.ObjCObjectBase anObject) {
-    return _objc_msgSend_1p4b7x4(
+    return _objc_msgSend_1vd1c5m(
         this.ref.pointer, _sel_indexOfObjectIdenticalTo_, anObject.ref.pointer);
   }
 
   /// indexOfObjectIdenticalTo:inRange:
   DartNSUInteger indexOfObjectIdenticalTo_inRange_(
       objc.ObjCObjectBase anObject, NSRange range) {
-    return _objc_msgSend_1c913oo(this.ref.pointer,
+    return _objc_msgSend_zug4wi(this.ref.pointer,
         _sel_indexOfObjectIdenticalTo_inRange_, anObject.ref.pointer, range);
   }
 
   /// isEqualToArray:
   bool isEqualToArray_(objc.NSArray otherArray) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_isEqualToArray_, otherArray.ref.pointer);
   }
 
   /// firstObject
   objc.ObjCObjectBase? get firstObject {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_firstObject);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_firstObject);
     return _ret.address == 0
         ? null
         : objc.ObjCObjectBase(_ret, retain: true, release: true);
@@ -70311,7 +77677,7 @@
 
   /// lastObject
   objc.ObjCObjectBase? get lastObject {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_lastObject);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_lastObject);
     return _ret.address == 0
         ? null
         : objc.ObjCObjectBase(_ret, retain: true, release: true);
@@ -70319,20 +77685,20 @@
 
   /// objectEnumerator
   objc.NSEnumerator objectEnumerator() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_objectEnumerator);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_objectEnumerator);
     return objc.NSEnumerator.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// reverseObjectEnumerator
   objc.NSEnumerator reverseObjectEnumerator() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_reverseObjectEnumerator);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_reverseObjectEnumerator);
     return objc.NSEnumerator.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// sortedArrayHint
   objc.NSData get sortedArrayHint {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_sortedArrayHint);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_sortedArrayHint);
     return objc.NSData.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -70344,7 +77710,7 @@
                       ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Void>)>>
           comparator,
       ffi.Pointer<ffi.Void> context) {
-    final _ret = _objc_msgSend_1iiv4px(this.ref.pointer,
+    final _ret = _objc_msgSend_1ffoev1(this.ref.pointer,
         _sel_sortedArrayUsingFunction_context_, comparator, context);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -70358,7 +77724,7 @@
           comparator,
       ffi.Pointer<ffi.Void> context,
       objc.NSData? hint) {
-    final _ret = _objc_msgSend_iqbzrn(
+    final _ret = _objc_msgSend_1i2r70j(
         this.ref.pointer,
         _sel_sortedArrayUsingFunction_context_hint_,
         comparator,
@@ -70370,7 +77736,7 @@
   /// sortedArrayUsingSelector:
   objc.NSArray sortedArrayUsingSelector_(
       ffi.Pointer<objc.ObjCSelector> comparator) {
-    final _ret = _objc_msgSend_19hbqky(
+    final _ret = _objc_msgSend_3ctkt6(
         this.ref.pointer, _sel_sortedArrayUsingSelector_, comparator);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -70378,14 +77744,14 @@
   /// subarrayWithRange:
   objc.NSArray subarrayWithRange_(NSRange range) {
     final _ret =
-        _objc_msgSend_83z673(this.ref.pointer, _sel_subarrayWithRange_, range);
+        _objc_msgSend_1k1o1s7(this.ref.pointer, _sel_subarrayWithRange_, range);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// writeToURL:error:
   bool writeToURL_error_(
       objc.NSURL url, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    return _objc_msgSend_blqzg8(
+    return _objc_msgSend_l9p60w(
         this.ref.pointer, _sel_writeToURL_error_, url.ref.pointer, error);
   }
 
@@ -70398,7 +77764,7 @@
   /// makeObjectsPerformSelector:withObject:
   void makeObjectsPerformSelector_withObject_(
       ffi.Pointer<objc.ObjCSelector> aSelector, objc.ObjCObjectBase? argument) {
-    _objc_msgSend_1c03bya(
+    _objc_msgSend_1qv0eq4(
         this.ref.pointer,
         _sel_makeObjectsPerformSelector_withObject_,
         aSelector,
@@ -70407,14 +77773,14 @@
 
   /// objectsAtIndexes:
   objc.NSArray objectsAtIndexes_(objc.NSIndexSet indexes) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_objectsAtIndexes_, indexes.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// objectAtIndexedSubscript:
   objc.ObjCObjectBase objectAtIndexedSubscript_(DartNSUInteger idx) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         this.ref.pointer, _sel_objectAtIndexedSubscript_, idx);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
@@ -70451,7 +77817,7 @@
               ffi.Void Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong,
                   ffi.Pointer<ffi.Bool>)>
           block) {
-    _objc_msgSend_p1bhs(
+    _objc_msgSend_a3wp08(
         this.ref.pointer,
         _sel_enumerateObjectsAtIndexes_options_usingBlock_,
         s.ref.pointer,
@@ -70491,7 +77857,7 @@
               ffi.Bool Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong,
                   ffi.Pointer<ffi.Bool>)>
           predicate) {
-    return _objc_msgSend_viax9j(
+    return _objc_msgSend_k1x6mt(
         this.ref.pointer,
         _sel_indexOfObjectAtIndexes_options_passingTest_,
         s.ref.pointer,
@@ -70505,7 +77871,7 @@
               ffi.Bool Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong,
                   ffi.Pointer<ffi.Bool>)>
           predicate) {
-    final _ret = _objc_msgSend_cy99le(this.ref.pointer,
+    final _ret = _objc_msgSend_nnxkei(this.ref.pointer,
         _sel_indexesOfObjectsPassingTest_, predicate.ref.pointer);
     return objc.NSIndexSet.castFromPointer(_ret, retain: true, release: true);
   }
@@ -70517,7 +77883,7 @@
               ffi.Bool Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong,
                   ffi.Pointer<ffi.Bool>)>
           predicate) {
-    final _ret = _objc_msgSend_hd4f96(
+    final _ret = _objc_msgSend_13x5boi(
         this.ref.pointer,
         _sel_indexesOfObjectsWithOptions_passingTest_,
         opts.value,
@@ -70533,7 +77899,7 @@
               ffi.Bool Function(ffi.Pointer<objc.ObjCObject>, ffi.UnsignedLong,
                   ffi.Pointer<ffi.Bool>)>
           predicate) {
-    final _ret = _objc_msgSend_1bj2f0k(
+    final _ret = _objc_msgSend_1i9v144(
         this.ref.pointer,
         _sel_indexesOfObjectsAtIndexes_options_passingTest_,
         s.ref.pointer,
@@ -70544,7 +77910,7 @@
 
   /// sortedArrayUsingComparator:
   objc.NSArray sortedArrayUsingComparator_(DartNSComparator cmptr) {
-    final _ret = _objc_msgSend_cy99le(
+    final _ret = _objc_msgSend_nnxkei(
         this.ref.pointer, _sel_sortedArrayUsingComparator_, cmptr.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -70552,7 +77918,7 @@
   /// sortedArrayWithOptions:usingComparator:
   objc.NSArray sortedArrayWithOptions_usingComparator_(
       objc.NSSortOptions opts, DartNSComparator cmptr) {
-    final _ret = _objc_msgSend_1u2b7ut(
+    final _ret = _objc_msgSend_1x5ew3h(
         this.ref.pointer,
         _sel_sortedArrayWithOptions_usingComparator_,
         opts.value,
@@ -70566,7 +77932,7 @@
       NSRange r,
       objc.NSBinarySearchingOptions opts,
       DartNSComparator cmp) {
-    return _objc_msgSend_9efhbf(
+    return _objc_msgSend_kshx9d(
         this.ref.pointer,
         _sel_indexOfObject_inSortedRange_options_usingComparator_,
         obj.ref.pointer,
@@ -70580,7 +77946,7 @@
 late final _sel_arrayWithObject_ = objc.registerName("arrayWithObject:");
 late final _sel_arrayWithObjects_count_ =
     objc.registerName("arrayWithObjects:count:");
-final _objc_msgSend_1lqqdvl = objc.msgSendPointer
+final _objc_msgSend_zmbtbd = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -70607,13 +77973,13 @@
 extension NSArrayCreation on objc.NSArray {
   /// array
   static objc.NSArray array() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSArray, _sel_array);
+    final _ret = _objc_msgSend_151sglz(_class_NSArray, _sel_array);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// arrayWithObject:
   static objc.NSArray arrayWithObject_(objc.ObjCObjectBase anObject) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSArray, _sel_arrayWithObject_, anObject.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -70621,42 +77987,42 @@
   /// arrayWithObjects:count:
   static objc.NSArray arrayWithObjects_count_(
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> objects, DartNSUInteger cnt) {
-    final _ret = _objc_msgSend_1lqqdvl(
+    final _ret = _objc_msgSend_zmbtbd(
         _class_NSArray, _sel_arrayWithObjects_count_, objects, cnt);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// arrayWithObjects:
   static objc.NSArray arrayWithObjects_(objc.ObjCObjectBase firstObj) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSArray, _sel_arrayWithObjects_, firstObj.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// arrayWithArray:
   static objc.NSArray arrayWithArray_(objc.NSArray array) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSArray, _sel_arrayWithArray_, array.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// initWithObjects:
   objc.NSArray initWithObjects_(objc.ObjCObjectBase firstObj) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithObjects_, firstObj.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// initWithArray:
   objc.NSArray initWithArray_(objc.NSArray array) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithArray_, array.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// initWithArray:copyItems:
   objc.NSArray initWithArray_copyItems_(objc.NSArray array, bool flag) {
-    final _ret = _objc_msgSend_1bdmr5f(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_17amj0z(this.ref.retainAndReturnPointer(),
         _sel_initWithArray_copyItems_, array.ref.pointer, flag);
     return objc.NSArray.castFromPointer(_ret, retain: false, release: true);
   }
@@ -70664,7 +78030,7 @@
   /// initWithContentsOfURL:error:
   objc.NSArray? initWithContentsOfURL_error_(
       objc.NSURL url, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1705co6(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1lhpu4m(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_error_, url.ref.pointer, error);
     return _ret.address == 0
         ? null
@@ -70674,7 +78040,7 @@
   /// arrayWithContentsOfURL:error:
   static objc.NSArray? arrayWithContentsOfURL_error_(
       objc.NSURL url, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1705co6(_class_NSArray,
+    final _ret = _objc_msgSend_1lhpu4m(_class_NSArray,
         _sel_arrayWithContentsOfURL_error_, url.ref.pointer, error);
     return _ret.address == 0
         ? null
@@ -70792,7 +78158,7 @@
 
 late final _sel_differenceFromArray_withOptions_usingEquivalenceTest_ =
     objc.registerName("differenceFromArray:withOptions:usingEquivalenceTest:");
-final _objc_msgSend_1jy28v8 = objc.msgSendPointer
+final _objc_msgSend_1415lvo = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -70810,7 +78176,7 @@
             ffi.Pointer<objc.ObjCBlockImpl>)>();
 late final _sel_differenceFromArray_withOptions_ =
     objc.registerName("differenceFromArray:withOptions:");
-final _objc_msgSend_4yz83j = objc.msgSendPointer
+final _objc_msgSend_1wtpmu7 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -70840,7 +78206,7 @@
                   ffi.Bool Function(ffi.Pointer<objc.ObjCObject>,
                       ffi.Pointer<objc.ObjCObject>)>
               block) {
-    final _ret = _objc_msgSend_1jy28v8(
+    final _ret = _objc_msgSend_1415lvo(
         this.ref.pointer,
         _sel_differenceFromArray_withOptions_usingEquivalenceTest_,
         other.ref.pointer,
@@ -70854,7 +78220,7 @@
   objc.NSOrderedCollectionDifference differenceFromArray_withOptions_(
       objc.NSArray other,
       objc.NSOrderedCollectionDifferenceCalculationOptions options) {
-    final _ret = _objc_msgSend_4yz83j(
+    final _ret = _objc_msgSend_1wtpmu7(
         this.ref.pointer,
         _sel_differenceFromArray_withOptions_,
         other.ref.pointer,
@@ -70865,7 +78231,7 @@
 
   /// differenceFromArray:
   objc.NSOrderedCollectionDifference differenceFromArray_(objc.NSArray other) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_differenceFromArray_, other.ref.pointer);
     return objc.NSOrderedCollectionDifference.castFromPointer(_ret,
         retain: true, release: true);
@@ -70874,7 +78240,7 @@
   /// arrayByApplyingDifference:
   objc.NSArray? arrayByApplyingDifference_(
       objc.NSOrderedCollectionDifference difference) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_arrayByApplyingDifference_, difference.ref.pointer);
     return _ret.address == 0
         ? null
@@ -70909,7 +78275,7 @@
 
   /// arrayWithContentsOfFile:
   static objc.NSArray? arrayWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSArray, _sel_arrayWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -70918,7 +78284,7 @@
 
   /// arrayWithContentsOfURL:
   static objc.NSArray? arrayWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSArray, _sel_arrayWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -70927,7 +78293,7 @@
 
   /// initWithContentsOfFile:
   objc.NSArray? initWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -70936,7 +78302,7 @@
 
   /// initWithContentsOfURL:
   objc.NSArray? initWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -70945,13 +78311,13 @@
 
   /// writeToFile:atomically:
   bool writeToFile_atomically_(objc.NSString path, bool useAuxiliaryFile) {
-    return _objc_msgSend_w8pbfh(this.ref.pointer, _sel_writeToFile_atomically_,
+    return _objc_msgSend_1iyq28l(this.ref.pointer, _sel_writeToFile_atomically_,
         path.ref.pointer, useAuxiliaryFile);
   }
 
   /// writeToURL:atomically:
   bool writeToURL_atomically_(objc.NSURL url, bool atomically) {
-    return _objc_msgSend_w8pbfh(this.ref.pointer, _sel_writeToURL_atomically_,
+    return _objc_msgSend_1iyq28l(this.ref.pointer, _sel_writeToURL_atomically_,
         url.ref.pointer, atomically);
   }
 }
@@ -70974,7 +78340,7 @@
             ffi.Pointer<objc.ObjCSelector>, int, int)>();
 late final _sel_removeObject_inRange_ =
     objc.registerName("removeObject:inRange:");
-final _objc_msgSend_16f6m81 = objc.msgSendPointer
+final _objc_msgSend_1oteutl = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -71023,7 +78389,7 @@
             ffi.Pointer<objc.ObjCSelector>, objc.NSRange)>();
 late final _sel_replaceObjectsInRange_withObjectsFromArray_range_ =
     objc.registerName("replaceObjectsInRange:withObjectsFromArray:range:");
-final _objc_msgSend_169h6dj = objc.msgSendPointer
+final _objc_msgSend_15bolr3 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -71041,7 +78407,7 @@
             objc.NSRange)>();
 late final _sel_replaceObjectsInRange_withObjectsFromArray_ =
     objc.registerName("replaceObjectsInRange:withObjectsFromArray:");
-final _objc_msgSend_i4ny2p = objc.msgSendPointer
+final _objc_msgSend_1tv4uax = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -71089,7 +78455,7 @@
     objc.registerName("replaceObjectsAtIndexes:withObjects:");
 late final _sel_setObject_atIndexedSubscript_ =
     objc.registerName("setObject:atIndexedSubscript:");
-final _objc_msgSend_10i1axw = objc.msgSendPointer
+final _objc_msgSend_djsa9o = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -71126,7 +78492,7 @@
 extension NSExtendedMutableArray on objc.NSMutableArray {
   /// addObjectsFromArray:
   void addObjectsFromArray_(objc.NSArray otherArray) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_addObjectsFromArray_, otherArray.ref.pointer);
   }
 
@@ -71144,26 +78510,26 @@
 
   /// removeObject:inRange:
   void removeObject_inRange_(objc.ObjCObjectBase anObject, NSRange range) {
-    _objc_msgSend_16f6m81(this.ref.pointer, _sel_removeObject_inRange_,
+    _objc_msgSend_1oteutl(this.ref.pointer, _sel_removeObject_inRange_,
         anObject.ref.pointer, range);
   }
 
   /// removeObject:
   void removeObject_(objc.ObjCObjectBase anObject) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_removeObject_, anObject.ref.pointer);
   }
 
   /// removeObjectIdenticalTo:inRange:
   void removeObjectIdenticalTo_inRange_(
       objc.ObjCObjectBase anObject, NSRange range) {
-    _objc_msgSend_16f6m81(this.ref.pointer,
+    _objc_msgSend_1oteutl(this.ref.pointer,
         _sel_removeObjectIdenticalTo_inRange_, anObject.ref.pointer, range);
   }
 
   /// removeObjectIdenticalTo:
   void removeObjectIdenticalTo_(objc.ObjCObjectBase anObject) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_removeObjectIdenticalTo_, anObject.ref.pointer);
   }
 
@@ -71176,7 +78542,7 @@
 
   /// removeObjectsInArray:
   void removeObjectsInArray_(objc.NSArray otherArray) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_removeObjectsInArray_, otherArray.ref.pointer);
   }
 
@@ -71188,7 +78554,7 @@
   /// replaceObjectsInRange:withObjectsFromArray:range:
   void replaceObjectsInRange_withObjectsFromArray_range_(
       NSRange range, objc.NSArray otherArray, NSRange otherRange) {
-    _objc_msgSend_169h6dj(
+    _objc_msgSend_15bolr3(
         this.ref.pointer,
         _sel_replaceObjectsInRange_withObjectsFromArray_range_,
         range,
@@ -71199,7 +78565,7 @@
   /// replaceObjectsInRange:withObjectsFromArray:
   void replaceObjectsInRange_withObjectsFromArray_(
       NSRange range, objc.NSArray otherArray) {
-    _objc_msgSend_i4ny2p(
+    _objc_msgSend_1tv4uax(
         this.ref.pointer,
         _sel_replaceObjectsInRange_withObjectsFromArray_,
         range,
@@ -71208,7 +78574,7 @@
 
   /// setArray:
   void setArray_(objc.NSArray otherArray) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setArray_, otherArray.ref.pointer);
   }
 
@@ -71232,20 +78598,20 @@
 
   /// insertObjects:atIndexes:
   void insertObjects_atIndexes_(objc.NSArray objects, objc.NSIndexSet indexes) {
-    _objc_msgSend_wjvic9(this.ref.pointer, _sel_insertObjects_atIndexes_,
+    _objc_msgSend_pfv6jd(this.ref.pointer, _sel_insertObjects_atIndexes_,
         objects.ref.pointer, indexes.ref.pointer);
   }
 
   /// removeObjectsAtIndexes:
   void removeObjectsAtIndexes_(objc.NSIndexSet indexes) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_removeObjectsAtIndexes_, indexes.ref.pointer);
   }
 
   /// replaceObjectsAtIndexes:withObjects:
   void replaceObjectsAtIndexes_withObjects_(
       objc.NSIndexSet indexes, objc.NSArray objects) {
-    _objc_msgSend_wjvic9(
+    _objc_msgSend_pfv6jd(
         this.ref.pointer,
         _sel_replaceObjectsAtIndexes_withObjects_,
         indexes.ref.pointer,
@@ -71255,7 +78621,7 @@
   /// setObject:atIndexedSubscript:
   void setObject_atIndexedSubscript_(
       objc.ObjCObjectBase obj, DartNSUInteger idx) {
-    _objc_msgSend_10i1axw(this.ref.pointer, _sel_setObject_atIndexedSubscript_,
+    _objc_msgSend_djsa9o(this.ref.pointer, _sel_setObject_atIndexedSubscript_,
         obj.ref.pointer, idx);
   }
 
@@ -71279,7 +78645,7 @@
 extension NSMutableArrayCreation on objc.NSMutableArray {
   /// arrayWithCapacity:
   static objc.NSMutableArray arrayWithCapacity_(DartNSUInteger numItems) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         _class_NSMutableArray, _sel_arrayWithCapacity_, numItems);
     return objc.NSMutableArray.castFromPointer(_ret,
         retain: true, release: true);
@@ -71287,7 +78653,7 @@
 
   /// arrayWithContentsOfFile:
   static objc.NSMutableArray? arrayWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSMutableArray, _sel_arrayWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -71297,7 +78663,7 @@
 
   /// arrayWithContentsOfURL:
   static objc.NSMutableArray? arrayWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSMutableArray, _sel_arrayWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -71307,7 +78673,7 @@
 
   /// initWithContentsOfFile:
   objc.NSMutableArray? initWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -71317,7 +78683,7 @@
 
   /// initWithContentsOfURL:
   objc.NSMutableArray? initWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -71332,7 +78698,7 @@
 extension NSMutableArrayDiffing on objc.NSMutableArray {
   /// applyDifference:
   void applyDifference_(objc.NSOrderedCollectionDifference difference) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_applyDifference_, difference.ref.pointer);
   }
 }
@@ -71392,6 +78758,51 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_objcObjCObject_NSError_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_objcObjCObject_NSError_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_NSError_blockingCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_objcObjCObject_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_objcObjCObject_NSError_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_objcObjCObject_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?, objc.NSError)>`.
 abstract final class ObjCBlock_ffiVoid_objcObjCObject_NSError {
@@ -71462,12 +78873,57 @@
                     : objc.ObjCObjectBase(arg0, retain: false, release: true),
                 objc.NSError.castFromPointer(arg1,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_wjvic9(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_pfv6jd(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(ffi.Pointer<objc.ObjCObject>?,
             objc.NSError)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc
+      .ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?, objc.NSError)>
+      blocking(void Function(objc.ObjCObjectBase?, objc.NSError) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_NSError_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.ObjCObjectBase(arg0, retain: false, release: true),
+                objc.NSError.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_objcObjCObject_NSError_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.ObjCObjectBase(arg0, retain: false, release: true),
+                objc.NSError.castFromPointer(arg1,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_pfv6jd, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(ffi.Pointer<objc.ObjCObject>?,
+            objc.NSError)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?, objc.NSError)>`.
@@ -71568,6 +79024,59 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary_listenerTrampoline)
       ..keepIsolateAlive = false;
+void
+    _ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary_blockingTrampoline(
+        ffi.Pointer<objc.ObjCBlockImpl> block,
+        ffi.Pointer<ffi.Void> waiter,
+        NSItemProviderCompletionHandler arg0,
+        ffi.Pointer<objc.ObjCObject> arg1,
+        ffi.Pointer<objc.ObjCObject> arg2) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        NSItemProviderCompletionHandler,
+        ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            NSItemProviderCompletionHandler,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                NSItemProviderCompletionHandler,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            NSItemProviderCompletionHandler,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                NSItemProviderCompletionHandler,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?, objc.NSError)>, ffi.Pointer<objc.ObjCObject>, objc.NSDictionary)>`.
 abstract final class ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary {
@@ -71654,7 +79163,7 @@
                 objc.ObjCObjectBase(arg1, retain: false, release: true),
                 objc.NSDictionary.castFromPointer(arg2,
                     retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1j2nt86(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_1b3bb6a(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(
@@ -71663,6 +79172,62 @@
             ffi.Pointer<objc.ObjCObject>,
             objc.NSDictionary)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(
+          objc.ObjCBlock<
+              ffi.Void Function(ffi.Pointer<objc.ObjCObject>?, objc.NSError)>,
+          ffi.Pointer<objc.ObjCObject>,
+          objc.NSDictionary)> blocking(
+      void Function(DartNSItemProviderCompletionHandler, objc.ObjCObjectBase,
+              objc.NSDictionary)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary_blockingCallable
+            .nativeFunction
+            .cast(),
+        (NSItemProviderCompletionHandler arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                ObjCBlock_ffiVoid_objcObjCObject_NSError.castFromPointer(arg0,
+                    retain: false, release: true),
+                objc.ObjCObjectBase(arg1, retain: false, release: true),
+                objc.NSDictionary.castFromPointer(arg2,
+                    retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSItemProviderCompletionHandler_objcObjCObject_NSDictionary_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (NSItemProviderCompletionHandler arg0,
+                ffi.Pointer<objc.ObjCObject> arg1,
+                ffi.Pointer<objc.ObjCObject> arg2) =>
+            fn(
+                ObjCBlock_ffiVoid_objcObjCObject_NSError.castFromPointer(arg0,
+                    retain: false, release: true),
+                objc.ObjCObjectBase(arg1, retain: false, release: true),
+                objc.NSDictionary.castFromPointer(arg2,
+                    retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_1b3bb6a, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(
+            objc.ObjCBlock<
+                ffi.Void Function(ffi.Pointer<objc.ObjCObject>?, objc.NSError)>,
+            ffi.Pointer<objc.ObjCObject>,
+            objc.NSDictionary)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.ObjCBlock<ffi.Void Function(ffi.Pointer<objc.ObjCObject>?, objc.NSError)>, ffi.Pointer<objc.ObjCObject>, objc.NSDictionary)>`.
@@ -71729,14 +79294,14 @@
 
   /// setPreviewImageHandler:
   set previewImageHandler(DartNSItemProviderLoadHandler? value) {
-    return _objc_msgSend_f167m6(this.ref.pointer, _sel_setPreviewImageHandler_,
+    _objc_msgSend_f167m6(this.ref.pointer, _sel_setPreviewImageHandler_,
         value?.ref.pointer ?? ffi.nullptr);
   }
 
   /// loadPreviewImageWithOptions:completionHandler:
   void loadPreviewImageWithOptions_completionHandler_(objc.NSDictionary options,
       DartNSItemProviderCompletionHandler completionHandler) {
-    _objc_msgSend_14pxqbs(
+    _objc_msgSend_o762yo(
         this.ref.pointer,
         _sel_loadPreviewImageWithOptions_completionHandler_,
         options.ref.pointer,
@@ -71766,7 +79331,7 @@
             ffi.Pointer<ffi.UnsignedShort>,
             objc.NSRange)>();
 late final _sel_compare_options_ = objc.registerName("compare:options:");
-final _objc_msgSend_16ydezh = objc.msgSendPointer
+final _objc_msgSend_pg1fnv = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             NSInteger Function(
@@ -71782,7 +79347,7 @@
             int)>();
 late final _sel_compare_options_range_ =
     objc.registerName("compare:options:range:");
-final _objc_msgSend_eeuxub = objc.msgSendPointer
+final _objc_msgSend_xrqic1 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             NSInteger Function(
@@ -71800,7 +79365,7 @@
             objc.NSRange)>();
 late final _sel_compare_options_range_locale_ =
     objc.registerName("compare:options:range:locale:");
-final _objc_msgSend_i4hdht = objc.msgSendPointer
+final _objc_msgSend_1895u4n = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             NSInteger Function(
@@ -71830,7 +79395,7 @@
 late final _sel_hasSuffix_ = objc.registerName("hasSuffix:");
 late final _sel_commonPrefixWithString_options_ =
     objc.registerName("commonPrefixWithString:options:");
-final _objc_msgSend_fcs5vo = objc.msgSendPointer
+final _objc_msgSend_diypgk = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -71851,7 +79416,7 @@
     objc.registerName("localizedStandardContainsString:");
 late final _sel_localizedStandardRangeOfString_ =
     objc.registerName("localizedStandardRangeOfString:");
-final _objc_msgSend_x4muu7 = objc.msgSendPointer
+final _objc_msgSend_182fzon = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             objc.NSRange Function(
@@ -71861,7 +79426,7 @@
     .asFunction<
         objc.NSRange Function(ffi.Pointer<objc.ObjCObject>,
             ffi.Pointer<objc.ObjCSelector>, ffi.Pointer<objc.ObjCObject>)>();
-final _objc_msgSend_x4muu7Stret = objc.msgSendStretPointer
+final _objc_msgSend_182fzonStret = objc.msgSendStretPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -71875,7 +79440,7 @@
 late final _sel_rangeOfString_ = objc.registerName("rangeOfString:");
 late final _sel_rangeOfString_options_ =
     objc.registerName("rangeOfString:options:");
-final _objc_msgSend_1kwndnw = objc.msgSendPointer
+final _objc_msgSend_102xxo4 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             objc.NSRange Function(
@@ -71889,7 +79454,7 @@
             ffi.Pointer<objc.ObjCSelector>,
             ffi.Pointer<objc.ObjCObject>,
             int)>();
-final _objc_msgSend_1kwndnwStret = objc.msgSendStretPointer
+final _objc_msgSend_102xxo4Stret = objc.msgSendStretPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -71907,7 +79472,7 @@
             int)>();
 late final _sel_rangeOfString_options_range_ =
     objc.registerName("rangeOfString:options:range:");
-final _objc_msgSend_ackzik = objc.msgSendPointer
+final _objc_msgSend_1nmlvqc = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             objc.NSRange Function(
@@ -71923,7 +79488,7 @@
             ffi.Pointer<objc.ObjCObject>,
             int,
             objc.NSRange)>();
-final _objc_msgSend_ackzikStret = objc.msgSendStretPointer
+final _objc_msgSend_1nmlvqcStret = objc.msgSendStretPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -71943,7 +79508,7 @@
             objc.NSRange)>();
 late final _sel_rangeOfString_options_range_locale_ =
     objc.registerName("rangeOfString:options:range:locale:");
-final _objc_msgSend_198mga8 = objc.msgSendPointer
+final _objc_msgSend_gg0462 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             objc.NSRange Function(
@@ -71961,7 +79526,7 @@
             int,
             objc.NSRange,
             ffi.Pointer<objc.ObjCObject>)>();
-final _objc_msgSend_198mga8Stret = objc.msgSendStretPointer
+final _objc_msgSend_gg0462Stret = objc.msgSendStretPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -72159,6 +79724,61 @@
                 ffi.Pointer<ffi.Bool>)>.listener(
         _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    NSRange arg1,
+    NSRange arg2,
+    ffi.Pointer<ffi.Bool> arg3) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<objc.ObjCObject>,
+        NSRange, NSRange, ffi.Pointer<ffi.Bool>))(arg0, arg1, arg2, arg3);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            NSRange,
+            NSRange,
+            ffi.Pointer<ffi.Bool>)>
+    _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_blockingCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                NSRange,
+                NSRange,
+                ffi.Pointer<ffi.Bool>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            NSRange,
+            NSRange,
+            ffi.Pointer<ffi.Bool>)>
+    _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_blockingListenerCallable =
+    ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                NSRange,
+                NSRange,
+                ffi.Pointer<ffi.Bool>)>.listener(
+        _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSString?, objc.NSRange, objc.NSRange, ffi.Pointer<ffi.Bool>)>`.
 abstract final class ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool {
@@ -72234,12 +79854,63 @@
                 arg1,
                 arg2,
                 arg3));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_8wbg7l(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_lmc3p5(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
         ffi.Void Function(objc.NSString?, objc.NSRange, objc.NSRange,
             ffi.Pointer<ffi.Bool>)>(wrapper, retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<
+      ffi.Void Function(objc.NSString?, objc.NSRange, objc.NSRange,
+          ffi.Pointer<ffi.Bool>)> blocking(
+      void Function(objc.NSString?, NSRange, NSRange, ffi.Pointer<ffi.Bool>)
+          fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_blockingCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, NSRange arg1, NSRange arg2,
+                ffi.Pointer<ffi.Bool> arg3) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.NSString.castFromPointer(arg0,
+                        retain: false, release: true),
+                arg1,
+                arg2,
+                arg3));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, NSRange arg1, NSRange arg2,
+                ffi.Pointer<ffi.Bool> arg3) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.NSString.castFromPointer(arg0,
+                        retain: false, release: true),
+                arg1,
+                arg2,
+                arg3));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_lmc3p5, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+        ffi.Void Function(objc.NSString?, objc.NSRange, objc.NSRange,
+            ffi.Pointer<ffi.Bool>)>(wrapper, retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSString?, objc.NSRange, objc.NSRange, ffi.Pointer<ffi.Bool>)>`.
@@ -72333,6 +80004,50 @@
                 ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Bool>)>.listener(
         _ObjCBlock_ffiVoid_NSString_bool_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSString_bool_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    ffi.Pointer<ffi.Bool> arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(
+        ffi.Pointer<objc.ObjCObject>, ffi.Pointer<ffi.Bool>))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<ffi.Bool>)>
+    _ObjCBlock_ffiVoid_NSString_bool_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<ffi.Bool>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSString_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<ffi.Bool>)>
+    _ObjCBlock_ffiVoid_NSString_bool_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<ffi.Bool>)>.listener(
+        _ObjCBlock_ffiVoid_NSString_bool_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSString, ffi.Pointer<ffi.Bool>)>`.
 abstract final class ObjCBlock_ffiVoid_NSString_bool {
@@ -72395,12 +80110,43 @@
         (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) => fn(
             objc.NSString.castFromPointer(arg0, retain: false, release: true),
             arg1));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_148br51(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_t8l8el(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<
             ffi.Void Function(objc.NSString, ffi.Pointer<ffi.Bool>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSString, ffi.Pointer<ffi.Bool>)>
+      blocking(void Function(objc.NSString, ffi.Pointer<ffi.Bool>) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSString_bool_blockingCallable.nativeFunction.cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) => fn(
+            objc.NSString.castFromPointer(arg0, retain: false, release: true),
+            arg1));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSString_bool_blockingListenerCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) => fn(
+            objc.NSString.castFromPointer(arg0, retain: false, release: true),
+            arg1));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_t8l8el, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(objc.NSString, ffi.Pointer<ffi.Bool>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSString, ffi.Pointer<ffi.Bool>)>`.
@@ -72436,7 +80182,7 @@
 late final _sel_smallestEncoding = objc.registerName("smallestEncoding");
 late final _sel_dataUsingEncoding_allowLossyConversion_ =
     objc.registerName("dataUsingEncoding:allowLossyConversion:");
-final _objc_msgSend_rubz6a = objc.msgSendPointer
+final _objc_msgSend_hiwitm = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -72548,7 +80294,7 @@
     objc.registerName("stringByTrimmingCharactersInSet:");
 late final _sel_stringByPaddingToLength_withString_startingAtIndex_ =
     objc.registerName("stringByPaddingToLength:withString:startingAtIndex:");
-final _objc_msgSend_exgdqb = objc.msgSendPointer
+final _objc_msgSend_1tfztp = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72566,7 +80312,7 @@
             int)>();
 late final _sel_stringByFoldingWithOptions_locale_ =
     objc.registerName("stringByFoldingWithOptions:locale:");
-final _objc_msgSend_146986e = objc.msgSendPointer
+final _objc_msgSend_11cbyu0 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72583,7 +80329,7 @@
 late final _sel_stringByReplacingOccurrencesOfString_withString_options_range_ =
     objc.registerName(
         "stringByReplacingOccurrencesOfString:withString:options:range:");
-final _objc_msgSend_1wrs2o6 = objc.msgSendPointer
+final _objc_msgSend_2u4jm6 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72605,7 +80351,7 @@
     objc.registerName("stringByReplacingOccurrencesOfString:withString:");
 late final _sel_stringByReplacingCharactersInRange_withString_ =
     objc.registerName("stringByReplacingCharactersInRange:withString:");
-final _objc_msgSend_197wcu5 = objc.msgSendPointer
+final _objc_msgSend_bstjp9 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72625,7 +80371,7 @@
     objc.registerName("stringByApplyingTransform:reverse:");
 late final _sel_writeToURL_atomically_encoding_error_ =
     objc.registerName("writeToURL:atomically:encoding:error:");
-final _objc_msgSend_1140663 = objc.msgSendPointer
+final _objc_msgSend_dv3z6r = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Bool Function(
@@ -72648,7 +80394,7 @@
 late final _sel_hash = objc.registerName("hash");
 late final _sel_initWithCharactersNoCopy_length_freeWhenDone_ =
     objc.registerName("initWithCharactersNoCopy:length:freeWhenDone:");
-final _objc_msgSend_zsd8q9 = objc.msgSendPointer
+final _objc_msgSend_lh0jh5 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72709,6 +80455,44 @@
                 ffi.Pointer<unichar>, NSUInteger)>.listener(
         _ObjCBlock_ffiVoid_unichar_NSUInteger_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_unichar_NSUInteger_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<unichar> arg0,
+    int arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<unichar>, int))(
+        arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<unichar>, NSUInteger)>
+    _ObjCBlock_ffiVoid_unichar_NSUInteger_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<unichar>,
+                NSUInteger)>.isolateLocal(
+        _ObjCBlock_ffiVoid_unichar_NSUInteger_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<unichar>, NSUInteger)>
+    _ObjCBlock_ffiVoid_unichar_NSUInteger_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<unichar>,
+                NSUInteger)>.listener(
+        _ObjCBlock_ffiVoid_unichar_NSUInteger_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<unichar>, ffi.UnsignedLong)>`.
 abstract final class ObjCBlock_ffiVoid_unichar_NSUInteger {
@@ -72773,6 +80557,36 @@
             ffi.Void Function(ffi.Pointer<unichar>, ffi.UnsignedLong)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc
+      .ObjCBlock<ffi.Void Function(ffi.Pointer<unichar>, ffi.UnsignedLong)>
+      blocking(void Function(ffi.Pointer<unichar>, DartNSUInteger) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_unichar_NSUInteger_blockingCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<unichar> arg0, int arg1) => fn(arg0, arg1));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_unichar_NSUInteger_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<unichar> arg0, int arg1) => fn(arg0, arg1));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_vhbh5h, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(ffi.Pointer<unichar>, ffi.UnsignedLong)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<unichar>, ffi.UnsignedLong)>`.
@@ -72791,7 +80605,7 @@
 
 late final _sel_initWithCharactersNoCopy_length_deallocator_ =
     objc.registerName("initWithCharactersNoCopy:length:deallocator:");
-final _objc_msgSend_1pr13r6 = objc.msgSendPointer
+final _objc_msgSend_talwei = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72809,7 +80623,7 @@
             ffi.Pointer<objc.ObjCBlockImpl>)>();
 late final _sel_initWithCharacters_length_ =
     objc.registerName("initWithCharacters:length:");
-final _objc_msgSend_13z9dkp = objc.msgSendPointer
+final _objc_msgSend_9x4k8x = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72824,7 +80638,7 @@
             ffi.Pointer<ffi.UnsignedShort>,
             int)>();
 late final _sel_initWithUTF8String_ = objc.registerName("initWithUTF8String:");
-final _objc_msgSend_rqwdif = objc.msgSendPointer
+final _objc_msgSend_56zxyn = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(ffi.Pointer<objc.ObjCObject>,
@@ -72837,7 +80651,7 @@
     objc.registerName("initWithFormat:locale:");
 late final _sel_initWithValidatedFormat_validFormatSpecifiers_error_ =
     objc.registerName("initWithValidatedFormat:validFormatSpecifiers:error:");
-final _objc_msgSend_bo6ep4 = objc.msgSendPointer
+final _objc_msgSend_1pnyuds = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72856,7 +80670,7 @@
 late final _sel_initWithValidatedFormat_validFormatSpecifiers_locale_error_ =
     objc.registerName(
         "initWithValidatedFormat:validFormatSpecifiers:locale:error:");
-final _objc_msgSend_2izev6 = objc.msgSendPointer
+final _objc_msgSend_1k0ezzm = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72878,7 +80692,7 @@
     objc.registerName("initWithData:encoding:");
 late final _sel_initWithBytes_length_encoding_ =
     objc.registerName("initWithBytes:length:encoding:");
-final _objc_msgSend_i38ton = objc.msgSendPointer
+final _objc_msgSend_9b3h4v = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72892,7 +80706,7 @@
             ffi.Pointer<objc.ObjCSelector>, ffi.Pointer<ffi.Void>, int, int)>();
 late final _sel_initWithBytesNoCopy_length_encoding_freeWhenDone_ =
     objc.registerName("initWithBytesNoCopy:length:encoding:freeWhenDone:");
-final _objc_msgSend_o2ktnn = objc.msgSendPointer
+final _objc_msgSend_k4j8m3 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -72955,6 +80769,44 @@
                 ffi.Pointer<ffi.Void>, NSUInteger)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_NSUInteger_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_ffiVoid_NSUInteger_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<ffi.Void> arg0,
+    int arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<ffi.Void>, int))(
+        arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>, NSUInteger)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSUInteger_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                NSUInteger)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_NSUInteger_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>, NSUInteger)>
+    _ObjCBlock_ffiVoid_ffiVoid_NSUInteger_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<ffi.Void>,
+                NSUInteger)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_NSUInteger_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.UnsignedLong)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid_NSUInteger {
@@ -73020,6 +80872,36 @@
             ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.UnsignedLong)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc
+      .ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.UnsignedLong)>
+      blocking(void Function(ffi.Pointer<ffi.Void>, DartNSUInteger) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSUInteger_blockingCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, int arg1) => fn(arg0, arg1));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_NSUInteger_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0, int arg1) => fn(arg0, arg1));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_zuf90e, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<
+            ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.UnsignedLong)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.UnsignedLong)>`.
@@ -73038,7 +80920,7 @@
 
 late final _sel_initWithBytesNoCopy_length_encoding_deallocator_ =
     objc.registerName("initWithBytesNoCopy:length:encoding:deallocator:");
-final _objc_msgSend_1nnfqvg = objc.msgSendPointer
+final _objc_msgSend_1lbgrac = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -73071,7 +80953,7 @@
         "localizedStringWithValidatedFormat:validFormatSpecifiers:error:");
 late final _sel_initWithCString_encoding_ =
     objc.registerName("initWithCString:encoding:");
-final _objc_msgSend_a15xhc = objc.msgSendPointer
+final _objc_msgSend_erqryg = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -73086,7 +80968,7 @@
     objc.registerName("stringWithCString:encoding:");
 late final _sel_initWithContentsOfURL_encoding_error_ =
     objc.registerName("initWithContentsOfURL:encoding:error:");
-final _objc_msgSend_94cet5 = objc.msgSendPointer
+final _objc_msgSend_1nomli1 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -73110,7 +80992,7 @@
     objc.registerName("stringWithContentsOfFile:encoding:error:");
 late final _sel_initWithContentsOfURL_usedEncoding_error_ =
     objc.registerName("initWithContentsOfURL:usedEncoding:error:");
-final _objc_msgSend_1gxo8gv = objc.msgSendPointer
+final _objc_msgSend_1alewu7 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -73138,21 +81020,21 @@
   /// substringFromIndex:
   objc.NSString substringFromIndex_(DartNSUInteger from) {
     final _ret =
-        _objc_msgSend_1qrcblu(this.ref.pointer, _sel_substringFromIndex_, from);
+        _objc_msgSend_14hpxwa(this.ref.pointer, _sel_substringFromIndex_, from);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// substringToIndex:
   objc.NSString substringToIndex_(DartNSUInteger to) {
     final _ret =
-        _objc_msgSend_1qrcblu(this.ref.pointer, _sel_substringToIndex_, to);
+        _objc_msgSend_14hpxwa(this.ref.pointer, _sel_substringToIndex_, to);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// substringWithRange:
   objc.NSString substringWithRange_(NSRange range) {
-    final _ret =
-        _objc_msgSend_83z673(this.ref.pointer, _sel_substringWithRange_, range);
+    final _ret = _objc_msgSend_1k1o1s7(
+        this.ref.pointer, _sel_substringWithRange_, range);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -73164,7 +81046,7 @@
 
   /// compare:
   objc.NSComparisonResult compare_(objc.NSString string) {
-    final _ret = _objc_msgSend_1wpduvy(
+    final _ret = _objc_msgSend_1ym6zyw(
         this.ref.pointer, _sel_compare_, string.ref.pointer);
     return objc.NSComparisonResult.fromValue(_ret);
   }
@@ -73172,7 +81054,7 @@
   /// compare:options:
   objc.NSComparisonResult compare_options_(
       objc.NSString string, objc.NSStringCompareOptions mask) {
-    final _ret = _objc_msgSend_16ydezh(this.ref.pointer, _sel_compare_options_,
+    final _ret = _objc_msgSend_pg1fnv(this.ref.pointer, _sel_compare_options_,
         string.ref.pointer, mask.value);
     return objc.NSComparisonResult.fromValue(_ret);
   }
@@ -73180,7 +81062,7 @@
   /// compare:options:range:
   objc.NSComparisonResult compare_options_range_(objc.NSString string,
       objc.NSStringCompareOptions mask, NSRange rangeOfReceiverToCompare) {
-    final _ret = _objc_msgSend_eeuxub(
+    final _ret = _objc_msgSend_xrqic1(
         this.ref.pointer,
         _sel_compare_options_range_,
         string.ref.pointer,
@@ -73195,7 +81077,7 @@
       objc.NSStringCompareOptions mask,
       NSRange rangeOfReceiverToCompare,
       objc.ObjCObjectBase? locale) {
-    final _ret = _objc_msgSend_i4hdht(
+    final _ret = _objc_msgSend_1895u4n(
         this.ref.pointer,
         _sel_compare_options_range_locale_,
         string.ref.pointer,
@@ -73207,14 +81089,14 @@
 
   /// caseInsensitiveCompare:
   objc.NSComparisonResult caseInsensitiveCompare_(objc.NSString string) {
-    final _ret = _objc_msgSend_1wpduvy(
+    final _ret = _objc_msgSend_1ym6zyw(
         this.ref.pointer, _sel_caseInsensitiveCompare_, string.ref.pointer);
     return objc.NSComparisonResult.fromValue(_ret);
   }
 
   /// localizedCompare:
   objc.NSComparisonResult localizedCompare_(objc.NSString string) {
-    final _ret = _objc_msgSend_1wpduvy(
+    final _ret = _objc_msgSend_1ym6zyw(
         this.ref.pointer, _sel_localizedCompare_, string.ref.pointer);
     return objc.NSComparisonResult.fromValue(_ret);
   }
@@ -73222,59 +81104,59 @@
   /// localizedCaseInsensitiveCompare:
   objc.NSComparisonResult localizedCaseInsensitiveCompare_(
       objc.NSString string) {
-    final _ret = _objc_msgSend_1wpduvy(this.ref.pointer,
+    final _ret = _objc_msgSend_1ym6zyw(this.ref.pointer,
         _sel_localizedCaseInsensitiveCompare_, string.ref.pointer);
     return objc.NSComparisonResult.fromValue(_ret);
   }
 
   /// localizedStandardCompare:
   objc.NSComparisonResult localizedStandardCompare_(objc.NSString string) {
-    final _ret = _objc_msgSend_1wpduvy(
+    final _ret = _objc_msgSend_1ym6zyw(
         this.ref.pointer, _sel_localizedStandardCompare_, string.ref.pointer);
     return objc.NSComparisonResult.fromValue(_ret);
   }
 
   /// isEqualToString:
   bool isEqualToString_(objc.NSString aString) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_isEqualToString_, aString.ref.pointer);
   }
 
   /// hasPrefix:
   bool hasPrefix_(objc.NSString str) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_hasPrefix_, str.ref.pointer);
   }
 
   /// hasSuffix:
   bool hasSuffix_(objc.NSString str) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_hasSuffix_, str.ref.pointer);
   }
 
   /// commonPrefixWithString:options:
   objc.NSString commonPrefixWithString_options_(
       objc.NSString str, objc.NSStringCompareOptions mask) {
-    final _ret = _objc_msgSend_fcs5vo(this.ref.pointer,
+    final _ret = _objc_msgSend_diypgk(this.ref.pointer,
         _sel_commonPrefixWithString_options_, str.ref.pointer, mask.value);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// containsString:
   bool containsString_(objc.NSString str) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_containsString_, str.ref.pointer);
   }
 
   /// localizedCaseInsensitiveContainsString:
   bool localizedCaseInsensitiveContainsString_(objc.NSString str) {
-    return _objc_msgSend_69e0x1(this.ref.pointer,
+    return _objc_msgSend_19nvye5(this.ref.pointer,
         _sel_localizedCaseInsensitiveContainsString_, str.ref.pointer);
   }
 
   /// localizedStandardContainsString:
   bool localizedStandardContainsString_(objc.NSString str) {
-    return _objc_msgSend_69e0x1(this.ref.pointer,
+    return _objc_msgSend_19nvye5(this.ref.pointer,
         _sel_localizedStandardContainsString_, str.ref.pointer);
   }
 
@@ -73282,9 +81164,9 @@
   NSRange localizedStandardRangeOfString_(objc.NSString str) {
     final _ptr = pkg_ffi.calloc<NSRange>();
     objc.useMsgSendVariants
-        ? _objc_msgSend_x4muu7Stret(_ptr, this.ref.pointer,
+        ? _objc_msgSend_182fzonStret(_ptr, this.ref.pointer,
             _sel_localizedStandardRangeOfString_, str.ref.pointer)
-        : _ptr.ref = _objc_msgSend_x4muu7(this.ref.pointer,
+        : _ptr.ref = _objc_msgSend_182fzon(this.ref.pointer,
             _sel_localizedStandardRangeOfString_, str.ref.pointer);
     final _finalizable = _ptr.cast<ffi.Uint8>().asTypedList(
         ffi.sizeOf<NSRange>(),
@@ -73296,9 +81178,9 @@
   NSRange rangeOfString_(objc.NSString searchString) {
     final _ptr = pkg_ffi.calloc<NSRange>();
     objc.useMsgSendVariants
-        ? _objc_msgSend_x4muu7Stret(_ptr, this.ref.pointer, _sel_rangeOfString_,
-            searchString.ref.pointer)
-        : _ptr.ref = _objc_msgSend_x4muu7(
+        ? _objc_msgSend_182fzonStret(_ptr, this.ref.pointer,
+            _sel_rangeOfString_, searchString.ref.pointer)
+        : _ptr.ref = _objc_msgSend_182fzon(
             this.ref.pointer, _sel_rangeOfString_, searchString.ref.pointer);
     final _finalizable = _ptr.cast<ffi.Uint8>().asTypedList(
         ffi.sizeOf<NSRange>(),
@@ -73311,9 +81193,9 @@
       objc.NSString searchString, objc.NSStringCompareOptions mask) {
     final _ptr = pkg_ffi.calloc<NSRange>();
     objc.useMsgSendVariants
-        ? _objc_msgSend_1kwndnwStret(_ptr, this.ref.pointer,
+        ? _objc_msgSend_102xxo4Stret(_ptr, this.ref.pointer,
             _sel_rangeOfString_options_, searchString.ref.pointer, mask.value)
-        : _ptr.ref = _objc_msgSend_1kwndnw(this.ref.pointer,
+        : _ptr.ref = _objc_msgSend_102xxo4(this.ref.pointer,
             _sel_rangeOfString_options_, searchString.ref.pointer, mask.value);
     final _finalizable = _ptr.cast<ffi.Uint8>().asTypedList(
         ffi.sizeOf<NSRange>(),
@@ -73326,14 +81208,14 @@
       objc.NSStringCompareOptions mask, NSRange rangeOfReceiverToSearch) {
     final _ptr = pkg_ffi.calloc<NSRange>();
     objc.useMsgSendVariants
-        ? _objc_msgSend_ackzikStret(
+        ? _objc_msgSend_1nmlvqcStret(
             _ptr,
             this.ref.pointer,
             _sel_rangeOfString_options_range_,
             searchString.ref.pointer,
             mask.value,
             rangeOfReceiverToSearch)
-        : _ptr.ref = _objc_msgSend_ackzik(
+        : _ptr.ref = _objc_msgSend_1nmlvqc(
             this.ref.pointer,
             _sel_rangeOfString_options_range_,
             searchString.ref.pointer,
@@ -73353,7 +81235,7 @@
       objc.NSLocale? locale) {
     final _ptr = pkg_ffi.calloc<NSRange>();
     objc.useMsgSendVariants
-        ? _objc_msgSend_198mga8Stret(
+        ? _objc_msgSend_gg0462Stret(
             _ptr,
             this.ref.pointer,
             _sel_rangeOfString_options_range_locale_,
@@ -73361,7 +81243,7 @@
             mask.value,
             rangeOfReceiverToSearch,
             locale?.ref.pointer ?? ffi.nullptr)
-        : _ptr.ref = _objc_msgSend_198mga8(
+        : _ptr.ref = _objc_msgSend_gg0462(
             this.ref.pointer,
             _sel_rangeOfString_options_range_locale_,
             searchString.ref.pointer,
@@ -73378,9 +81260,9 @@
   NSRange rangeOfCharacterFromSet_(objc.NSCharacterSet searchSet) {
     final _ptr = pkg_ffi.calloc<NSRange>();
     objc.useMsgSendVariants
-        ? _objc_msgSend_x4muu7Stret(_ptr, this.ref.pointer,
+        ? _objc_msgSend_182fzonStret(_ptr, this.ref.pointer,
             _sel_rangeOfCharacterFromSet_, searchSet.ref.pointer)
-        : _ptr.ref = _objc_msgSend_x4muu7(this.ref.pointer,
+        : _ptr.ref = _objc_msgSend_182fzon(this.ref.pointer,
             _sel_rangeOfCharacterFromSet_, searchSet.ref.pointer);
     final _finalizable = _ptr.cast<ffi.Uint8>().asTypedList(
         ffi.sizeOf<NSRange>(),
@@ -73393,13 +81275,13 @@
       objc.NSCharacterSet searchSet, objc.NSStringCompareOptions mask) {
     final _ptr = pkg_ffi.calloc<NSRange>();
     objc.useMsgSendVariants
-        ? _objc_msgSend_1kwndnwStret(
+        ? _objc_msgSend_102xxo4Stret(
             _ptr,
             this.ref.pointer,
             _sel_rangeOfCharacterFromSet_options_,
             searchSet.ref.pointer,
             mask.value)
-        : _ptr.ref = _objc_msgSend_1kwndnw(
+        : _ptr.ref = _objc_msgSend_102xxo4(
             this.ref.pointer,
             _sel_rangeOfCharacterFromSet_options_,
             searchSet.ref.pointer,
@@ -73415,14 +81297,14 @@
       objc.NSStringCompareOptions mask, NSRange rangeOfReceiverToSearch) {
     final _ptr = pkg_ffi.calloc<NSRange>();
     objc.useMsgSendVariants
-        ? _objc_msgSend_ackzikStret(
+        ? _objc_msgSend_1nmlvqcStret(
             _ptr,
             this.ref.pointer,
             _sel_rangeOfCharacterFromSet_options_range_,
             searchSet.ref.pointer,
             mask.value,
             rangeOfReceiverToSearch)
-        : _ptr.ref = _objc_msgSend_ackzik(
+        : _ptr.ref = _objc_msgSend_1nmlvqc(
             this.ref.pointer,
             _sel_rangeOfCharacterFromSet_options_range_,
             searchSet.ref.pointer,
@@ -73464,14 +81346,14 @@
 
   /// stringByAppendingString:
   objc.NSString stringByAppendingString_(objc.NSString aString) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_stringByAppendingString_, aString.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// stringByAppendingFormat:
   objc.NSString stringByAppendingFormat_(objc.NSString format) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_stringByAppendingFormat_, format.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -73512,61 +81394,61 @@
 
   /// uppercaseString
   objc.NSString get uppercaseString {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_uppercaseString);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_uppercaseString);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// lowercaseString
   objc.NSString get lowercaseString {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_lowercaseString);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_lowercaseString);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// capitalizedString
   objc.NSString get capitalizedString {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_capitalizedString);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_capitalizedString);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// localizedUppercaseString
   objc.NSString get localizedUppercaseString {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_localizedUppercaseString);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_localizedUppercaseString);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// localizedLowercaseString
   objc.NSString get localizedLowercaseString {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_localizedLowercaseString);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_localizedLowercaseString);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// localizedCapitalizedString
   objc.NSString get localizedCapitalizedString {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_localizedCapitalizedString);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// uppercaseStringWithLocale:
   objc.NSString uppercaseStringWithLocale_(objc.NSLocale? locale) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_uppercaseStringWithLocale_, locale?.ref.pointer ?? ffi.nullptr);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// lowercaseStringWithLocale:
   objc.NSString lowercaseStringWithLocale_(objc.NSLocale? locale) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_lowercaseStringWithLocale_, locale?.ref.pointer ?? ffi.nullptr);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// capitalizedStringWithLocale:
   objc.NSString capitalizedStringWithLocale_(objc.NSLocale? locale) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_capitalizedStringWithLocale_, locale?.ref.pointer ?? ffi.nullptr);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -73671,7 +81553,7 @@
   /// dataUsingEncoding:allowLossyConversion:
   objc.NSData? dataUsingEncoding_allowLossyConversion_(
       DartNSUInteger encoding, bool lossy) {
-    final _ret = _objc_msgSend_rubz6a(this.ref.pointer,
+    final _ret = _objc_msgSend_hiwitm(this.ref.pointer,
         _sel_dataUsingEncoding_allowLossyConversion_, encoding, lossy);
     return _ret.address == 0
         ? null
@@ -73680,7 +81562,7 @@
 
   /// dataUsingEncoding:
   objc.NSData? dataUsingEncoding_(DartNSUInteger encoding) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         this.ref.pointer, _sel_dataUsingEncoding_, encoding);
     return _ret.address == 0
         ? null
@@ -73747,7 +81629,7 @@
 
   /// localizedNameOfStringEncoding:
   static objc.NSString localizedNameOfStringEncoding_(DartNSUInteger encoding) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         _class_NSString, _sel_localizedNameOfStringEncoding_, encoding);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -73759,35 +81641,35 @@
 
   /// decomposedStringWithCanonicalMapping
   objc.NSString get decomposedStringWithCanonicalMapping {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_decomposedStringWithCanonicalMapping);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// precomposedStringWithCanonicalMapping
   objc.NSString get precomposedStringWithCanonicalMapping {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_precomposedStringWithCanonicalMapping);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// decomposedStringWithCompatibilityMapping
   objc.NSString get decomposedStringWithCompatibilityMapping {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_decomposedStringWithCompatibilityMapping);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// precomposedStringWithCompatibilityMapping
   objc.NSString get precomposedStringWithCompatibilityMapping {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_precomposedStringWithCompatibilityMapping);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// componentsSeparatedByString:
   objc.NSArray componentsSeparatedByString_(objc.NSString separator) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_componentsSeparatedByString_, separator.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -73795,14 +81677,14 @@
   /// componentsSeparatedByCharactersInSet:
   objc.NSArray componentsSeparatedByCharactersInSet_(
       objc.NSCharacterSet separator) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_componentsSeparatedByCharactersInSet_, separator.ref.pointer);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// stringByTrimmingCharactersInSet:
   objc.NSString stringByTrimmingCharactersInSet_(objc.NSCharacterSet set) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_stringByTrimmingCharactersInSet_, set.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -73812,7 +81694,7 @@
       DartNSUInteger newLength,
       objc.NSString padString,
       DartNSUInteger padIndex) {
-    final _ret = _objc_msgSend_exgdqb(
+    final _ret = _objc_msgSend_1tfztp(
         this.ref.pointer,
         _sel_stringByPaddingToLength_withString_startingAtIndex_,
         newLength,
@@ -73824,7 +81706,7 @@
   /// stringByFoldingWithOptions:locale:
   objc.NSString stringByFoldingWithOptions_locale_(
       objc.NSStringCompareOptions options, objc.NSLocale? locale) {
-    final _ret = _objc_msgSend_146986e(
+    final _ret = _objc_msgSend_11cbyu0(
         this.ref.pointer,
         _sel_stringByFoldingWithOptions_locale_,
         options.value,
@@ -73838,7 +81720,7 @@
       objc.NSString replacement,
       objc.NSStringCompareOptions options,
       NSRange searchRange) {
-    final _ret = _objc_msgSend_1wrs2o6(
+    final _ret = _objc_msgSend_2u4jm6(
         this.ref.pointer,
         _sel_stringByReplacingOccurrencesOfString_withString_options_range_,
         target.ref.pointer,
@@ -73851,7 +81733,7 @@
   /// stringByReplacingOccurrencesOfString:withString:
   objc.NSString stringByReplacingOccurrencesOfString_withString_(
       objc.NSString target, objc.NSString replacement) {
-    final _ret = _objc_msgSend_rsfdlh(
+    final _ret = _objc_msgSend_15qeuct(
         this.ref.pointer,
         _sel_stringByReplacingOccurrencesOfString_withString_,
         target.ref.pointer,
@@ -73862,7 +81744,7 @@
   /// stringByReplacingCharactersInRange:withString:
   objc.NSString stringByReplacingCharactersInRange_withString_(
       NSRange range, objc.NSString replacement) {
-    final _ret = _objc_msgSend_197wcu5(
+    final _ret = _objc_msgSend_bstjp9(
         this.ref.pointer,
         _sel_stringByReplacingCharactersInRange_withString_,
         range,
@@ -73873,7 +81755,7 @@
   /// stringByApplyingTransform:reverse:
   objc.NSString? stringByApplyingTransform_reverse_(
       DartNSStringTransform transform, bool reverse) {
-    final _ret = _objc_msgSend_1bdmr5f(
+    final _ret = _objc_msgSend_17amj0z(
         this.ref.pointer,
         _sel_stringByApplyingTransform_reverse_,
         transform.ref.pointer,
@@ -73889,7 +81771,7 @@
       bool useAuxiliaryFile,
       DartNSUInteger enc,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    return _objc_msgSend_1140663(
+    return _objc_msgSend_dv3z6r(
         this.ref.pointer,
         _sel_writeToURL_atomically_encoding_error_,
         url.ref.pointer,
@@ -73904,7 +81786,7 @@
       bool useAuxiliaryFile,
       DartNSUInteger enc,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    return _objc_msgSend_1140663(
+    return _objc_msgSend_dv3z6r(
         this.ref.pointer,
         _sel_writeToFile_atomically_encoding_error_,
         path.ref.pointer,
@@ -73915,7 +81797,7 @@
 
   /// description
   objc.NSString get description {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_description);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_description);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -73927,7 +81809,7 @@
   /// initWithCharactersNoCopy:length:freeWhenDone:
   objc.NSString initWithCharactersNoCopy_length_freeWhenDone_(
       ffi.Pointer<unichar> characters, DartNSUInteger length, bool freeBuffer) {
-    final _ret = _objc_msgSend_zsd8q9(
+    final _ret = _objc_msgSend_lh0jh5(
         this.ref.retainAndReturnPointer(),
         _sel_initWithCharactersNoCopy_length_freeWhenDone_,
         characters,
@@ -73942,7 +81824,7 @@
       DartNSUInteger len,
       objc.ObjCBlock<ffi.Void Function(ffi.Pointer<unichar>, ffi.UnsignedLong)>?
           deallocator) {
-    final _ret = _objc_msgSend_1pr13r6(
+    final _ret = _objc_msgSend_talwei(
         this.ref.retainAndReturnPointer(),
         _sel_initWithCharactersNoCopy_length_deallocator_,
         chars,
@@ -73954,7 +81836,7 @@
   /// initWithCharacters:length:
   objc.NSString initWithCharacters_length_(
       ffi.Pointer<unichar> characters, DartNSUInteger length) {
-    final _ret = _objc_msgSend_13z9dkp(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_9x4k8x(this.ref.retainAndReturnPointer(),
         _sel_initWithCharacters_length_, characters, length);
     return objc.NSString.castFromPointer(_ret, retain: false, release: true);
   }
@@ -73962,7 +81844,7 @@
   /// initWithUTF8String:
   objc.NSString? initWithUTF8String_(
       ffi.Pointer<ffi.Char> nullTerminatedCString) {
-    final _ret = _objc_msgSend_rqwdif(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_56zxyn(this.ref.retainAndReturnPointer(),
         _sel_initWithUTF8String_, nullTerminatedCString);
     return _ret.address == 0
         ? null
@@ -73971,14 +81853,14 @@
 
   /// initWithString:
   objc.NSString initWithString_(objc.NSString aString) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithString_, aString.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// initWithFormat:
   objc.NSString initWithFormat_(objc.NSString format) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithFormat_, format.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: false, release: true);
   }
@@ -73986,7 +81868,7 @@
   /// initWithFormat:locale:
   objc.NSString initWithFormat_locale_(
       objc.NSString format, objc.ObjCObjectBase? locale) {
-    final _ret = _objc_msgSend_rsfdlh(
+    final _ret = _objc_msgSend_15qeuct(
         this.ref.retainAndReturnPointer(),
         _sel_initWithFormat_locale_,
         format.ref.pointer,
@@ -73999,7 +81881,7 @@
       objc.NSString format,
       objc.NSString validFormatSpecifiers,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_bo6ep4(
+    final _ret = _objc_msgSend_1pnyuds(
         this.ref.retainAndReturnPointer(),
         _sel_initWithValidatedFormat_validFormatSpecifiers_error_,
         format.ref.pointer,
@@ -74016,7 +81898,7 @@
       objc.NSString validFormatSpecifiers,
       objc.ObjCObjectBase? locale,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_2izev6(
+    final _ret = _objc_msgSend_1k0ezzm(
         this.ref.retainAndReturnPointer(),
         _sel_initWithValidatedFormat_validFormatSpecifiers_locale_error_,
         format.ref.pointer,
@@ -74031,7 +81913,7 @@
   /// initWithData:encoding:
   objc.NSString? initWithData_encoding_(
       objc.NSData data, DartNSUInteger encoding) {
-    final _ret = _objc_msgSend_dcd68g(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1k4kd9s(this.ref.retainAndReturnPointer(),
         _sel_initWithData_encoding_, data.ref.pointer, encoding);
     return _ret.address == 0
         ? null
@@ -74041,7 +81923,7 @@
   /// initWithBytes:length:encoding:
   objc.NSString? initWithBytes_length_encoding_(ffi.Pointer<ffi.Void> bytes,
       DartNSUInteger len, DartNSUInteger encoding) {
-    final _ret = _objc_msgSend_i38ton(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_9b3h4v(this.ref.retainAndReturnPointer(),
         _sel_initWithBytes_length_encoding_, bytes, len, encoding);
     return _ret.address == 0
         ? null
@@ -74054,7 +81936,7 @@
       DartNSUInteger len,
       DartNSUInteger encoding,
       bool freeBuffer) {
-    final _ret = _objc_msgSend_o2ktnn(
+    final _ret = _objc_msgSend_k4j8m3(
         this.ref.retainAndReturnPointer(),
         _sel_initWithBytesNoCopy_length_encoding_freeWhenDone_,
         bytes,
@@ -74074,7 +81956,7 @@
       objc.ObjCBlock<
               ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.UnsignedLong)>?
           deallocator) {
-    final _ret = _objc_msgSend_1nnfqvg(
+    final _ret = _objc_msgSend_1lbgrac(
         this.ref.retainAndReturnPointer(),
         _sel_initWithBytesNoCopy_length_encoding_deallocator_,
         bytes,
@@ -74088,13 +81970,13 @@
 
   /// string
   static objc.NSString string() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSString, _sel_string);
+    final _ret = _objc_msgSend_151sglz(_class_NSString, _sel_string);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// stringWithString:
   static objc.NSString stringWithString_(objc.NSString string) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSString, _sel_stringWithString_, string.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -74102,7 +81984,7 @@
   /// stringWithCharacters:length:
   static objc.NSString stringWithCharacters_length_(
       ffi.Pointer<unichar> characters, DartNSUInteger length) {
-    final _ret = _objc_msgSend_13z9dkp(
+    final _ret = _objc_msgSend_9x4k8x(
         _class_NSString, _sel_stringWithCharacters_length_, characters, length);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -74110,7 +81992,7 @@
   /// stringWithUTF8String:
   static objc.NSString? stringWithUTF8String_(
       ffi.Pointer<ffi.Char> nullTerminatedCString) {
-    final _ret = _objc_msgSend_rqwdif(
+    final _ret = _objc_msgSend_56zxyn(
         _class_NSString, _sel_stringWithUTF8String_, nullTerminatedCString);
     return _ret.address == 0
         ? null
@@ -74119,14 +82001,14 @@
 
   /// stringWithFormat:
   static objc.NSString stringWithFormat_(objc.NSString format) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSString, _sel_stringWithFormat_, format.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// localizedStringWithFormat:
   static objc.NSString localizedStringWithFormat_(objc.NSString format) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSString, _sel_localizedStringWithFormat_, format.ref.pointer);
     return objc.NSString.castFromPointer(_ret, retain: true, release: true);
   }
@@ -74136,7 +82018,7 @@
       objc.NSString format,
       objc.NSString validFormatSpecifiers,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_bo6ep4(
+    final _ret = _objc_msgSend_1pnyuds(
         _class_NSString,
         _sel_stringWithValidatedFormat_validFormatSpecifiers_error_,
         format.ref.pointer,
@@ -74153,7 +82035,7 @@
           objc.NSString format,
           objc.NSString validFormatSpecifiers,
           ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_bo6ep4(
+    final _ret = _objc_msgSend_1pnyuds(
         _class_NSString,
         _sel_localizedStringWithValidatedFormat_validFormatSpecifiers_error_,
         format.ref.pointer,
@@ -74167,7 +82049,7 @@
   /// initWithCString:encoding:
   objc.NSString? initWithCString_encoding_(
       ffi.Pointer<ffi.Char> nullTerminatedCString, DartNSUInteger encoding) {
-    final _ret = _objc_msgSend_a15xhc(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_erqryg(this.ref.retainAndReturnPointer(),
         _sel_initWithCString_encoding_, nullTerminatedCString, encoding);
     return _ret.address == 0
         ? null
@@ -74177,7 +82059,7 @@
   /// stringWithCString:encoding:
   static objc.NSString? stringWithCString_encoding_(
       ffi.Pointer<ffi.Char> cString, DartNSUInteger enc) {
-    final _ret = _objc_msgSend_a15xhc(
+    final _ret = _objc_msgSend_erqryg(
         _class_NSString, _sel_stringWithCString_encoding_, cString, enc);
     return _ret.address == 0
         ? null
@@ -74187,7 +82069,7 @@
   /// initWithContentsOfURL:encoding:error:
   objc.NSString? initWithContentsOfURL_encoding_error_(objc.NSURL url,
       DartNSUInteger enc, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_94cet5(
+    final _ret = _objc_msgSend_1nomli1(
         this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_encoding_error_,
         url.ref.pointer,
@@ -74201,7 +82083,7 @@
   /// initWithContentsOfFile:encoding:error:
   objc.NSString? initWithContentsOfFile_encoding_error_(objc.NSString path,
       DartNSUInteger enc, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_94cet5(
+    final _ret = _objc_msgSend_1nomli1(
         this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfFile_encoding_error_,
         path.ref.pointer,
@@ -74215,7 +82097,7 @@
   /// stringWithContentsOfURL:encoding:error:
   static objc.NSString? stringWithContentsOfURL_encoding_error_(objc.NSURL url,
       DartNSUInteger enc, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_94cet5(
+    final _ret = _objc_msgSend_1nomli1(
         _class_NSString,
         _sel_stringWithContentsOfURL_encoding_error_,
         url.ref.pointer,
@@ -74231,7 +82113,7 @@
       objc.NSString path,
       DartNSUInteger enc,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_94cet5(
+    final _ret = _objc_msgSend_1nomli1(
         _class_NSString,
         _sel_stringWithContentsOfFile_encoding_error_,
         path.ref.pointer,
@@ -74247,7 +82129,7 @@
       objc.NSURL url,
       ffi.Pointer<NSStringEncoding> enc,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1gxo8gv(
+    final _ret = _objc_msgSend_1alewu7(
         this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_usedEncoding_error_,
         url.ref.pointer,
@@ -74263,7 +82145,7 @@
       objc.NSString path,
       ffi.Pointer<NSStringEncoding> enc,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1gxo8gv(
+    final _ret = _objc_msgSend_1alewu7(
         this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfFile_usedEncoding_error_,
         path.ref.pointer,
@@ -74279,7 +82161,7 @@
       objc.NSURL url,
       ffi.Pointer<NSStringEncoding> enc,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1gxo8gv(
+    final _ret = _objc_msgSend_1alewu7(
         _class_NSString,
         _sel_stringWithContentsOfURL_usedEncoding_error_,
         url.ref.pointer,
@@ -74295,7 +82177,7 @@
       objc.NSString path,
       ffi.Pointer<NSStringEncoding> enc,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1gxo8gv(
+    final _ret = _objc_msgSend_1alewu7(
         _class_NSString,
         _sel_stringWithContentsOfFile_usedEncoding_error_,
         path.ref.pointer,
@@ -74312,7 +82194,7 @@
 late final _sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_ =
     objc.registerName(
         "stringEncodingForData:encodingOptions:convertedString:usedLossyConversion:");
-final _objc_msgSend_pi68en = objc.msgSendPointer
+final _objc_msgSend_1q2ox4r = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.UnsignedLong Function(
@@ -74340,7 +82222,7 @@
           objc.NSDictionary? opts,
           ffi.Pointer<ffi.Pointer<objc.ObjCObject>> string,
           ffi.Pointer<ffi.Bool> usedLossyConversion) {
-    return _objc_msgSend_pi68en(
+    return _objc_msgSend_1q2ox4r(
         _class_NSString,
         _sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_,
         data.ref.pointer,
@@ -74595,7 +82477,7 @@
 late final _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_ =
     objc.registerName(
         "itemProviderVisibilityForRepresentationWithTypeIdentifier:");
-final _objc_msgSend_96wwe1 = objc.msgSendPointer
+final _objc_msgSend_16fy0up = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             NSInteger Function(
@@ -74760,6 +82642,50 @@
                 ffi.Pointer<objc.ObjCObject>)>.listener(
         _ObjCBlock_ffiVoid_NSData_NSError_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_NSData_NSError_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<objc.ObjCObject> arg0,
+    ffi.Pointer<objc.ObjCObject> arg1) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<objc.ObjCObject>,
+        ffi.Pointer<objc.ObjCObject>))(arg0, arg1);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSData_NSError_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_NSData_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(
+            ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>,
+            ffi.Pointer<objc.ObjCObject>,
+            ffi.Pointer<objc.ObjCObject>)>
+    _ObjCBlock_ffiVoid_NSData_NSError_blockingListenerCallable = ffi
+        .NativeCallable<
+            ffi.Void Function(
+                ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>,
+                ffi.Pointer<objc.ObjCObject>,
+                ffi.Pointer<objc.ObjCObject>)>.listener(
+        _ObjCBlock_ffiVoid_NSData_NSError_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(objc.NSData?, objc.NSError?)>`.
 abstract final class ObjCBlock_ffiVoid_NSData_NSError {
@@ -74832,13 +82758,63 @@
                     ? null
                     : objc.NSError.castFromPointer(arg1,
                         retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_wjvic9(raw);
+    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_pfv6jd(raw);
     objc.objectRelease(raw.cast());
     return objc.ObjCBlock<ffi.Void Function(objc.NSData?, objc.NSError?)>(
         wrapper,
         retain: false,
         release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(objc.NSData?, objc.NSError?)>
+      blocking(void Function(objc.NSData?, objc.NSError?) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSData_NSError_blockingCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.NSData.castFromPointer(arg0,
+                        retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg1,
+                        retain: false, release: true)));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_NSData_NSError_blockingListenerCallable
+            .nativeFunction
+            .cast(),
+        (ffi.Pointer<objc.ObjCObject> arg0,
+                ffi.Pointer<objc.ObjCObject> arg1) =>
+            fn(
+                arg0.address == 0
+                    ? null
+                    : objc.NSData.castFromPointer(arg0,
+                        retain: false, release: true),
+                arg1.address == 0
+                    ? null
+                    : objc.NSError.castFromPointer(arg1,
+                        retain: false, release: true)));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_pfv6jd, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(objc.NSData?, objc.NSError?)>(
+        wrapper,
+        retain: false,
+        release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(objc.NSData?, objc.NSError?)>`.
@@ -74995,7 +82971,7 @@
 extension NSItemProvider on objc.NSString {
   /// readableTypeIdentifiersForItemProvider
   static objc.NSArray getReadableTypeIdentifiersForItemProvider() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSString, _sel_readableTypeIdentifiersForItemProvider);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -75005,7 +82981,7 @@
       objc.NSData data,
       objc.NSString typeIdentifier,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> outError) {
-    final _ret = _objc_msgSend_bo6ep4(
+    final _ret = _objc_msgSend_1pnyuds(
         _class_NSString,
         _sel_objectWithItemProviderData_typeIdentifier_error_,
         data.ref.pointer,
@@ -75018,7 +82994,7 @@
 
   /// writableTypeIdentifiersForItemProvider
   static objc.NSArray getWritableTypeIdentifiersForItemProvider() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSString, _sel_writableTypeIdentifiersForItemProvider);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -75030,7 +83006,7 @@
       throw objc.UnimplementedOptionalMethodException(
           'NSString', 'writableTypeIdentifiersForItemProvider');
     }
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_writableTypeIdentifiersForItemProvider);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -75044,7 +83020,7 @@
       throw objc.UnimplementedOptionalMethodException('NSString',
           'itemProviderVisibilityForRepresentationWithTypeIdentifier:');
     }
-    final _ret = _objc_msgSend_96wwe1(
+    final _ret = _objc_msgSend_16fy0up(
         _class_NSString,
         _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_,
         typeIdentifier.ref.pointer);
@@ -75060,7 +83036,7 @@
       throw objc.UnimplementedOptionalMethodException('NSString',
           'itemProviderVisibilityForRepresentationWithTypeIdentifier:');
     }
-    final _ret = _objc_msgSend_96wwe1(
+    final _ret = _objc_msgSend_16fy0up(
         this.ref.pointer,
         _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_,
         typeIdentifier.ref.pointer);
@@ -75072,7 +83048,7 @@
       objc.NSString typeIdentifier,
       objc.ObjCBlock<ffi.Void Function(objc.NSData?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_o4sqyk(
+    final _ret = _objc_msgSend_r0bo0s(
         this.ref.pointer,
         _sel_loadDataWithTypeIdentifier_forItemProviderCompletionHandler_,
         typeIdentifier.ref.pointer,
@@ -75093,7 +83069,7 @@
 late final _sel_setString_ = objc.registerName("setString:");
 late final _sel_replaceOccurrencesOfString_withString_options_range_ =
     objc.registerName("replaceOccurrencesOfString:withString:options:range:");
-final _objc_msgSend_19rhlmt = objc.msgSendPointer
+final _objc_msgSend_1upeo1d = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.UnsignedLong Function(
@@ -75113,7 +83089,7 @@
             objc.NSRange)>();
 late final _sel_applyTransform_reverse_range_updatedRange_ =
     objc.registerName("applyTransform:reverse:range:updatedRange:");
-final _objc_msgSend_1wfeihn = objc.msgSendPointer
+final _objc_msgSend_zy00wz = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Bool Function(
@@ -75138,7 +83114,7 @@
 extension NSMutableStringExtensionMethods on objc.NSMutableString {
   /// insertString:atIndex:
   void insertString_atIndex_(objc.NSString aString, DartNSUInteger loc) {
-    _objc_msgSend_10i1axw(
+    _objc_msgSend_djsa9o(
         this.ref.pointer, _sel_insertString_atIndex_, aString.ref.pointer, loc);
   }
 
@@ -75150,19 +83126,19 @@
 
   /// appendString:
   void appendString_(objc.NSString aString) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_appendString_, aString.ref.pointer);
   }
 
   /// appendFormat:
   void appendFormat_(objc.NSString format) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_appendFormat_, format.ref.pointer);
   }
 
   /// setString:
   void setString_(objc.NSString aString) {
-    _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setString_, aString.ref.pointer);
   }
 
@@ -75172,7 +83148,7 @@
       objc.NSString replacement,
       objc.NSStringCompareOptions options,
       NSRange searchRange) {
-    return _objc_msgSend_19rhlmt(
+    return _objc_msgSend_1upeo1d(
         this.ref.pointer,
         _sel_replaceOccurrencesOfString_withString_options_range_,
         target.ref.pointer,
@@ -75187,7 +83163,7 @@
       bool reverse,
       NSRange range,
       NSRangePointer resultingRange) {
-    return _objc_msgSend_1wfeihn(
+    return _objc_msgSend_zy00wz(
         this.ref.pointer,
         _sel_applyTransform_reverse_range_updatedRange_,
         transform.ref.pointer,
@@ -75198,7 +83174,7 @@
 
   /// initWithCapacity:
   objc.NSMutableString initWithCapacity_(DartNSUInteger capacity) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         this.ref.retainAndReturnPointer(), _sel_initWithCapacity_, capacity);
     return objc.NSMutableString.castFromPointer(_ret,
         retain: false, release: true);
@@ -75206,7 +83182,7 @@
 
   /// stringWithCapacity:
   static objc.NSMutableString stringWithCapacity_(DartNSUInteger capacity) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         _class_NSMutableString, _sel_stringWithCapacity_, capacity);
     return objc.NSMutableString.castFromPointer(_ret,
         retain: true, release: true);
@@ -75221,13 +83197,13 @@
 extension NSExtendedStringPropertyListParsing on objc.NSString {
   /// propertyList
   objc.ObjCObjectBase propertyList() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_propertyList);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_propertyList);
     return objc.ObjCObjectBase(_ret, retain: true, release: true);
   }
 
   /// propertyListFromStringsFileFormat
   objc.NSDictionary? propertyListFromStringsFileFormat() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_propertyListFromStringsFileFormat);
     return _ret.address == 0
         ? null
@@ -75286,7 +83262,7 @@
     objc.registerName("stringWithContentsOfURL:");
 late final _sel_initWithCStringNoCopy_length_freeWhenDone_ =
     objc.registerName("initWithCStringNoCopy:length:freeWhenDone:");
-final _objc_msgSend_fjj4b8 = objc.msgSendPointer
+final _objc_msgSend_1ojrli4 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Pointer<objc.ObjCObject> Function(
@@ -75363,19 +83339,19 @@
 
   /// writeToFile:atomically:
   bool writeToFile_atomically_(objc.NSString path, bool useAuxiliaryFile) {
-    return _objc_msgSend_w8pbfh(this.ref.pointer, _sel_writeToFile_atomically_,
+    return _objc_msgSend_1iyq28l(this.ref.pointer, _sel_writeToFile_atomically_,
         path.ref.pointer, useAuxiliaryFile);
   }
 
   /// writeToURL:atomically:
   bool writeToURL_atomically_(objc.NSURL url, bool atomically) {
-    return _objc_msgSend_w8pbfh(this.ref.pointer, _sel_writeToURL_atomically_,
+    return _objc_msgSend_1iyq28l(this.ref.pointer, _sel_writeToURL_atomically_,
         url.ref.pointer, atomically);
   }
 
   /// initWithContentsOfFile:
   objc.ObjCObjectBase? initWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -75384,7 +83360,7 @@
 
   /// initWithContentsOfURL:
   objc.ObjCObjectBase? initWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_1sotr3r(this.ref.retainAndReturnPointer(),
         _sel_initWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -75393,7 +83369,7 @@
 
   /// stringWithContentsOfFile:
   static objc.ObjCObjectBase? stringWithContentsOfFile_(objc.NSString path) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSString, _sel_stringWithContentsOfFile_, path.ref.pointer);
     return _ret.address == 0
         ? null
@@ -75402,7 +83378,7 @@
 
   /// stringWithContentsOfURL:
   static objc.ObjCObjectBase? stringWithContentsOfURL_(objc.NSURL url) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSString, _sel_stringWithContentsOfURL_, url.ref.pointer);
     return _ret.address == 0
         ? null
@@ -75412,7 +83388,7 @@
   /// initWithCStringNoCopy:length:freeWhenDone:
   objc.ObjCObjectBase? initWithCStringNoCopy_length_freeWhenDone_(
       ffi.Pointer<ffi.Char> bytes, DartNSUInteger length, bool freeBuffer) {
-    final _ret = _objc_msgSend_fjj4b8(
+    final _ret = _objc_msgSend_1ojrli4(
         this.ref.retainAndReturnPointer(),
         _sel_initWithCStringNoCopy_length_freeWhenDone_,
         bytes,
@@ -75426,7 +83402,7 @@
   /// initWithCString:length:
   objc.ObjCObjectBase? initWithCString_length_(
       ffi.Pointer<ffi.Char> bytes, DartNSUInteger length) {
-    final _ret = _objc_msgSend_a15xhc(this.ref.retainAndReturnPointer(),
+    final _ret = _objc_msgSend_erqryg(this.ref.retainAndReturnPointer(),
         _sel_initWithCString_length_, bytes, length);
     return _ret.address == 0
         ? null
@@ -75435,7 +83411,7 @@
 
   /// initWithCString:
   objc.ObjCObjectBase? initWithCString_(ffi.Pointer<ffi.Char> bytes) {
-    final _ret = _objc_msgSend_rqwdif(
+    final _ret = _objc_msgSend_56zxyn(
         this.ref.retainAndReturnPointer(), _sel_initWithCString_, bytes);
     return _ret.address == 0
         ? null
@@ -75445,7 +83421,7 @@
   /// stringWithCString:length:
   static objc.ObjCObjectBase? stringWithCString_length_(
       ffi.Pointer<ffi.Char> bytes, DartNSUInteger length) {
-    final _ret = _objc_msgSend_a15xhc(
+    final _ret = _objc_msgSend_erqryg(
         _class_NSString, _sel_stringWithCString_length_, bytes, length);
     return _ret.address == 0
         ? null
@@ -75455,7 +83431,7 @@
   /// stringWithCString:
   static objc.ObjCObjectBase? stringWithCString_(ffi.Pointer<ffi.Char> bytes) {
     final _ret =
-        _objc_msgSend_rqwdif(_class_NSString, _sel_stringWithCString_, bytes);
+        _objc_msgSend_56zxyn(_class_NSString, _sel_stringWithCString_, bytes);
     return _ret.address == 0
         ? null
         : objc.ObjCObjectBase(_ret, retain: true, release: true);
@@ -75485,7 +83461,7 @@
 late final _class_NSURL = objc.getClass("NSURL");
 late final _sel_getPromisedItemResourceValue_forKey_error_ =
     objc.registerName("getPromisedItemResourceValue:forKey:error:");
-final _objc_msgSend_7iv28v = objc.msgSendPointer
+final _objc_msgSend_1j9bhml = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Bool Function(
@@ -75534,7 +83510,7 @@
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> value,
       DartNSURLResourceKey key,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    return _objc_msgSend_7iv28v(
+    return _objc_msgSend_1j9bhml(
         this.ref.pointer,
         _sel_getPromisedItemResourceValue_forKey_error_,
         value,
@@ -75545,7 +83521,7 @@
   /// promisedItemResourceValuesForKeys:error:
   objc.NSDictionary? promisedItemResourceValuesForKeys_error_(
       objc.NSArray keys, ffi.Pointer<ffi.Pointer<objc.ObjCObject>> error) {
-    final _ret = _objc_msgSend_1705co6(this.ref.pointer,
+    final _ret = _objc_msgSend_1lhpu4m(this.ref.pointer,
         _sel_promisedItemResourceValuesForKeys_error_, keys.ref.pointer, error);
     return _ret.address == 0
         ? null
@@ -75564,7 +83540,7 @@
 extension NSItemProvider1 on objc.NSURL {
   /// readableTypeIdentifiersForItemProvider
   static objc.NSArray getReadableTypeIdentifiersForItemProvider() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSURL, _sel_readableTypeIdentifiersForItemProvider);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -75574,7 +83550,7 @@
       objc.NSData data,
       objc.NSString typeIdentifier,
       ffi.Pointer<ffi.Pointer<objc.ObjCObject>> outError) {
-    final _ret = _objc_msgSend_bo6ep4(
+    final _ret = _objc_msgSend_1pnyuds(
         _class_NSURL,
         _sel_objectWithItemProviderData_typeIdentifier_error_,
         data.ref.pointer,
@@ -75587,7 +83563,7 @@
 
   /// writableTypeIdentifiersForItemProvider
   static objc.NSArray getWritableTypeIdentifiersForItemProvider() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSURL, _sel_writableTypeIdentifiersForItemProvider);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -75599,7 +83575,7 @@
       throw objc.UnimplementedOptionalMethodException(
           'NSURL', 'writableTypeIdentifiersForItemProvider');
     }
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_writableTypeIdentifiersForItemProvider);
     return objc.NSArray.castFromPointer(_ret, retain: true, release: true);
   }
@@ -75613,7 +83589,7 @@
       throw objc.UnimplementedOptionalMethodException('NSURL',
           'itemProviderVisibilityForRepresentationWithTypeIdentifier:');
     }
-    final _ret = _objc_msgSend_96wwe1(
+    final _ret = _objc_msgSend_16fy0up(
         _class_NSURL,
         _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_,
         typeIdentifier.ref.pointer);
@@ -75629,7 +83605,7 @@
       throw objc.UnimplementedOptionalMethodException('NSURL',
           'itemProviderVisibilityForRepresentationWithTypeIdentifier:');
     }
-    final _ret = _objc_msgSend_96wwe1(
+    final _ret = _objc_msgSend_16fy0up(
         this.ref.pointer,
         _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_,
         typeIdentifier.ref.pointer);
@@ -75641,7 +83617,7 @@
       objc.NSString typeIdentifier,
       objc.ObjCBlock<ffi.Void Function(objc.NSData?, objc.NSError?)>
           completionHandler) {
-    final _ret = _objc_msgSend_o4sqyk(
+    final _ret = _objc_msgSend_r0bo0s(
         this.ref.pointer,
         _sel_loadDataWithTypeIdentifier_forItemProviderCompletionHandler_,
         typeIdentifier.ref.pointer,
@@ -75670,7 +83646,7 @@
 extension NSURLUtilities on objc.NSCharacterSet {
   /// Returns a character set containing the characters allowed in a URL's user subcomponent.
   static objc.NSCharacterSet getURLUserAllowedCharacterSet() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSCharacterSet, _sel_URLUserAllowedCharacterSet);
     return objc.NSCharacterSet.castFromPointer(_ret,
         retain: true, release: true);
@@ -75678,7 +83654,7 @@
 
   /// Returns a character set containing the characters allowed in a URL's password subcomponent.
   static objc.NSCharacterSet getURLPasswordAllowedCharacterSet() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSCharacterSet, _sel_URLPasswordAllowedCharacterSet);
     return objc.NSCharacterSet.castFromPointer(_ret,
         retain: true, release: true);
@@ -75686,7 +83662,7 @@
 
   /// Returns a character set containing the characters allowed in a URL's host subcomponent.
   static objc.NSCharacterSet getURLHostAllowedCharacterSet() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSCharacterSet, _sel_URLHostAllowedCharacterSet);
     return objc.NSCharacterSet.castFromPointer(_ret,
         retain: true, release: true);
@@ -75694,7 +83670,7 @@
 
   /// Returns a character set containing the characters allowed in a URL's path component. ';' is a legal path character, but it is recommended that it be percent-encoded for best compatibility with NSURL (-stringByAddingPercentEncodingWithAllowedCharacters: will percent-encode any ';' characters if you pass the URLPathAllowedCharacterSet).
   static objc.NSCharacterSet getURLPathAllowedCharacterSet() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSCharacterSet, _sel_URLPathAllowedCharacterSet);
     return objc.NSCharacterSet.castFromPointer(_ret,
         retain: true, release: true);
@@ -75702,7 +83678,7 @@
 
   /// Returns a character set containing the characters allowed in a URL's query component.
   static objc.NSCharacterSet getURLQueryAllowedCharacterSet() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSCharacterSet, _sel_URLQueryAllowedCharacterSet);
     return objc.NSCharacterSet.castFromPointer(_ret,
         retain: true, release: true);
@@ -75710,7 +83686,7 @@
 
   /// Returns a character set containing the characters allowed in a URL's fragment component.
   static objc.NSCharacterSet getURLFragmentAllowedCharacterSet() {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         _class_NSCharacterSet, _sel_URLFragmentAllowedCharacterSet);
     return objc.NSCharacterSet.castFromPointer(_ret,
         retain: true, release: true);
@@ -75731,7 +83707,7 @@
   /// Returns a new string made from the receiver by replacing all characters not in the allowedCharacters set with percent encoded characters. UTF-8 encoding is used to determine the correct percent encoded characters. Entire URL strings cannot be percent-encoded. This method is intended to percent-encode a URL component or subcomponent string, NOT the entire URL string. Any characters in allowedCharacters outside of the 7-bit ASCII range are ignored.
   objc.NSString? stringByAddingPercentEncodingWithAllowedCharacters_(
       objc.NSCharacterSet allowedCharacters) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer,
         _sel_stringByAddingPercentEncodingWithAllowedCharacters_,
         allowedCharacters.ref.pointer);
@@ -75742,7 +83718,7 @@
 
   /// Returns a new string made from the receiver by replacing all percent encoded sequences with the matching UTF-8 characters.
   objc.NSString? get stringByRemovingPercentEncoding {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_stringByRemovingPercentEncoding);
     return _ret.address == 0
         ? null
@@ -75752,7 +83728,7 @@
   /// stringByAddingPercentEscapesUsingEncoding:
   objc.NSString? stringByAddingPercentEscapesUsingEncoding_(
       DartNSUInteger enc) {
-    final _ret = _objc_msgSend_1qrcblu(
+    final _ret = _objc_msgSend_14hpxwa(
         this.ref.pointer, _sel_stringByAddingPercentEscapesUsingEncoding_, enc);
     return _ret.address == 0
         ? null
@@ -75762,7 +83738,7 @@
   /// stringByReplacingPercentEscapesUsingEncoding:
   objc.NSString? stringByReplacingPercentEscapesUsingEncoding_(
       DartNSUInteger enc) {
-    final _ret = _objc_msgSend_1qrcblu(this.ref.pointer,
+    final _ret = _objc_msgSend_14hpxwa(this.ref.pointer,
         _sel_stringByReplacingPercentEscapesUsingEncoding_, enc);
     return _ret.address == 0
         ? null
@@ -75796,7 +83772,7 @@
 extension NSURLPathUtilities on objc.NSURL {
   /// The following methods work on the path portion of a URL in the same manner that the NSPathUtilities methods on NSString do.
   static objc.NSURL? fileURLWithPathComponents_(objc.NSArray components) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         _class_NSURL, _sel_fileURLWithPathComponents_, components.ref.pointer);
     return _ret.address == 0
         ? null
@@ -75805,7 +83781,7 @@
 
   /// pathComponents
   objc.NSArray? get pathComponents {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_pathComponents);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_pathComponents);
     return _ret.address == 0
         ? null
         : objc.NSArray.castFromPointer(_ret, retain: true, release: true);
@@ -75814,7 +83790,7 @@
   /// lastPathComponent
   objc.NSString? get lastPathComponent {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_lastPathComponent);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_lastPathComponent);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -75822,7 +83798,7 @@
 
   /// pathExtension
   objc.NSString? get pathExtension {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_pathExtension);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_pathExtension);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -75830,7 +83806,7 @@
 
   /// URLByAppendingPathComponent:
   objc.NSURL? URLByAppendingPathComponent_(objc.NSString pathComponent) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_URLByAppendingPathComponent_, pathComponent.ref.pointer);
     return _ret.address == 0
         ? null
@@ -75840,7 +83816,7 @@
   /// URLByAppendingPathComponent:isDirectory:
   objc.NSURL? URLByAppendingPathComponent_isDirectory_(
       objc.NSString pathComponent, bool isDirectory) {
-    final _ret = _objc_msgSend_1bdmr5f(
+    final _ret = _objc_msgSend_17amj0z(
         this.ref.pointer,
         _sel_URLByAppendingPathComponent_isDirectory_,
         pathComponent.ref.pointer,
@@ -75852,7 +83828,7 @@
 
   /// URLByDeletingLastPathComponent
   objc.NSURL? get URLByDeletingLastPathComponent {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_URLByDeletingLastPathComponent);
     return _ret.address == 0
         ? null
@@ -75861,7 +83837,7 @@
 
   /// URLByAppendingPathExtension:
   objc.NSURL? URLByAppendingPathExtension_(objc.NSString pathExtension) {
-    final _ret = _objc_msgSend_62nh5j(this.ref.pointer,
+    final _ret = _objc_msgSend_1sotr3r(this.ref.pointer,
         _sel_URLByAppendingPathExtension_, pathExtension.ref.pointer);
     return _ret.address == 0
         ? null
@@ -75870,7 +83846,7 @@
 
   /// URLByDeletingPathExtension
   objc.NSURL? get URLByDeletingPathExtension {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_URLByDeletingPathExtension);
     return _ret.address == 0
         ? null
@@ -75887,7 +83863,7 @@
   /// URLByStandardizingPath
   objc.NSURL? get URLByStandardizingPath {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.pointer, _sel_URLByStandardizingPath);
+        _objc_msgSend_151sglz(this.ref.pointer, _sel_URLByStandardizingPath);
     return _ret.address == 0
         ? null
         : objc.NSURL.castFromPointer(_ret, retain: true, release: true);
@@ -75895,7 +83871,7 @@
 
   /// URLByResolvingSymlinksInPath
   objc.NSURL? get URLByResolvingSymlinksInPath {
-    final _ret = _objc_msgSend_1x359cv(
+    final _ret = _objc_msgSend_151sglz(
         this.ref.pointer, _sel_URLByResolvingSymlinksInPath);
     return _ret.address == 0
         ? null
@@ -75917,7 +83893,7 @@
   /// URL:resourceDataDidBecomeAvailable:
   void URL_resourceDataDidBecomeAvailable_(
       objc.NSURL sender, objc.NSData newBytes) {
-    _objc_msgSend_wjvic9(
+    _objc_msgSend_pfv6jd(
         this.ref.pointer,
         _sel_URL_resourceDataDidBecomeAvailable_,
         sender.ref.pointer,
@@ -75926,20 +83902,20 @@
 
   /// URLResourceDidFinishLoading:
   void URLResourceDidFinishLoading_(objc.NSURL sender) {
-    _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_URLResourceDidFinishLoading_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_URLResourceDidFinishLoading_,
         sender.ref.pointer);
   }
 
   /// URLResourceDidCancelLoading:
   void URLResourceDidCancelLoading_(objc.NSURL sender) {
-    _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_URLResourceDidCancelLoading_,
+    _objc_msgSend_xtuoz7(this.ref.pointer, _sel_URLResourceDidCancelLoading_,
         sender.ref.pointer);
   }
 
   /// URL:resourceDidFailLoadingWithReason:
   void URL_resourceDidFailLoadingWithReason_(
       objc.NSURL sender, objc.NSString reason) {
-    _objc_msgSend_wjvic9(
+    _objc_msgSend_pfv6jd(
         this.ref.pointer,
         _sel_URL_resourceDidFailLoadingWithReason_,
         sender.ref.pointer,
@@ -75954,7 +83930,7 @@
 late final _sel_propertyForKey_ = objc.registerName("propertyForKey:");
 late final _sel_setResourceData_ = objc.registerName("setResourceData:");
 late final _sel_setProperty_forKey_ = objc.registerName("setProperty:forKey:");
-final _objc_msgSend_1lqxdg3 = objc.msgSendPointer
+final _objc_msgSend_1lsax7n = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Bool Function(
@@ -75975,7 +83951,7 @@
 extension NSURLLoading on objc.NSURL {
   /// Blocks to load the data if necessary.  If shouldUseCache is YES, then if an equivalent URL has already been loaded and cached, its resource data will be returned immediately.  If shouldUseCache is NO, a new load will be started
   objc.NSData? resourceDataUsingCache_(bool shouldUseCache) {
-    final _ret = _objc_msgSend_1l3kbc1(
+    final _ret = _objc_msgSend_1t6aok9(
         this.ref.pointer, _sel_resourceDataUsingCache_, shouldUseCache);
     return _ret.address == 0
         ? null
@@ -75985,7 +83961,7 @@
   /// Starts an asynchronous load of the data, registering delegate to receive notification.  Only one such background load can proceed at a time.
   void loadResourceDataNotifyingClient_usingCache_(
       objc.ObjCObjectBase client, bool shouldUseCache) {
-    _objc_msgSend_gk45w7(
+    _objc_msgSend_6p7ndb(
         this.ref.pointer,
         _sel_loadResourceDataNotifyingClient_usingCache_,
         client.ref.pointer,
@@ -75994,7 +83970,7 @@
 
   /// propertyForKey:
   objc.ObjCObjectBase? propertyForKey_(objc.NSString propertyKey) {
-    final _ret = _objc_msgSend_62nh5j(
+    final _ret = _objc_msgSend_1sotr3r(
         this.ref.pointer, _sel_propertyForKey_, propertyKey.ref.pointer);
     return _ret.address == 0
         ? null
@@ -76003,20 +83979,20 @@
 
   /// These attempt to write the given arguments for the resource specified by the URL; they return success or failure
   bool setResourceData_(objc.NSData data) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_setResourceData_, data.ref.pointer);
   }
 
   /// setProperty:forKey:
   bool setProperty_forKey_(
       objc.ObjCObjectBase property, objc.NSString propertyKey) {
-    return _objc_msgSend_1lqxdg3(this.ref.pointer, _sel_setProperty_forKey_,
+    return _objc_msgSend_1lsax7n(this.ref.pointer, _sel_setProperty_forKey_,
         property.ref.pointer, propertyKey.ref.pointer);
   }
 
   /// Sophisticated clients will want to ask for this, then message the handle directly.  If shouldUseCache is NO, a newly instantiated handle is returned, even if an equivalent URL has been loaded
   objc.NSURLHandle? URLHandleUsingCache_(bool shouldUseCache) {
-    final _ret = _objc_msgSend_1l3kbc1(
+    final _ret = _objc_msgSend_1t6aok9(
         this.ref.pointer, _sel_URLHandleUsingCache_, shouldUseCache);
     return _ret.address == 0
         ? null
@@ -76065,6 +84041,35 @@
                 ffi.Pointer<ffi.Void>)>.listener(
         _ObjCBlock_ffiVoid_ffiVoid_listenerTrampoline)
       ..keepIsolateAlive = false;
+void _ObjCBlock_ffiVoid_ffiVoid_blockingTrampoline(
+    ffi.Pointer<objc.ObjCBlockImpl> block,
+    ffi.Pointer<ffi.Void> waiter,
+    ffi.Pointer<ffi.Void> arg0) {
+  try {
+    (objc.getBlockClosure(block) as void Function(ffi.Pointer<ffi.Void>))(arg0);
+  } catch (e) {
+  } finally {
+    objc.signalWaiter(waiter);
+    objc.objectRelease(block.cast());
+  }
+}
+
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>
+    _ObjCBlock_ffiVoid_ffiVoid_blockingCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>.isolateLocal(
+        _ObjCBlock_ffiVoid_ffiVoid_blockingTrampoline)
+      ..keepIsolateAlive = false;
+ffi.NativeCallable<
+        ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+            ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>
+    _ObjCBlock_ffiVoid_ffiVoid_blockingListenerCallable = ffi.NativeCallable<
+            ffi.Void Function(ffi.Pointer<objc.ObjCBlockImpl>,
+                ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>.listener(
+        _ObjCBlock_ffiVoid_ffiVoid_blockingTrampoline)
+      ..keepIsolateAlive = false;
 
 /// Construction methods for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>)>`.
 abstract final class ObjCBlock_ffiVoid_ffiVoid {
@@ -76123,6 +84128,32 @@
     return objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>)>(wrapper,
         retain: false, release: true);
   }
+
+  /// Creates a blocking block from a Dart function.
+  ///
+  /// This callback can be invoked from any native thread, and will block the
+  /// caller until the callback is handled by the Dart isolate that created
+  /// the block. Async functions are not supported.
+  ///
+  /// This block does not keep the owner isolate alive. If the owner isolate has
+  /// shut down, and the block is invoked by native code, it may block
+  /// indefinitely, or have other undefined behavior.
+  static objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>)> blocking(
+      void Function(ffi.Pointer<ffi.Void>) fn) {
+    final raw = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_blockingCallable.nativeFunction.cast(),
+        (ffi.Pointer<ffi.Void> arg0) => fn(arg0));
+    final rawListener = objc.newClosureBlock(
+        _ObjCBlock_ffiVoid_ffiVoid_blockingListenerCallable.nativeFunction
+            .cast(),
+        (ffi.Pointer<ffi.Void> arg0) => fn(arg0));
+    final wrapper = objc.wrapBlockingBlock(
+        _NativeCupertinoHttp_wrapBlockingBlock_ovsamd, raw, rawListener);
+    objc.objectRelease(raw.cast());
+    objc.objectRelease(rawListener.cast());
+    return objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>)>(wrapper,
+        retain: false, release: true);
+  }
 }
 
 /// Call operator for `objc.ObjCBlock<ffi.Void Function(ffi.Pointer<ffi.Void>)>`.
@@ -76157,7 +84188,7 @@
 
   /// Returns whether [obj] is an instance of [NSCondition].
   static bool isInstance(objc.ObjCObjectBase obj) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         obj.ref.pointer, _sel_isKindOfClass_, _class_NSCondition);
   }
 
@@ -76168,7 +84199,7 @@
 
   /// waitUntilDate:
   bool waitUntilDate_(objc.NSDate limit) {
-    return _objc_msgSend_69e0x1(
+    return _objc_msgSend_19nvye5(
         this.ref.pointer, _sel_waitUntilDate_, limit.ref.pointer);
   }
 
@@ -76184,7 +84215,7 @@
 
   /// name
   objc.NSString? get name {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_name);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_name);
     return _ret.address == 0
         ? null
         : objc.NSString.castFromPointer(_ret, retain: true, release: true);
@@ -76192,51 +84223,51 @@
 
   /// setName:
   set name(objc.NSString? value) {
-    return _objc_msgSend_1jdvcbf(
+    _objc_msgSend_xtuoz7(
         this.ref.pointer, _sel_setName_, value?.ref.pointer ?? ffi.nullptr);
   }
 
   /// init
   NSCondition init() {
     final _ret =
-        _objc_msgSend_1x359cv(this.ref.retainAndReturnPointer(), _sel_init);
+        _objc_msgSend_151sglz(this.ref.retainAndReturnPointer(), _sel_init);
     return NSCondition.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// new
   static NSCondition new1() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSCondition, _sel_new);
+    final _ret = _objc_msgSend_151sglz(_class_NSCondition, _sel_new);
     return NSCondition.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// allocWithZone:
   static NSCondition allocWithZone_(ffi.Pointer<_NSZone> zone) {
     final _ret =
-        _objc_msgSend_hzlb60(_class_NSCondition, _sel_allocWithZone_, zone);
+        _objc_msgSend_1cwp428(_class_NSCondition, _sel_allocWithZone_, zone);
     return NSCondition.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// alloc
   static NSCondition alloc() {
-    final _ret = _objc_msgSend_1x359cv(_class_NSCondition, _sel_alloc);
+    final _ret = _objc_msgSend_151sglz(_class_NSCondition, _sel_alloc);
     return NSCondition.castFromPointer(_ret, retain: false, release: true);
   }
 
   /// self
   NSCondition self() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_self);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_self);
     return NSCondition.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// retain
   NSCondition retain() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_retain);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_retain);
     return NSCondition.castFromPointer(_ret, retain: true, release: true);
   }
 
   /// autorelease
   NSCondition autorelease() {
-    final _ret = _objc_msgSend_1x359cv(this.ref.pointer, _sel_autorelease);
+    final _ret = _objc_msgSend_151sglz(this.ref.pointer, _sel_autorelease);
     return NSCondition.castFromPointer(_ret, retain: true, release: true);
   }
 
@@ -76290,13 +84321,712 @@
 extension NSExceptionRaisingConveniences on NSException {
   /// raise:format:
   static void raise_format_(DartNSExceptionName name, objc.NSString format) {
-    _objc_msgSend_wjvic9(_class_NSException, _sel_raise_format_,
+    _objc_msgSend_pfv6jd(_class_NSException, _sel_raise_format_,
         name.ref.pointer, format.ref.pointer);
   }
 }
 
 typedef NSUncaughtExceptionHandler = ffi
     .NativeFunction<ffi.Void Function(ffi.Pointer<objc.ObjCObject> exception)>;
+typedef os_function_tFunction1 = ffi.Void Function(ffi.Pointer<ffi.Void>);
+typedef Dartos_function_tFunction1 = void Function(ffi.Pointer<ffi.Void>);
+typedef os_function_t1
+    = ffi.Pointer<ffi.NativeFunction<os_function_tFunction1>>;
+
+/// !
+/// @typedef os_block_t
+///
+/// @abstract
+/// Generic type for a block taking no arguments and returning no value.
+///
+/// @discussion
+/// When not building with Objective-C ARC, a block object allocated on or
+/// copied to the heap must be released with a -[release] message or the
+/// Block_release() function.
+///
+/// The declaration of a block literal allocates storage on the stack.
+/// Therefore, this is an invalid construct:
+/// <code>
+/// os_block_t block;
+/// if (x) {
+/// block = ^{ printf("true\n"); };
+/// } else {
+/// block = ^{ printf("false\n"); };
+/// }
+/// block(); // unsafe!!!
+/// </code>
+///
+/// What is happening behind the scenes:
+/// <code>
+/// if (x) {
+/// struct Block __tmp_1 = ...; // setup details
+/// block = &__tmp_1;
+/// } else {
+/// struct Block __tmp_2 = ...; // setup details
+/// block = &__tmp_2;
+/// }
+/// </code>
+///
+/// As the example demonstrates, the address of a stack variable is escaping the
+/// scope in which it is allocated. That is a classic C bug.
+///
+/// Instead, the block literal must be copied to the heap with the Block_copy()
+/// function or by sending it a -[copy] message.
+typedef os_block_t1 = ffi.Pointer<objc.ObjCBlockImpl>;
+typedef Dartos_block_t1 = objc.ObjCBlock<ffi.Void Function()>;
+typedef fsignatures_t1 = fsignatures;
+typedef fsupplement_t1 = fsupplement;
+
+/// DYLD needs to check if the object is allowed to be combined
+/// into the main binary. This is done between the code signature
+/// is loaded and dyld is doing all the work to process the LOAD commands.
+///
+/// While this could be done in F_ADDFILESIGS.* family the hook into
+/// the MAC module doesn't say no when LV isn't enabled and then that
+/// is cached on the vnode, and the MAC module never gets change once
+/// a process that library validation enabled.
+typedef fchecklv_t1 = fchecklv;
+
+/// fgetsigsinfo_t used by F_GETSIGSINFO command
+typedef fgetsigsinfo_t1 = fgetsigsinfo;
+
+/// fstore_t type used by F_PREALLOCATE command
+typedef fstore_t1 = fstore;
+
+/// fpunchhole_t used by F_PUNCHHOLE
+typedef fpunchhole_t1 = fpunchhole;
+
+/// factive_file_trim_t used by F_TRIM_ACTIVE_FILE
+typedef ftrimactivefile_t1 = ftrimactivefile;
+
+/// fspecread_t used by F_SPECULATIVE_READ
+typedef fspecread_t1 = fspecread;
+typedef fattributiontag_t1 = fattributiontag;
+typedef filesec_t1 = ffi.Pointer<_filesec>;
+typedef boolean_t1 = ffi.Int;
+typedef Dartboolean_t1 = int;
+
+/// natural_t and integer_t are Mach's legacy types for machine-
+/// independent integer types (unsigned, and signed, respectively).
+/// Their original purpose was to define other types in a machine/
+/// compiler independent way.
+///
+/// They also had an implicit "same size as pointer" characteristic
+/// to them (i.e. Mach's traditional types are very ILP32 or ILP64
+/// centric).  We will likely support x86 ABIs that do not follow
+/// either ofthese models (specifically LP64).  Therefore, we had to
+/// make a choice between making these types scale with pointers or stay
+/// tied to integers.  Because their use is predominantly tied to
+/// to the size of an integer, we are keeping that association and
+/// breaking free from pointer size guarantees.
+///
+/// New use of these types is discouraged.
+typedef natural_t1 = __darwin_natural_t;
+typedef integer_t1 = ffi.Int;
+typedef Dartinteger_t1 = int;
+typedef vm_offset_t1 = ffi.UintPtr;
+typedef Dartvm_offset_t1 = int;
+typedef vm_size_t1 = ffi.UintPtr;
+typedef Dartvm_size_t1 = int;
+typedef mach_vm_address_t1 = ffi.Uint64;
+typedef Dartmach_vm_address_t1 = int;
+typedef mach_vm_offset_t1 = ffi.Uint64;
+typedef Dartmach_vm_offset_t1 = int;
+typedef mach_vm_size_t1 = ffi.Uint64;
+typedef Dartmach_vm_size_t1 = int;
+typedef vm_map_offset_t1 = ffi.Uint64;
+typedef Dartvm_map_offset_t1 = int;
+typedef vm_map_address_t1 = ffi.Uint64;
+typedef Dartvm_map_address_t1 = int;
+typedef vm_map_size_t1 = ffi.Uint64;
+typedef Dartvm_map_size_t1 = int;
+typedef vm32_offset_t1 = ffi.Uint32;
+typedef Dartvm32_offset_t1 = int;
+typedef vm32_address_t1 = ffi.Uint32;
+typedef Dartvm32_address_t1 = int;
+typedef vm32_size_t1 = ffi.Uint32;
+typedef Dartvm32_size_t1 = int;
+typedef mach_port_context_t1 = vm_offset_t1;
+
+/// mach_port_name_t - the local identity for a Mach port
+///
+/// The name is Mach port namespace specific.  It is used to
+/// identify the rights held for that port by the task whose
+/// namespace is implied [or specifically provided].
+///
+/// Use of this type usually implies just a name - no rights.
+/// See mach_port_t for a type that implies a "named right."
+typedef mach_port_name_t1 = natural_t1;
+typedef mach_port_name_array_t1 = ffi.Pointer<mach_port_name_t1>;
+typedef mach_port_t1 = __darwin_mach_port_t;
+typedef mach_port_array_t1 = ffi.Pointer<mach_port_t1>;
+
+/// These are the different rights a task may have for a port.
+/// The MACH_PORT_RIGHT_* definitions are used as arguments
+/// to mach_port_allocate, mach_port_get_refs, etc, to specify
+/// a particular right to act upon.  The mach_port_names and
+/// mach_port_type calls return bitmasks using the MACH_PORT_TYPE_*
+/// definitions.  This is because a single name may denote
+/// multiple rights.
+typedef mach_port_right_t1 = natural_t1;
+typedef mach_port_type_t1 = natural_t1;
+typedef mach_port_type_array_t1 = ffi.Pointer<mach_port_type_t1>;
+
+/// User-references for capabilities.
+typedef mach_port_urefs_t1 = natural_t1;
+typedef mach_port_delta_t1 = integer_t1;
+
+/// Attributes of ports.  (See mach_port_get_receive_status.)
+typedef mach_port_seqno_t1 = natural_t1;
+typedef mach_port_mscount_t1 = natural_t1;
+typedef mach_port_msgcount_t1 = natural_t1;
+typedef mach_port_rights_t1 = natural_t1;
+typedef mach_port_srights_t1 = ffi.UnsignedInt;
+typedef Dartmach_port_srights_t1 = int;
+typedef mach_port_status_t1 = mach_port_status;
+typedef mach_port_limits_t1 = mach_port_limits;
+typedef mach_port_info_ext_t1 = mach_port_info_ext;
+typedef mach_port_guard_info_t1 = mach_port_guard_info;
+typedef mach_port_info_t1 = ffi.Pointer<integer_t1>;
+
+/// Flavors for mach_port_get/set/assert_attributes()
+typedef mach_port_flavor_t1 = ffi.Int;
+typedef Dartmach_port_flavor_t1 = int;
+
+/// Structure used to pass information about port allocation requests.
+/// Must be padded to 64-bits total length.
+typedef mach_port_qos_t1 = mach_port_qos;
+typedef mach_service_port_info_data_t1 = mach_service_port_info;
+typedef mach_service_port_info_t1 = ffi.Pointer<mach_service_port_info>;
+
+/// Structure to define optional attributes for a newly
+/// constructed port.
+typedef mach_port_options_t1 = mach_port_options;
+typedef mach_port_options_ptr_t1 = ffi.Pointer<mach_port_options_t1>;
+
+/// !
+/// @typedef os_workgroup_t
+///
+/// @abstract
+/// A reference counted os object representing a workload that needs to
+/// be distinctly recognized and tracked by the system.  The workgroup
+/// tracks a collection of threads all working cooperatively. An os_workgroup
+/// object - when not an instance of a specific os_workgroup_t subclass -
+/// represents a generic workload and makes no assumptions about the kind of
+/// work done.
+///
+/// @discussion
+/// Threads can explicitly join an os_workgroup_t to mark themselves as
+/// participants in the workload.
+typedef os_workgroup_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartos_workgroup_t1 = OS_os_workgroup;
+
+/// !
+/// @typedef os_workgroup_attr_t
+///
+/// @abstract
+/// Pointer to an opaque structure for describing attributes that can be
+/// configured on a workgroup at creation.
+typedef os_workgroup_attr_s1 = os_workgroup_attr_opaque_s;
+typedef os_workgroup_attr_t1 = ffi.Pointer<os_workgroup_attr_opaque_s>;
+
+/// !
+/// @typedef os_workgroup_join_token, os_workgroup_join_token_t
+///
+/// @abstract
+/// An opaque join token which the client needs to pass to os_workgroup_join
+/// and os_workgroup_leave
+typedef os_workgroup_join_token_s1 = os_workgroup_join_token_opaque_s;
+typedef os_workgroup_join_token_t1
+    = ffi.Pointer<os_workgroup_join_token_opaque_s>;
+
+/// Working Arena index of a thread in a workgroup
+typedef os_workgroup_index1 = ffi.Uint32;
+typedef Dartos_workgroup_index1 = int;
+typedef os_workgroup_working_arena_destructor_tFunction1 = ffi.Void Function(
+    ffi.Pointer<ffi.Void>);
+typedef Dartos_workgroup_working_arena_destructor_tFunction1 = void Function(
+    ffi.Pointer<ffi.Void>);
+
+/// Destructor for Working Arena
+typedef os_workgroup_working_arena_destructor_t1 = ffi.Pointer<
+    ffi.NativeFunction<os_workgroup_working_arena_destructor_tFunction1>>;
+
+/// !
+/// @typedef os_workgroup_max_parallel_threads_attr_t
+///
+/// @abstract
+/// A pointer to a structure describing the set of properties of a workgroup to
+/// override with the explicitly specified values in the structure.
+///
+/// See also os_workgroup_max_parallel_threads.
+typedef os_workgroup_mpt_attr_s1 = os_workgroup_max_parallel_threads_attr_s;
+typedef os_workgroup_mpt_attr_t1
+    = ffi.Pointer<os_workgroup_max_parallel_threads_attr_s>;
+typedef os_workgroup_interval_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartos_workgroup_interval_t1 = OS_os_workgroup;
+
+/// @typedef os_workgroup_interval_data, os_workgroup_interval_data_t
+///
+/// @abstract
+/// An opaque structure containing additional configuration for the workgroup
+/// interval.
+typedef os_workgroup_interval_data_s1 = os_workgroup_interval_data_opaque_s;
+typedef os_workgroup_interval_data_t1
+    = ffi.Pointer<os_workgroup_interval_data_opaque_s>;
+typedef os_workgroup_parallel_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartos_workgroup_parallel_t1 = OS_os_workgroup;
+typedef dispatch_function_tFunction1 = ffi.Void Function(ffi.Pointer<ffi.Void>);
+typedef Dartdispatch_function_tFunction1 = void Function(ffi.Pointer<ffi.Void>);
+typedef dispatch_function_t1
+    = ffi.Pointer<ffi.NativeFunction<dispatch_function_tFunction1>>;
+typedef time_value_t1 = time_value;
+
+/// Type definitions.
+typedef alarm_type_t1 = ffi.Int;
+typedef Dartalarm_type_t1 = int;
+typedef sleep_type_t1 = ffi.Int;
+typedef Dartsleep_type_t1 = int;
+typedef clock_id_t1 = ffi.Int;
+typedef Dartclock_id_t1 = int;
+typedef clock_flavor_t1 = ffi.Int;
+typedef Dartclock_flavor_t1 = int;
+typedef clock_attr_t1 = ffi.Pointer<ffi.Int>;
+typedef clock_res_t1 = ffi.Int;
+typedef Dartclock_res_t1 = int;
+typedef mach_timespec_t1 = mach_timespec;
+
+/// !
+/// @typedef dispatch_time_t
+///
+/// @abstract
+/// A somewhat abstract representation of time; where zero means "now" and
+/// DISPATCH_TIME_FOREVER means "infinity" and every value in between is an
+/// opaque encoding.
+typedef dispatch_time_t1 = ffi.Uint64;
+typedef Dartdispatch_time_t1 = int;
+
+/// By default, dispatch objects are declared as Objective-C types when building
+/// with an Objective-C compiler. This allows them to participate in ARC, in RR
+/// management by the Blocks runtime and in leaks checking by the static
+/// analyzer, and enables them to be added to Cocoa collections.
+/// See <os/object.h> for details.
+typedef dispatch_object_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_object_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_block_t
+///
+/// @abstract
+/// The type of blocks submitted to dispatch queues, which take no arguments
+/// and have no return value.
+///
+/// @discussion
+/// When not building with Objective-C ARC, a block object allocated on or
+/// copied to the heap must be released with a -[release] message or the
+/// Block_release() function.
+///
+/// The declaration of a block literal allocates storage on the stack.
+/// Therefore, this is an invalid construct:
+/// <code>
+/// dispatch_block_t block;
+/// if (x) {
+/// block = ^{ printf("true\n"); };
+/// } else {
+/// block = ^{ printf("false\n"); };
+/// }
+/// block(); // unsafe!!!
+/// </code>
+///
+/// What is happening behind the scenes:
+/// <code>
+/// if (x) {
+/// struct Block __tmp_1 = ...; // setup details
+/// block = &__tmp_1;
+/// } else {
+/// struct Block __tmp_2 = ...; // setup details
+/// block = &__tmp_2;
+/// }
+/// </code>
+///
+/// As the example demonstrates, the address of a stack variable is escaping the
+/// scope in which it is allocated. That is a classic C bug.
+///
+/// Instead, the block literal must be copied to the heap with the Block_copy()
+/// function or by sending it a -[copy] message.
+typedef dispatch_block_t1 = ffi.Pointer<objc.ObjCBlockImpl>;
+typedef Dartdispatch_block_t1 = objc.ObjCBlock<ffi.Void Function()>;
+
+/// !
+/// @typedef dispatch_queue_global_t
+///
+/// @abstract
+/// Dispatch global concurrent queues are an abstraction around the system thread
+/// pool which invokes workitems that are submitted to dispatch queues.
+///
+/// @discussion
+/// Dispatch global concurrent queues provide buckets of priorities on top of the
+/// thread pool the system manages. The system will decide how many threads
+/// to allocate to this pool depending on demand and system load. In particular,
+/// the system tries to maintain a good level of concurrency for this resource,
+/// and will create new threads when too many existing worker threads block in
+/// system calls.
+///
+/// The global concurrent queues are a shared resource and as such it is the
+/// responsiblity of every user of this resource to not submit an unbounded
+/// amount of work to this pool, especially work that may block, as this can
+/// cause the system to spawn very large numbers of threads (aka. thread
+/// explosion).
+///
+/// Work items submitted to the global concurrent queues have no ordering
+/// guarantee with respect to the order of submission, and workitems submitted
+/// to these queues may be invoked concurrently.
+///
+/// Dispatch global concurrent queues are well-known global objects that are
+/// returned by dispatch_get_global_queue(). These objects cannot be modified.
+/// Calls to dispatch_suspend(), dispatch_resume(), dispatch_set_context(), etc.,
+/// will have no effect when used with queues of this type.
+typedef dispatch_queue_global_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_queue_global_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_queue_serial_executor_t
+///
+/// @abstract
+/// An abstract class of dispatch queues which conform to the serial executor
+/// protocol.
+///
+/// @discussion
+/// A serial executor in Swift Concurrency represents a mutual exclusion context.
+/// Queues with a singular owner, which invoke only one workItem at a time
+/// provide such a mutual exclusion context and are serial executors.
+///
+/// Subclasses of this abstract class can be therefore be setup as Custom
+/// Executors for Swift Actors.
+///
+/// See dispatch_queue_serial_t and dispatch_workloop_t.
+typedef dispatch_queue_serial_executor_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_queue_serial_executor_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_queue_serial_t
+///
+/// @abstract
+/// Dispatch serial queues invoke workitems submitted to them serially in FIFO
+/// order.
+///
+/// @discussion
+/// Dispatch serial queues are lightweight objects to which workitems may be
+/// submitted to be invoked in FIFO order. A serial queue will only invoke one
+/// workitem at a time, but independent serial queues may each invoke their work
+/// items concurrently with respect to each other.
+///
+/// Serial queues can target each other (See dispatch_set_target_queue()). The
+/// serial queue at the bottom of a queue hierarchy provides an exclusion
+/// context: at most one workitem submitted to any of the queues in such
+/// a hiearchy will run at any given time.
+///
+/// Such hierarchies provide a natural construct to organize an application
+/// subsystem around.
+///
+/// Serial queues are created by passing a dispatch queue attribute derived from
+/// DISPATCH_QUEUE_SERIAL to dispatch_queue_create_with_target().
+typedef dispatch_queue_serial_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_queue_serial_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_queue_main_t
+///
+/// @abstract
+/// The type of the default queue that is bound to the main thread.
+///
+/// @discussion
+/// The main queue is a serial queue (See dispatch_queue_serial_t) which is bound
+/// to the main thread of an application.
+///
+/// In order to invoke workitems submitted to the main queue, the application
+/// must call dispatch_main(), NSApplicationMain(), or use a CFRunLoop on the
+/// main thread.
+///
+/// The main queue is a well known global object that is made automatically on
+/// behalf of the main thread during process initialization and is returned by
+/// dispatch_get_main_queue(). This object cannot be modified.  Calls to
+/// dispatch_suspend(), dispatch_resume(), dispatch_set_context(), etc., will
+/// have no effect when used on the main queue.
+typedef dispatch_queue_main_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_queue_main_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_queue_concurrent_t
+///
+/// @abstract
+/// Dispatch concurrent queues invoke workitems submitted to them concurrently,
+/// and admit a notion of barrier workitems.
+///
+/// @discussion
+/// Dispatch concurrent queues are lightweight objects to which regular and
+/// barrier workitems may be submited. Barrier workitems are invoked in
+/// exclusion of any other kind of workitem in FIFO order.
+///
+/// Regular workitems can be invoked concurrently for the same concurrent queue,
+/// in any order. However, regular workitems will not be invoked before any
+/// barrier workitem submited ahead of them has been invoked.
+///
+/// In other words, if a serial queue is equivalent to a mutex in the Dispatch
+/// world, a concurrent queue is equivalent to a reader-writer lock, where
+/// regular items are readers and barriers are writers.
+///
+/// Concurrent queues are created by passing a dispatch queue attribute derived
+/// from DISPATCH_QUEUE_CONCURRENT to dispatch_queue_create_with_target().
+///
+/// Caveat:
+/// Dispatch concurrent queues at this time do not implement priority inversion
+/// avoidance when lower priority regular workitems (readers) are being invoked
+/// and are preventing a higher priority barrier (writer) from being invoked.
+typedef dispatch_queue_concurrent_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_queue_concurrent_t1 = objc.NSObject;
+typedef dispatch_queue_priority_t1 = ffi.Long;
+typedef Dartdispatch_queue_priority_t1 = int;
+
+/// !
+/// @typedef dispatch_queue_attr_t
+///
+/// @abstract
+/// Attribute for dispatch queues.
+typedef dispatch_queue_attr_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_queue_attr_t1 = objc.NSObject;
+typedef kern_return_t1 = ffi.Int;
+typedef Dartkern_return_t1 = int;
+
+/// The timeout mechanism uses mach_msg_timeout_t values,
+/// passed by value.  The timeout units are milliseconds.
+/// It is controlled with the MACH_SEND_TIMEOUT
+/// and MACH_RCV_TIMEOUT options.
+typedef mach_msg_timeout_t1 = natural_t1;
+
+/// Every message starts with a message header.
+/// Following the message header, if the message is complex, are a count
+/// of type descriptors and the type descriptors themselves
+/// (mach_msg_descriptor_t). The size of the message must be specified in
+/// bytes, and includes the message header, descriptor count, descriptors,
+/// and inline data.
+///
+/// The msgh_remote_port field specifies the destination of the message.
+/// It must specify a valid send or send-once right for a port.
+///
+/// The msgh_local_port field specifies a "reply port".  Normally,
+/// This field carries a send-once right that the receiver will use
+/// to reply to the message.  It may carry the values MACH_PORT_NULL,
+/// MACH_PORT_DEAD, a send-once right, or a send right.
+///
+/// The msgh_voucher_port field specifies a Mach voucher port. Only
+/// send rights to kernel-implemented Mach Voucher kernel objects in
+/// addition to MACH_PORT_NULL or MACH_PORT_DEAD may be passed.
+///
+/// The msgh_id field is uninterpreted by the message primitives.
+/// It normally carries information specifying the format
+/// or meaning of the message.
+typedef mach_msg_bits_t1 = ffi.UnsignedInt;
+typedef Dartmach_msg_bits_t1 = int;
+typedef mach_msg_size_t1 = natural_t1;
+typedef mach_msg_id_t1 = integer_t1;
+typedef mach_msg_priority_t1 = ffi.UnsignedInt;
+typedef Dartmach_msg_priority_t1 = int;
+typedef mach_msg_type_name_t1 = ffi.UnsignedInt;
+typedef Dartmach_msg_type_name_t1 = int;
+typedef mach_msg_copy_options_t1 = ffi.UnsignedInt;
+typedef Dartmach_msg_copy_options_t1 = int;
+typedef mach_msg_guard_flags_t1 = ffi.UnsignedInt;
+typedef Dartmach_msg_guard_flags_t1 = int;
+
+/// In a complex mach message, the mach_msg_header_t is followed by
+/// a descriptor count, then an array of that number of descriptors
+/// (mach_msg_*_descriptor_t). The type field of mach_msg_type_descriptor_t
+/// (which any descriptor can be cast to) indicates the flavor of the
+/// descriptor.
+///
+/// Note that in LP64, the various types of descriptors are no longer all
+/// the same size as mach_msg_descriptor_t, so the array cannot be indexed
+/// as expected.
+typedef mach_msg_descriptor_type_t1 = ffi.UnsignedInt;
+typedef Dartmach_msg_descriptor_type_t1 = int;
+typedef mach_msg_trailer_type_t1 = ffi.UnsignedInt;
+typedef Dartmach_msg_trailer_type_t1 = int;
+typedef mach_msg_trailer_size_t1 = ffi.UnsignedInt;
+typedef Dartmach_msg_trailer_size_t1 = int;
+typedef mach_msg_trailer_info_t1 = ffi.Pointer<ffi.Char>;
+typedef mach_msg_filter_id1 = ffi.Int;
+typedef Dartmach_msg_filter_id1 = int;
+
+/// These values can change from release to release - but clearly
+/// code cannot request additional trailer elements one was not
+/// compiled to understand.  Therefore, it is safe to use this
+/// constant when the same module specified the receive options.
+/// Otherwise, you run the risk that the options requested by
+/// another module may exceed the local modules notion of
+/// MAX_TRAILER_SIZE.
+typedef mach_msg_max_trailer_t1 = mach_msg_mac_trailer_t;
+
+/// Legacy requirements keep us from ever updating these defines (even
+/// when the format_0 trailers gain new option data fields in the future).
+/// Therefore, they shouldn't be used going forward.  Instead, the sizes
+/// should be compared against the specific element size requested using
+/// REQUESTED_TRAILER_SIZE.
+typedef mach_msg_format_0_trailer_t1 = mach_msg_security_trailer_t;
+typedef mach_msg_options_t1 = integer_t1;
+typedef mach_msg_type_size_t1 = natural_t1;
+typedef mach_msg_type_number_t1 = natural_t1;
+typedef mach_msg_option_t1 = integer_t1;
+
+/// Much code assumes that mach_msg_return_t == kern_return_t.
+/// This definition is useful for descriptive purposes.
+///
+/// See <mach/error.h> for the format of error codes.
+/// IPC errors are system 4.  Send errors are subsystem 0;
+/// receive errors are subsystem 1.  The code field is always non-zero.
+/// The high bits of the code field communicate extra information
+/// for some error codes.  MACH_MSG_MASK masks off these special bits.
+typedef mach_msg_return_t1 = kern_return_t1;
+
+/// !
+/// @typedef dispatch_source_t
+///
+/// @abstract
+/// Dispatch sources are used to automatically submit event handler blocks to
+/// dispatch queues in response to external events.
+typedef dispatch_source_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_source_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_source_type_t
+///
+/// @abstract
+/// Constants of this type represent the class of low-level system object that
+/// is being monitored by the dispatch source. Constants of this type are
+/// passed as a parameter to dispatch_source_create() and determine how the
+/// handle argument is interpreted (i.e. as a file descriptor, mach port,
+/// signal number, process identifier, etc.), and how the mask argument is
+/// interpreted.
+typedef dispatch_source_type_t1 = ffi.Pointer<dispatch_source_type_s>;
+typedef dispatch_source_mach_send_flags_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_source_mach_send_flags_t1 = int;
+
+/// !
+/// @typedef dispatch_source_mach_recv_flags_t
+/// Type of dispatch_source_mach_recv flags
+typedef dispatch_source_mach_recv_flags_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_source_mach_recv_flags_t1 = int;
+typedef dispatch_source_memorypressure_flags_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_source_memorypressure_flags_t1 = int;
+typedef dispatch_source_proc_flags_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_source_proc_flags_t1 = int;
+typedef dispatch_source_vnode_flags_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_source_vnode_flags_t1 = int;
+typedef dispatch_source_timer_flags_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_source_timer_flags_t1 = int;
+
+/// !
+/// @typedef dispatch_group_t
+/// @abstract
+/// A group of blocks submitted to queues for asynchronous invocation.
+typedef dispatch_group_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_group_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_semaphore_t
+///
+/// @abstract
+/// A counting semaphore.
+typedef dispatch_semaphore_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_semaphore_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_once_t
+///
+/// @abstract
+/// A predicate for use with dispatch_once(). It must be initialized to zero.
+/// Note: static and global variables default to zero.
+typedef dispatch_once_t1 = ffi.IntPtr;
+typedef Dartdispatch_once_t1 = int;
+
+/// !
+/// @typedef dispatch_data_t
+/// A dispatch object representing memory regions.
+typedef dispatch_data_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_data_t1 = objc.NSObject;
+
+/// !
+/// @typedef dispatch_data_applier_t
+/// A block to be invoked for every contiguous memory region in a data object.
+///
+/// @param region	A data object representing the current region.
+/// @param offset	The logical offset of the current region to the start
+/// of the data object.
+/// @param buffer	The location of the memory for the current region.
+/// @param size		The size of the memory for the current region.
+/// @result		A Boolean indicating whether traversal should continue.
+typedef dispatch_data_applier_t1 = ffi.Pointer<objc.ObjCBlockImpl>;
+typedef Dartdispatch_data_applier_t1 = objc.ObjCBlock<
+    ffi.Bool Function(
+        objc.NSObject, ffi.Size, ffi.Pointer<ffi.Void>, ffi.Size)>;
+typedef dispatch_fd_t1 = ffi.Int;
+typedef Dartdispatch_fd_t1 = int;
+
+/// !
+/// @typedef dispatch_io_t
+/// A dispatch I/O channel represents the asynchronous I/O policy applied to a
+/// file descriptor. I/O channels are first class dispatch objects and may be
+/// retained and released, suspended and resumed, etc.
+typedef dispatch_io_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_io_t1 = objc.NSObject;
+typedef dispatch_io_type_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_io_type_t1 = int;
+
+/// !
+/// @typedef dispatch_io_handler_t
+/// The prototype of I/O handler blocks for dispatch I/O operations.
+///
+/// @param done		A flag indicating whether the operation is complete.
+/// @param data		The data object to be handled.
+/// @param error		An errno condition for the operation.
+typedef dispatch_io_handler_t1 = ffi.Pointer<objc.ObjCBlockImpl>;
+typedef Dartdispatch_io_handler_t1
+    = objc.ObjCBlock<ffi.Void Function(ffi.Bool, objc.NSObject?, ffi.Int)>;
+typedef dispatch_io_close_flags_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_io_close_flags_t1 = int;
+typedef dispatch_io_interval_flags_t1 = ffi.UnsignedLong;
+typedef Dartdispatch_io_interval_flags_t1 = int;
+
+/// !
+/// @typedef dispatch_workloop_t
+///
+/// @abstract
+/// Dispatch workloops invoke workitems submitted to them in priority order.
+///
+/// @discussion
+/// A dispatch workloop is a flavor of dispatch_queue_t that is a priority
+/// ordered queue (using the QOS class of the submitted workitems as the
+/// ordering). Dispatch workloops are an exclusion context and it is guaranteed
+/// that only one work item submitted to the dispatch workloop will be invoked at
+/// a time.
+///
+/// Between each workitem invocation, the workloop will evaluate whether higher
+/// priority workitems have since been submitted, either directly to the
+/// workloop or to any queues that target the workloop, and execute these first.
+///
+/// Serial queues targeting a workloop maintain FIFO execution of their
+/// workitems. However, the workloop may reorder workitems submitted to
+/// independent serial queues targeting it with respect to each other,
+/// based on their priorities, while preserving FIFO execution with respect to
+/// each serial queue.
+///
+/// A dispatch workloop is a "subclass" of dispatch_queue_t which can be passed
+/// to all APIs accepting a dispatch queue, except for functions from the
+/// dispatch_sync() family. dispatch_async_and_wait() must be used for workloop
+/// objects. Functions from the dispatch_sync() family on queues targeting
+/// a workloop are still permitted but discouraged for performance reasons.
+typedef dispatch_workloop_t1 = ffi.Pointer<objc.ObjCObject>;
+typedef Dartdispatch_workloop_t1 = objc.NSObject;
 
 enum NSOperationQueuePriority {
   NSOperationQueuePriorityVeryLow(-8),
@@ -76326,7 +85056,7 @@
 late final _sel_attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_ =
     objc.registerName(
         "attemptRecoveryFromError:optionIndex:delegate:didRecoverSelector:contextInfo:");
-final _objc_msgSend_3kga1r = objc.msgSendPointer
+final _objc_msgSend_10txwc9 = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Void Function(
@@ -76348,7 +85078,7 @@
             ffi.Pointer<ffi.Void>)>();
 late final _sel_attemptRecoveryFromError_optionIndex_ =
     objc.registerName("attemptRecoveryFromError:optionIndex:");
-final _objc_msgSend_1yvrem6 = objc.msgSendPointer
+final _objc_msgSend_z7gxsm = objc.msgSendPointer
     .cast<
         ffi.NativeFunction<
             ffi.Bool Function(
@@ -76377,7 +85107,7 @@
           objc.ObjCObjectBase? delegate,
           ffi.Pointer<objc.ObjCSelector> didRecoverSelector,
           ffi.Pointer<ffi.Void> contextInfo) {
-    _objc_msgSend_3kga1r(
+    _objc_msgSend_10txwc9(
         this.ref.pointer,
         _sel_attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_,
         error.ref.pointer,
@@ -76390,7 +85120,7 @@
   /// Given that an error alert has been presented applicaton-modally to the user, and the user has chosen one of the error's recovery options, attempt recovery from the error, and return YES if error recovery was completely successful, NO otherwise. The recovery option index is an index into the error's array of localized recovery options.
   bool attemptRecoveryFromError_optionIndex_(
       objc.NSError error, DartNSUInteger recoveryOptionIndex) {
-    return _objc_msgSend_1yvrem6(
+    return _objc_msgSend_z7gxsm(
         this.ref.pointer,
         _sel_attemptRecoveryFromError_optionIndex_,
         error.ref.pointer,
@@ -76398,239 +85128,6 @@
   }
 }
 
-typedef NSURLResourceKey1 = ffi.Pointer<objc.ObjCObject>;
-typedef DartNSURLResourceKey1 = objc.NSString;
-typedef NSURLFileResourceType1 = ffi.Pointer<objc.ObjCObject>;
-typedef DartNSURLFileResourceType1 = objc.NSString;
-typedef NSURLThumbnailDictionaryItem1 = ffi.Pointer<objc.ObjCObject>;
-typedef DartNSURLThumbnailDictionaryItem1 = objc.NSString;
-typedef NSURLFileProtectionType1 = ffi.Pointer<objc.ObjCObject>;
-typedef DartNSURLFileProtectionType1 = objc.NSString;
-typedef NSURLUbiquitousItemDownloadingStatus1 = ffi.Pointer<objc.ObjCObject>;
-typedef DartNSURLUbiquitousItemDownloadingStatus1 = objc.NSString;
-typedef NSURLUbiquitousSharedItemRole1 = ffi.Pointer<objc.ObjCObject>;
-typedef DartNSURLUbiquitousSharedItemRole1 = objc.NSString;
-typedef NSURLUbiquitousSharedItemPermissions1 = ffi.Pointer<objc.ObjCObject>;
-typedef DartNSURLUbiquitousSharedItemPermissions1 = objc.NSString;
-typedef NSURLBookmarkFileCreationOptions1 = NSUInteger;
-typedef _DidFinish = ffi.Pointer<objc.ObjCBlockImpl>;
-typedef Dart_DidFinish = objc.ObjCBlock<
-    ffi.Void Function(ffi.Pointer<ffi.Void>, NSURLSession,
-        NSURLSessionDownloadTask, objc.NSURL)>;
-void
-    _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_fnPtrTrampoline(
-            ffi.Pointer<objc.ObjCBlockImpl> block,
-            ffi.Pointer<objc.ObjCObject> arg0,
-            ffi.Pointer<objc.ObjCObject> arg1,
-            ffi.Pointer<objc.ObjCObject> arg2,
-            ffi.Pointer<objc.ObjCObject> arg3) =>
-        block.ref.target
-            .cast<
-                ffi.NativeFunction<
-                    ffi.Void Function(
-                        ffi.Pointer<objc.ObjCObject> arg0,
-                        ffi.Pointer<objc.ObjCObject> arg1,
-                        ffi.Pointer<objc.ObjCObject> arg2,
-                        ffi.Pointer<objc.ObjCObject> arg3)>>()
-            .asFunction<
-                void Function(
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>)>()(arg0, arg1, arg2, arg3);
-ffi.Pointer<ffi.Void>
-    _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_fnPtrCallable =
-    ffi.Pointer.fromFunction<
-                ffi.Void Function(
-                    ffi.Pointer<objc.ObjCBlockImpl>,
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>)>(
-            _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_fnPtrTrampoline)
-        .cast();
-void
-    _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_closureTrampoline(
-            ffi.Pointer<objc.ObjCBlockImpl> block,
-            ffi.Pointer<objc.ObjCObject> arg0,
-            ffi.Pointer<objc.ObjCObject> arg1,
-            ffi.Pointer<objc.ObjCObject> arg2,
-            ffi.Pointer<objc.ObjCObject> arg3) =>
-        (objc.getBlockClosure(block) as void Function(
-            ffi.Pointer<objc.ObjCObject>,
-            ffi.Pointer<objc.ObjCObject>,
-            ffi.Pointer<objc.ObjCObject>,
-            ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
-ffi.Pointer<ffi.Void>
-    _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_closureCallable =
-    ffi.Pointer.fromFunction<
-                ffi.Void Function(
-                    ffi.Pointer<objc.ObjCBlockImpl>,
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>,
-                    ffi.Pointer<objc.ObjCObject>)>(
-            _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_closureTrampoline)
-        .cast();
-void
-    _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_listenerTrampoline(
-        ffi.Pointer<objc.ObjCBlockImpl> block,
-        ffi.Pointer<objc.ObjCObject> arg0,
-        ffi.Pointer<objc.ObjCObject> arg1,
-        ffi.Pointer<objc.ObjCObject> arg2,
-        ffi.Pointer<objc.ObjCObject> arg3) {
-  (objc.getBlockClosure(block) as void Function(
-      ffi.Pointer<objc.ObjCObject>,
-      ffi.Pointer<objc.ObjCObject>,
-      ffi.Pointer<objc.ObjCObject>,
-      ffi.Pointer<objc.ObjCObject>))(arg0, arg1, arg2, arg3);
-  objc.objectRelease(block.cast());
-}
-
-ffi.NativeCallable<
-        ffi.Void Function(
-            ffi.Pointer<objc.ObjCBlockImpl>,
-            ffi.Pointer<objc.ObjCObject>,
-            ffi.Pointer<objc.ObjCObject>,
-            ffi.Pointer<objc.ObjCObject>,
-            ffi.Pointer<objc.ObjCObject>)>
-    _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_listenerCallable =
-    ffi.NativeCallable<
-            ffi.Void Function(
-                ffi.Pointer<objc.ObjCBlockImpl>,
-                ffi.Pointer<objc.ObjCObject>,
-                ffi.Pointer<objc.ObjCObject>,
-                ffi.Pointer<objc.ObjCObject>,
-                ffi.Pointer<objc.ObjCObject>)>.listener(
-        _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_listenerTrampoline)
-      ..keepIsolateAlive = false;
-
-/// Construction methods for `objc.ObjCBlock<ffi.Void Function(NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)>`.
-abstract final class ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL {
-  /// Returns a block that wraps the given raw block pointer.
-  static objc.ObjCBlock<
-          ffi.Void Function(
-              NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)>
-      castFromPointer(ffi.Pointer<objc.ObjCBlockImpl> pointer,
-              {bool retain = false, bool release = false}) =>
-          objc.ObjCBlock<
-              ffi.Void Function(
-                  NSCondition,
-                  NSURLSession,
-                  NSURLSessionDownloadTask,
-                  objc.NSURL)>(pointer, retain: retain, release: release);
-
-  /// Creates a block from a C function pointer.
-  ///
-  /// This block must be invoked by native code running on the same thread as
-  /// the isolate that registered it. Invoking the block on the wrong thread
-  /// will result in a crash.
-  static objc.ObjCBlock<ffi.Void Function(NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)>
-      fromFunctionPointer(ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<objc.ObjCObject> arg0, ffi.Pointer<objc.ObjCObject> arg1, ffi.Pointer<objc.ObjCObject> arg2, ffi.Pointer<objc.ObjCObject> arg3)>> ptr) =>
-          objc.ObjCBlock<
-                  ffi.Void Function(NSCondition, NSURLSession,
-                      NSURLSessionDownloadTask, objc.NSURL)>(
-              objc.newPointerBlock(
-                  _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_fnPtrCallable,
-                  ptr.cast()),
-              retain: false,
-              release: true);
-
-  /// Creates a block from a Dart function.
-  ///
-  /// This block must be invoked by native code running on the same thread as
-  /// the isolate that registered it. Invoking the block on the wrong thread
-  /// will result in a crash.
-  static objc.ObjCBlock<ffi.Void Function(NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)> fromFunction(void Function(NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL) fn) =>
-      objc.ObjCBlock<ffi.Void Function(NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)>(
-          objc.newClosureBlock(
-              _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_closureCallable,
-              (ffi.Pointer<objc.ObjCObject> arg0,
-                      ffi.Pointer<objc.ObjCObject> arg1,
-                      ffi.Pointer<objc.ObjCObject> arg2,
-                      ffi.Pointer<objc.ObjCObject> arg3) =>
-                  fn(
-                      NSCondition.castFromPointer(arg0, retain: true, release: true),
-                      NSURLSession.castFromPointer(arg1, retain: true, release: true),
-                      NSURLSessionDownloadTask.castFromPointer(arg2, retain: true, release: true),
-                      objc.NSURL.castFromPointer(arg3, retain: true, release: true))),
-          retain: false,
-          release: true);
-
-  /// Creates a listener block from a Dart function.
-  ///
-  /// This is based on FFI's NativeCallable.listener, and has the same
-  /// capabilities and limitations. This block can be invoked from any thread,
-  /// but only supports void functions, and is not run synchronously. See
-  /// NativeCallable.listener for more details.
-  ///
-  /// Note that unlike the default behavior of NativeCallable.listener, listener
-  /// blocks do not keep the isolate alive.
-  static objc.ObjCBlock<
-      ffi.Void Function(NSCondition, NSURLSession, NSURLSessionDownloadTask,
-          objc.NSURL)> listener(
-      void Function(
-              NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)
-          fn) {
-    final raw = objc.newClosureBlock(
-        _ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_listenerCallable
-            .nativeFunction
-            .cast(),
-        (ffi.Pointer<objc.ObjCObject> arg0,
-                ffi.Pointer<objc.ObjCObject> arg1,
-                ffi.Pointer<objc.ObjCObject> arg2,
-                ffi.Pointer<objc.ObjCObject> arg3) =>
-            fn(
-                NSCondition.castFromPointer(arg0, retain: false, release: true),
-                NSURLSession.castFromPointer(arg1,
-                    retain: false, release: true),
-                NSURLSessionDownloadTask.castFromPointer(arg2,
-                    retain: false, release: true),
-                objc.NSURL
-                    .castFromPointer(arg3, retain: false, release: true)));
-    final wrapper = _NativeCupertinoHttp_wrapListenerBlock_4ya7yd(raw);
-    objc.objectRelease(raw.cast());
-    return objc.ObjCBlock<
-        ffi.Void Function(NSCondition, NSURLSession, NSURLSessionDownloadTask,
-            objc.NSURL)>(wrapper, retain: false, release: true);
-  }
-}
-
-/// Call operator for `objc.ObjCBlock<ffi.Void Function(NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)>`.
-extension ObjCBlock_ffiVoid_NSCondition_NSURLSession_NSURLSessionDownloadTask_NSURL_CallExtension
-    on objc.ObjCBlock<
-        ffi.Void Function(
-            NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)> {
-  void call(NSCondition arg0, NSURLSession arg1, NSURLSessionDownloadTask arg2,
-          objc.NSURL arg3) =>
-      ref.pointer.ref.invoke
-              .cast<
-                  ffi.NativeFunction<
-                      ffi.Void Function(
-                          ffi.Pointer<objc.ObjCBlockImpl> block,
-                          ffi.Pointer<objc.ObjCObject> arg0,
-                          ffi.Pointer<objc.ObjCObject> arg1,
-                          ffi.Pointer<objc.ObjCObject> arg2,
-                          ffi.Pointer<objc.ObjCObject> arg3)>>()
-              .asFunction<
-                  void Function(
-                      ffi.Pointer<objc.ObjCBlockImpl>,
-                      ffi.Pointer<objc.ObjCObject>,
-                      ffi.Pointer<objc.ObjCObject>,
-                      ffi.Pointer<objc.ObjCObject>,
-                      ffi.Pointer<objc.ObjCObject>)>()(
-          ref.pointer,
-          arg0.ref.pointer,
-          arg1.ref.pointer,
-          arg2.ref.pointer,
-          arg3.ref.pointer);
-}
-
-typedef _DidFinishWithLock = ffi.Pointer<objc.ObjCBlockImpl>;
-typedef Dart_DidFinishWithLock = objc.ObjCBlock<
-    ffi.Void Function(
-        NSCondition, NSURLSession, NSURLSessionDownloadTask, objc.NSURL)>;
-
 const int noErr = 0;
 
 const int kNilOptions = 0;
@@ -81159,6 +89656,8 @@
 
 const int TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 = -13141;
 
+const int TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = -13140;
+
 const int TLS_NULL_WITH_NULL_NULL = 0;
 
 const int TLS_RSA_WITH_NULL_MD5 = 1;
@@ -81745,4710 +90244,6 @@
 
 const int NSCollectorDisabledOption10 = 2;
 
-const int noErr11 = 0;
-
-const int kNilOptions11 = 0;
-
-const int kVariableLengthArray11 = 1;
-
-const int kUnknownType11 = 1061109567;
-
-const int normal11 = 0;
-
-const int bold11 = 1;
-
-const int italic11 = 2;
-
-const int underline11 = 4;
-
-const int outline11 = 8;
-
-const int shadow11 = 16;
-
-const int condense11 = 32;
-
-const int extend11 = 64;
-
-const int developStage11 = 32;
-
-const int alphaStage11 = 64;
-
-const int betaStage11 = 96;
-
-const int finalStage11 = 128;
-
-const int NSScannedOption11 = 1;
-
-const int NSCollectorDisabledOption11 = 2;
-
-const int NSASCIIStringEncoding2 = 1;
-
-const int NSNEXTSTEPStringEncoding2 = 2;
-
-const int NSJapaneseEUCStringEncoding2 = 3;
-
-const int NSUTF8StringEncoding2 = 4;
-
-const int NSISOLatin1StringEncoding2 = 5;
-
-const int NSSymbolStringEncoding2 = 6;
-
-const int NSNonLossyASCIIStringEncoding2 = 7;
-
-const int NSShiftJISStringEncoding2 = 8;
-
-const int NSISOLatin2StringEncoding2 = 9;
-
-const int NSUnicodeStringEncoding2 = 10;
-
-const int NSWindowsCP1251StringEncoding2 = 11;
-
-const int NSWindowsCP1252StringEncoding2 = 12;
-
-const int NSWindowsCP1253StringEncoding2 = 13;
-
-const int NSWindowsCP1254StringEncoding2 = 14;
-
-const int NSWindowsCP1250StringEncoding2 = 15;
-
-const int NSISO2022JPStringEncoding2 = 21;
-
-const int NSMacOSRomanStringEncoding2 = 30;
-
-const int NSUTF16StringEncoding2 = 10;
-
-const int NSUTF16BigEndianStringEncoding2 = 2415919360;
-
-const int NSUTF16LittleEndianStringEncoding2 = 2483028224;
-
-const int NSUTF32StringEncoding2 = 2348810496;
-
-const int NSUTF32BigEndianStringEncoding2 = 2550137088;
-
-const int NSUTF32LittleEndianStringEncoding2 = 2617245952;
-
-const int NSProprietaryStringEncoding2 = 65536;
-
-const int NSOpenStepUnicodeReservedBase1 = 62464;
-
-const int errSecSuccess1 = 0;
-
-const int errSecUnimplemented1 = -4;
-
-const int errSecDiskFull1 = -34;
-
-const int errSecDskFull1 = -34;
-
-const int errSecIO1 = -36;
-
-const int errSecOpWr1 = -49;
-
-const int errSecParam1 = -50;
-
-const int errSecWrPerm1 = -61;
-
-const int errSecAllocate1 = -108;
-
-const int errSecUserCanceled1 = -128;
-
-const int errSecBadReq1 = -909;
-
-const int errSecInternalComponent1 = -2070;
-
-const int errSecCoreFoundationUnknown1 = -4960;
-
-const int errSecMissingEntitlement1 = -34018;
-
-const int errSecRestrictedAPI1 = -34020;
-
-const int errSecNotAvailable1 = -25291;
-
-const int errSecReadOnly1 = -25292;
-
-const int errSecAuthFailed1 = -25293;
-
-const int errSecNoSuchKeychain1 = -25294;
-
-const int errSecInvalidKeychain1 = -25295;
-
-const int errSecDuplicateKeychain1 = -25296;
-
-const int errSecDuplicateCallback1 = -25297;
-
-const int errSecInvalidCallback1 = -25298;
-
-const int errSecDuplicateItem1 = -25299;
-
-const int errSecItemNotFound1 = -25300;
-
-const int errSecBufferTooSmall1 = -25301;
-
-const int errSecDataTooLarge1 = -25302;
-
-const int errSecNoSuchAttr1 = -25303;
-
-const int errSecInvalidItemRef1 = -25304;
-
-const int errSecInvalidSearchRef1 = -25305;
-
-const int errSecNoSuchClass1 = -25306;
-
-const int errSecNoDefaultKeychain1 = -25307;
-
-const int errSecInteractionNotAllowed1 = -25308;
-
-const int errSecReadOnlyAttr1 = -25309;
-
-const int errSecWrongSecVersion1 = -25310;
-
-const int errSecKeySizeNotAllowed1 = -25311;
-
-const int errSecNoStorageModule1 = -25312;
-
-const int errSecNoCertificateModule1 = -25313;
-
-const int errSecNoPolicyModule1 = -25314;
-
-const int errSecInteractionRequired1 = -25315;
-
-const int errSecDataNotAvailable1 = -25316;
-
-const int errSecDataNotModifiable1 = -25317;
-
-const int errSecCreateChainFailed1 = -25318;
-
-const int errSecInvalidPrefsDomain1 = -25319;
-
-const int errSecInDarkWake1 = -25320;
-
-const int errSecACLNotSimple1 = -25240;
-
-const int errSecPolicyNotFound1 = -25241;
-
-const int errSecInvalidTrustSetting1 = -25242;
-
-const int errSecNoAccessForItem1 = -25243;
-
-const int errSecInvalidOwnerEdit1 = -25244;
-
-const int errSecTrustNotAvailable1 = -25245;
-
-const int errSecUnsupportedFormat1 = -25256;
-
-const int errSecUnknownFormat1 = -25257;
-
-const int errSecKeyIsSensitive1 = -25258;
-
-const int errSecMultiplePrivKeys1 = -25259;
-
-const int errSecPassphraseRequired1 = -25260;
-
-const int errSecInvalidPasswordRef1 = -25261;
-
-const int errSecInvalidTrustSettings1 = -25262;
-
-const int errSecNoTrustSettings1 = -25263;
-
-const int errSecPkcs12VerifyFailure1 = -25264;
-
-const int errSecNotSigner1 = -26267;
-
-const int errSecDecode1 = -26275;
-
-const int errSecServiceNotAvailable1 = -67585;
-
-const int errSecInsufficientClientID1 = -67586;
-
-const int errSecDeviceReset1 = -67587;
-
-const int errSecDeviceFailed1 = -67588;
-
-const int errSecAppleAddAppACLSubject1 = -67589;
-
-const int errSecApplePublicKeyIncomplete1 = -67590;
-
-const int errSecAppleSignatureMismatch1 = -67591;
-
-const int errSecAppleInvalidKeyStartDate1 = -67592;
-
-const int errSecAppleInvalidKeyEndDate1 = -67593;
-
-const int errSecConversionError1 = -67594;
-
-const int errSecAppleSSLv2Rollback1 = -67595;
-
-const int errSecQuotaExceeded1 = -67596;
-
-const int errSecFileTooBig1 = -67597;
-
-const int errSecInvalidDatabaseBlob1 = -67598;
-
-const int errSecInvalidKeyBlob1 = -67599;
-
-const int errSecIncompatibleDatabaseBlob1 = -67600;
-
-const int errSecIncompatibleKeyBlob1 = -67601;
-
-const int errSecHostNameMismatch1 = -67602;
-
-const int errSecUnknownCriticalExtensionFlag1 = -67603;
-
-const int errSecNoBasicConstraints1 = -67604;
-
-const int errSecNoBasicConstraintsCA1 = -67605;
-
-const int errSecInvalidAuthorityKeyID1 = -67606;
-
-const int errSecInvalidSubjectKeyID1 = -67607;
-
-const int errSecInvalidKeyUsageForPolicy1 = -67608;
-
-const int errSecInvalidExtendedKeyUsage1 = -67609;
-
-const int errSecInvalidIDLinkage1 = -67610;
-
-const int errSecPathLengthConstraintExceeded1 = -67611;
-
-const int errSecInvalidRoot1 = -67612;
-
-const int errSecCRLExpired1 = -67613;
-
-const int errSecCRLNotValidYet1 = -67614;
-
-const int errSecCRLNotFound1 = -67615;
-
-const int errSecCRLServerDown1 = -67616;
-
-const int errSecCRLBadURI1 = -67617;
-
-const int errSecUnknownCertExtension1 = -67618;
-
-const int errSecUnknownCRLExtension1 = -67619;
-
-const int errSecCRLNotTrusted1 = -67620;
-
-const int errSecCRLPolicyFailed1 = -67621;
-
-const int errSecIDPFailure1 = -67622;
-
-const int errSecSMIMEEmailAddressesNotFound1 = -67623;
-
-const int errSecSMIMEBadExtendedKeyUsage1 = -67624;
-
-const int errSecSMIMEBadKeyUsage1 = -67625;
-
-const int errSecSMIMEKeyUsageNotCritical1 = -67626;
-
-const int errSecSMIMENoEmailAddress1 = -67627;
-
-const int errSecSMIMESubjAltNameNotCritical1 = -67628;
-
-const int errSecSSLBadExtendedKeyUsage1 = -67629;
-
-const int errSecOCSPBadResponse1 = -67630;
-
-const int errSecOCSPBadRequest1 = -67631;
-
-const int errSecOCSPUnavailable1 = -67632;
-
-const int errSecOCSPStatusUnrecognized1 = -67633;
-
-const int errSecEndOfData1 = -67634;
-
-const int errSecIncompleteCertRevocationCheck1 = -67635;
-
-const int errSecNetworkFailure1 = -67636;
-
-const int errSecOCSPNotTrustedToAnchor1 = -67637;
-
-const int errSecRecordModified1 = -67638;
-
-const int errSecOCSPSignatureError1 = -67639;
-
-const int errSecOCSPNoSigner1 = -67640;
-
-const int errSecOCSPResponderMalformedReq1 = -67641;
-
-const int errSecOCSPResponderInternalError1 = -67642;
-
-const int errSecOCSPResponderTryLater1 = -67643;
-
-const int errSecOCSPResponderSignatureRequired1 = -67644;
-
-const int errSecOCSPResponderUnauthorized1 = -67645;
-
-const int errSecOCSPResponseNonceMismatch1 = -67646;
-
-const int errSecCodeSigningBadCertChainLength1 = -67647;
-
-const int errSecCodeSigningNoBasicConstraints1 = -67648;
-
-const int errSecCodeSigningBadPathLengthConstraint1 = -67649;
-
-const int errSecCodeSigningNoExtendedKeyUsage1 = -67650;
-
-const int errSecCodeSigningDevelopment1 = -67651;
-
-const int errSecResourceSignBadCertChainLength1 = -67652;
-
-const int errSecResourceSignBadExtKeyUsage1 = -67653;
-
-const int errSecTrustSettingDeny1 = -67654;
-
-const int errSecInvalidSubjectName1 = -67655;
-
-const int errSecUnknownQualifiedCertStatement1 = -67656;
-
-const int errSecMobileMeRequestQueued1 = -67657;
-
-const int errSecMobileMeRequestRedirected1 = -67658;
-
-const int errSecMobileMeServerError1 = -67659;
-
-const int errSecMobileMeServerNotAvailable1 = -67660;
-
-const int errSecMobileMeServerAlreadyExists1 = -67661;
-
-const int errSecMobileMeServerServiceErr1 = -67662;
-
-const int errSecMobileMeRequestAlreadyPending1 = -67663;
-
-const int errSecMobileMeNoRequestPending1 = -67664;
-
-const int errSecMobileMeCSRVerifyFailure1 = -67665;
-
-const int errSecMobileMeFailedConsistencyCheck1 = -67666;
-
-const int errSecNotInitialized1 = -67667;
-
-const int errSecInvalidHandleUsage1 = -67668;
-
-const int errSecPVCReferentNotFound1 = -67669;
-
-const int errSecFunctionIntegrityFail1 = -67670;
-
-const int errSecInternalError1 = -67671;
-
-const int errSecMemoryError1 = -67672;
-
-const int errSecInvalidData1 = -67673;
-
-const int errSecMDSError1 = -67674;
-
-const int errSecInvalidPointer1 = -67675;
-
-const int errSecSelfCheckFailed1 = -67676;
-
-const int errSecFunctionFailed1 = -67677;
-
-const int errSecModuleManifestVerifyFailed1 = -67678;
-
-const int errSecInvalidGUID1 = -67679;
-
-const int errSecInvalidHandle1 = -67680;
-
-const int errSecInvalidDBList1 = -67681;
-
-const int errSecInvalidPassthroughID1 = -67682;
-
-const int errSecInvalidNetworkAddress1 = -67683;
-
-const int errSecCRLAlreadySigned1 = -67684;
-
-const int errSecInvalidNumberOfFields1 = -67685;
-
-const int errSecVerificationFailure1 = -67686;
-
-const int errSecUnknownTag1 = -67687;
-
-const int errSecInvalidSignature1 = -67688;
-
-const int errSecInvalidName1 = -67689;
-
-const int errSecInvalidCertificateRef1 = -67690;
-
-const int errSecInvalidCertificateGroup1 = -67691;
-
-const int errSecTagNotFound1 = -67692;
-
-const int errSecInvalidQuery1 = -67693;
-
-const int errSecInvalidValue1 = -67694;
-
-const int errSecCallbackFailed1 = -67695;
-
-const int errSecACLDeleteFailed1 = -67696;
-
-const int errSecACLReplaceFailed1 = -67697;
-
-const int errSecACLAddFailed1 = -67698;
-
-const int errSecACLChangeFailed1 = -67699;
-
-const int errSecInvalidAccessCredentials1 = -67700;
-
-const int errSecInvalidRecord1 = -67701;
-
-const int errSecInvalidACL1 = -67702;
-
-const int errSecInvalidSampleValue1 = -67703;
-
-const int errSecIncompatibleVersion1 = -67704;
-
-const int errSecPrivilegeNotGranted1 = -67705;
-
-const int errSecInvalidScope1 = -67706;
-
-const int errSecPVCAlreadyConfigured1 = -67707;
-
-const int errSecInvalidPVC1 = -67708;
-
-const int errSecEMMLoadFailed1 = -67709;
-
-const int errSecEMMUnloadFailed1 = -67710;
-
-const int errSecAddinLoadFailed1 = -67711;
-
-const int errSecInvalidKeyRef1 = -67712;
-
-const int errSecInvalidKeyHierarchy1 = -67713;
-
-const int errSecAddinUnloadFailed1 = -67714;
-
-const int errSecLibraryReferenceNotFound1 = -67715;
-
-const int errSecInvalidAddinFunctionTable1 = -67716;
-
-const int errSecInvalidServiceMask1 = -67717;
-
-const int errSecModuleNotLoaded1 = -67718;
-
-const int errSecInvalidSubServiceID1 = -67719;
-
-const int errSecAttributeNotInContext1 = -67720;
-
-const int errSecModuleManagerInitializeFailed1 = -67721;
-
-const int errSecModuleManagerNotFound1 = -67722;
-
-const int errSecEventNotificationCallbackNotFound1 = -67723;
-
-const int errSecInputLengthError1 = -67724;
-
-const int errSecOutputLengthError1 = -67725;
-
-const int errSecPrivilegeNotSupported1 = -67726;
-
-const int errSecDeviceError1 = -67727;
-
-const int errSecAttachHandleBusy1 = -67728;
-
-const int errSecNotLoggedIn1 = -67729;
-
-const int errSecAlgorithmMismatch1 = -67730;
-
-const int errSecKeyUsageIncorrect1 = -67731;
-
-const int errSecKeyBlobTypeIncorrect1 = -67732;
-
-const int errSecKeyHeaderInconsistent1 = -67733;
-
-const int errSecUnsupportedKeyFormat1 = -67734;
-
-const int errSecUnsupportedKeySize1 = -67735;
-
-const int errSecInvalidKeyUsageMask1 = -67736;
-
-const int errSecUnsupportedKeyUsageMask1 = -67737;
-
-const int errSecInvalidKeyAttributeMask1 = -67738;
-
-const int errSecUnsupportedKeyAttributeMask1 = -67739;
-
-const int errSecInvalidKeyLabel1 = -67740;
-
-const int errSecUnsupportedKeyLabel1 = -67741;
-
-const int errSecInvalidKeyFormat1 = -67742;
-
-const int errSecUnsupportedVectorOfBuffers1 = -67743;
-
-const int errSecInvalidInputVector1 = -67744;
-
-const int errSecInvalidOutputVector1 = -67745;
-
-const int errSecInvalidContext1 = -67746;
-
-const int errSecInvalidAlgorithm1 = -67747;
-
-const int errSecInvalidAttributeKey1 = -67748;
-
-const int errSecMissingAttributeKey1 = -67749;
-
-const int errSecInvalidAttributeInitVector1 = -67750;
-
-const int errSecMissingAttributeInitVector1 = -67751;
-
-const int errSecInvalidAttributeSalt1 = -67752;
-
-const int errSecMissingAttributeSalt1 = -67753;
-
-const int errSecInvalidAttributePadding1 = -67754;
-
-const int errSecMissingAttributePadding1 = -67755;
-
-const int errSecInvalidAttributeRandom1 = -67756;
-
-const int errSecMissingAttributeRandom1 = -67757;
-
-const int errSecInvalidAttributeSeed1 = -67758;
-
-const int errSecMissingAttributeSeed1 = -67759;
-
-const int errSecInvalidAttributePassphrase1 = -67760;
-
-const int errSecMissingAttributePassphrase1 = -67761;
-
-const int errSecInvalidAttributeKeyLength1 = -67762;
-
-const int errSecMissingAttributeKeyLength1 = -67763;
-
-const int errSecInvalidAttributeBlockSize1 = -67764;
-
-const int errSecMissingAttributeBlockSize1 = -67765;
-
-const int errSecInvalidAttributeOutputSize1 = -67766;
-
-const int errSecMissingAttributeOutputSize1 = -67767;
-
-const int errSecInvalidAttributeRounds1 = -67768;
-
-const int errSecMissingAttributeRounds1 = -67769;
-
-const int errSecInvalidAlgorithmParms1 = -67770;
-
-const int errSecMissingAlgorithmParms1 = -67771;
-
-const int errSecInvalidAttributeLabel1 = -67772;
-
-const int errSecMissingAttributeLabel1 = -67773;
-
-const int errSecInvalidAttributeKeyType1 = -67774;
-
-const int errSecMissingAttributeKeyType1 = -67775;
-
-const int errSecInvalidAttributeMode1 = -67776;
-
-const int errSecMissingAttributeMode1 = -67777;
-
-const int errSecInvalidAttributeEffectiveBits1 = -67778;
-
-const int errSecMissingAttributeEffectiveBits1 = -67779;
-
-const int errSecInvalidAttributeStartDate1 = -67780;
-
-const int errSecMissingAttributeStartDate1 = -67781;
-
-const int errSecInvalidAttributeEndDate1 = -67782;
-
-const int errSecMissingAttributeEndDate1 = -67783;
-
-const int errSecInvalidAttributeVersion1 = -67784;
-
-const int errSecMissingAttributeVersion1 = -67785;
-
-const int errSecInvalidAttributePrime1 = -67786;
-
-const int errSecMissingAttributePrime1 = -67787;
-
-const int errSecInvalidAttributeBase1 = -67788;
-
-const int errSecMissingAttributeBase1 = -67789;
-
-const int errSecInvalidAttributeSubprime1 = -67790;
-
-const int errSecMissingAttributeSubprime1 = -67791;
-
-const int errSecInvalidAttributeIterationCount1 = -67792;
-
-const int errSecMissingAttributeIterationCount1 = -67793;
-
-const int errSecInvalidAttributeDLDBHandle1 = -67794;
-
-const int errSecMissingAttributeDLDBHandle1 = -67795;
-
-const int errSecInvalidAttributeAccessCredentials1 = -67796;
-
-const int errSecMissingAttributeAccessCredentials1 = -67797;
-
-const int errSecInvalidAttributePublicKeyFormat1 = -67798;
-
-const int errSecMissingAttributePublicKeyFormat1 = -67799;
-
-const int errSecInvalidAttributePrivateKeyFormat1 = -67800;
-
-const int errSecMissingAttributePrivateKeyFormat1 = -67801;
-
-const int errSecInvalidAttributeSymmetricKeyFormat1 = -67802;
-
-const int errSecMissingAttributeSymmetricKeyFormat1 = -67803;
-
-const int errSecInvalidAttributeWrappedKeyFormat1 = -67804;
-
-const int errSecMissingAttributeWrappedKeyFormat1 = -67805;
-
-const int errSecStagedOperationInProgress1 = -67806;
-
-const int errSecStagedOperationNotStarted1 = -67807;
-
-const int errSecVerifyFailed1 = -67808;
-
-const int errSecQuerySizeUnknown1 = -67809;
-
-const int errSecBlockSizeMismatch1 = -67810;
-
-const int errSecPublicKeyInconsistent1 = -67811;
-
-const int errSecDeviceVerifyFailed1 = -67812;
-
-const int errSecInvalidLoginName1 = -67813;
-
-const int errSecAlreadyLoggedIn1 = -67814;
-
-const int errSecInvalidDigestAlgorithm1 = -67815;
-
-const int errSecInvalidCRLGroup1 = -67816;
-
-const int errSecCertificateCannotOperate1 = -67817;
-
-const int errSecCertificateExpired1 = -67818;
-
-const int errSecCertificateNotValidYet1 = -67819;
-
-const int errSecCertificateRevoked1 = -67820;
-
-const int errSecCertificateSuspended1 = -67821;
-
-const int errSecInsufficientCredentials1 = -67822;
-
-const int errSecInvalidAction1 = -67823;
-
-const int errSecInvalidAuthority1 = -67824;
-
-const int errSecVerifyActionFailed1 = -67825;
-
-const int errSecInvalidCertAuthority1 = -67826;
-
-const int errSecInvalidCRLAuthority1 = -67827;
-
-const int errSecInvaldCRLAuthority1 = -67827;
-
-const int errSecInvalidCRLEncoding1 = -67828;
-
-const int errSecInvalidCRLType1 = -67829;
-
-const int errSecInvalidCRL1 = -67830;
-
-const int errSecInvalidFormType1 = -67831;
-
-const int errSecInvalidID1 = -67832;
-
-const int errSecInvalidIdentifier1 = -67833;
-
-const int errSecInvalidIndex1 = -67834;
-
-const int errSecInvalidPolicyIdentifiers1 = -67835;
-
-const int errSecInvalidTimeString1 = -67836;
-
-const int errSecInvalidReason1 = -67837;
-
-const int errSecInvalidRequestInputs1 = -67838;
-
-const int errSecInvalidResponseVector1 = -67839;
-
-const int errSecInvalidStopOnPolicy1 = -67840;
-
-const int errSecInvalidTuple1 = -67841;
-
-const int errSecMultipleValuesUnsupported1 = -67842;
-
-const int errSecNotTrusted1 = -67843;
-
-const int errSecNoDefaultAuthority1 = -67844;
-
-const int errSecRejectedForm1 = -67845;
-
-const int errSecRequestLost1 = -67846;
-
-const int errSecRequestRejected1 = -67847;
-
-const int errSecUnsupportedAddressType1 = -67848;
-
-const int errSecUnsupportedService1 = -67849;
-
-const int errSecInvalidTupleGroup1 = -67850;
-
-const int errSecInvalidBaseACLs1 = -67851;
-
-const int errSecInvalidTupleCredentials1 = -67852;
-
-const int errSecInvalidTupleCredendtials1 = -67852;
-
-const int errSecInvalidEncoding1 = -67853;
-
-const int errSecInvalidValidityPeriod1 = -67854;
-
-const int errSecInvalidRequestor1 = -67855;
-
-const int errSecRequestDescriptor1 = -67856;
-
-const int errSecInvalidBundleInfo1 = -67857;
-
-const int errSecInvalidCRLIndex1 = -67858;
-
-const int errSecNoFieldValues1 = -67859;
-
-const int errSecUnsupportedFieldFormat1 = -67860;
-
-const int errSecUnsupportedIndexInfo1 = -67861;
-
-const int errSecUnsupportedLocality1 = -67862;
-
-const int errSecUnsupportedNumAttributes1 = -67863;
-
-const int errSecUnsupportedNumIndexes1 = -67864;
-
-const int errSecUnsupportedNumRecordTypes1 = -67865;
-
-const int errSecFieldSpecifiedMultiple1 = -67866;
-
-const int errSecIncompatibleFieldFormat1 = -67867;
-
-const int errSecInvalidParsingModule1 = -67868;
-
-const int errSecDatabaseLocked1 = -67869;
-
-const int errSecDatastoreIsOpen1 = -67870;
-
-const int errSecMissingValue1 = -67871;
-
-const int errSecUnsupportedQueryLimits1 = -67872;
-
-const int errSecUnsupportedNumSelectionPreds1 = -67873;
-
-const int errSecUnsupportedOperator1 = -67874;
-
-const int errSecInvalidDBLocation1 = -67875;
-
-const int errSecInvalidAccessRequest1 = -67876;
-
-const int errSecInvalidIndexInfo1 = -67877;
-
-const int errSecInvalidNewOwner1 = -67878;
-
-const int errSecInvalidModifyMode1 = -67879;
-
-const int errSecMissingRequiredExtension1 = -67880;
-
-const int errSecExtendedKeyUsageNotCritical1 = -67881;
-
-const int errSecTimestampMissing1 = -67882;
-
-const int errSecTimestampInvalid1 = -67883;
-
-const int errSecTimestampNotTrusted1 = -67884;
-
-const int errSecTimestampServiceNotAvailable1 = -67885;
-
-const int errSecTimestampBadAlg1 = -67886;
-
-const int errSecTimestampBadRequest1 = -67887;
-
-const int errSecTimestampBadDataFormat1 = -67888;
-
-const int errSecTimestampTimeNotAvailable1 = -67889;
-
-const int errSecTimestampUnacceptedPolicy1 = -67890;
-
-const int errSecTimestampUnacceptedExtension1 = -67891;
-
-const int errSecTimestampAddInfoNotAvailable1 = -67892;
-
-const int errSecTimestampSystemFailure1 = -67893;
-
-const int errSecSigningTimeMissing1 = -67894;
-
-const int errSecTimestampRejection1 = -67895;
-
-const int errSecTimestampWaiting1 = -67896;
-
-const int errSecTimestampRevocationWarning1 = -67897;
-
-const int errSecTimestampRevocationNotification1 = -67898;
-
-const int errSecCertificatePolicyNotAllowed1 = -67899;
-
-const int errSecCertificateNameNotAllowed1 = -67900;
-
-const int errSecCertificateValidityPeriodTooLong1 = -67901;
-
-const int errSecCertificateIsCA1 = -67902;
-
-const int errSecCertificateDuplicateExtension1 = -67903;
-
-const int errSSLProtocol1 = -9800;
-
-const int errSSLNegotiation1 = -9801;
-
-const int errSSLFatalAlert1 = -9802;
-
-const int errSSLWouldBlock1 = -9803;
-
-const int errSSLSessionNotFound1 = -9804;
-
-const int errSSLClosedGraceful1 = -9805;
-
-const int errSSLClosedAbort1 = -9806;
-
-const int errSSLXCertChainInvalid1 = -9807;
-
-const int errSSLBadCert1 = -9808;
-
-const int errSSLCrypto1 = -9809;
-
-const int errSSLInternal1 = -9810;
-
-const int errSSLModuleAttach1 = -9811;
-
-const int errSSLUnknownRootCert1 = -9812;
-
-const int errSSLNoRootCert1 = -9813;
-
-const int errSSLCertExpired1 = -9814;
-
-const int errSSLCertNotYetValid1 = -9815;
-
-const int errSSLClosedNoNotify1 = -9816;
-
-const int errSSLBufferOverflow1 = -9817;
-
-const int errSSLBadCipherSuite1 = -9818;
-
-const int errSSLPeerUnexpectedMsg1 = -9819;
-
-const int errSSLPeerBadRecordMac1 = -9820;
-
-const int errSSLPeerDecryptionFail1 = -9821;
-
-const int errSSLPeerRecordOverflow1 = -9822;
-
-const int errSSLPeerDecompressFail1 = -9823;
-
-const int errSSLPeerHandshakeFail1 = -9824;
-
-const int errSSLPeerBadCert1 = -9825;
-
-const int errSSLPeerUnsupportedCert1 = -9826;
-
-const int errSSLPeerCertRevoked1 = -9827;
-
-const int errSSLPeerCertExpired1 = -9828;
-
-const int errSSLPeerCertUnknown1 = -9829;
-
-const int errSSLIllegalParam1 = -9830;
-
-const int errSSLPeerUnknownCA1 = -9831;
-
-const int errSSLPeerAccessDenied1 = -9832;
-
-const int errSSLPeerDecodeError1 = -9833;
-
-const int errSSLPeerDecryptError1 = -9834;
-
-const int errSSLPeerExportRestriction1 = -9835;
-
-const int errSSLPeerProtocolVersion1 = -9836;
-
-const int errSSLPeerInsufficientSecurity1 = -9837;
-
-const int errSSLPeerInternalError1 = -9838;
-
-const int errSSLPeerUserCancelled1 = -9839;
-
-const int errSSLPeerNoRenegotiation1 = -9840;
-
-const int errSSLPeerAuthCompleted1 = -9841;
-
-const int errSSLClientCertRequested1 = -9842;
-
-const int errSSLHostNameMismatch1 = -9843;
-
-const int errSSLConnectionRefused1 = -9844;
-
-const int errSSLDecryptionFail1 = -9845;
-
-const int errSSLBadRecordMac1 = -9846;
-
-const int errSSLRecordOverflow1 = -9847;
-
-const int errSSLBadConfiguration1 = -9848;
-
-const int errSSLUnexpectedRecord1 = -9849;
-
-const int errSSLWeakPeerEphemeralDHKey1 = -9850;
-
-const int errSSLClientHelloReceived1 = -9851;
-
-const int errSSLTransportReset1 = -9852;
-
-const int errSSLNetworkTimeout1 = -9853;
-
-const int errSSLConfigurationFailed1 = -9854;
-
-const int errSSLUnsupportedExtension1 = -9855;
-
-const int errSSLUnexpectedMessage1 = -9856;
-
-const int errSSLDecompressFail1 = -9857;
-
-const int errSSLHandshakeFail1 = -9858;
-
-const int errSSLDecodeError1 = -9859;
-
-const int errSSLInappropriateFallback1 = -9860;
-
-const int errSSLMissingExtension1 = -9861;
-
-const int errSSLBadCertificateStatusResponse1 = -9862;
-
-const int errSSLCertificateRequired1 = -9863;
-
-const int errSSLUnknownPSKIdentity1 = -9864;
-
-const int errSSLUnrecognizedName1 = -9865;
-
-const int errSSLATSViolation1 = -9880;
-
-const int errSSLATSMinimumVersionViolation1 = -9881;
-
-const int errSSLATSCiphersuiteViolation1 = -9882;
-
-const int errSSLATSMinimumKeySizeViolation1 = -9883;
-
-const int errSSLATSLeafCertificateHashAlgorithmViolation1 = -9884;
-
-const int errSSLATSCertificateHashAlgorithmViolation1 = -9885;
-
-const int errSSLATSCertificateTrustViolation1 = -9886;
-
-const int errSSLEarlyDataRejected1 = -9890;
-
-const int OSUnknownByteOrder1 = 0;
-
-const int OSLittleEndian1 = 1;
-
-const int OSBigEndian1 = 2;
-
-const int kCFNotificationDeliverImmediately1 = 1;
-
-const int kCFNotificationPostToAllSessions1 = 2;
-
-const int kCFCalendarComponentsWrap1 = 1;
-
-const int kCFSocketAutomaticallyReenableReadCallBack1 = 1;
-
-const int kCFSocketAutomaticallyReenableAcceptCallBack1 = 2;
-
-const int kCFSocketAutomaticallyReenableDataCallBack1 = 3;
-
-const int kCFSocketAutomaticallyReenableWriteCallBack1 = 8;
-
-const int kCFSocketLeaveErrors1 = 64;
-
-const int kCFSocketCloseOnInvalidate1 = 128;
-
-const int DISPATCH_WALLTIME_NOW2 = -2;
-
-const int kCFPropertyListReadCorruptError1 = 3840;
-
-const int kCFPropertyListReadUnknownVersionError1 = 3841;
-
-const int kCFPropertyListReadStreamError1 = 3842;
-
-const int kCFPropertyListWriteStreamError1 = 3851;
-
-const int kCFBundleExecutableArchitectureI3861 = 7;
-
-const int kCFBundleExecutableArchitecturePPC1 = 18;
-
-const int kCFBundleExecutableArchitectureX86_641 = 16777223;
-
-const int kCFBundleExecutableArchitecturePPC641 = 16777234;
-
-const int kCFBundleExecutableArchitectureARM641 = 16777228;
-
-const int kCFMessagePortSuccess1 = 0;
-
-const int kCFMessagePortSendTimeout1 = -1;
-
-const int kCFMessagePortReceiveTimeout1 = -2;
-
-const int kCFMessagePortIsInvalid1 = -3;
-
-const int kCFMessagePortTransportError1 = -4;
-
-const int kCFMessagePortBecameInvalidError1 = -5;
-
-const int kCFStringTokenizerUnitWord1 = 0;
-
-const int kCFStringTokenizerUnitSentence1 = 1;
-
-const int kCFStringTokenizerUnitParagraph1 = 2;
-
-const int kCFStringTokenizerUnitLineBreak1 = 3;
-
-const int kCFStringTokenizerUnitWordBoundary1 = 4;
-
-const int kCFStringTokenizerAttributeLatinTranscription1 = 65536;
-
-const int kCFStringTokenizerAttributeLanguage1 = 131072;
-
-const int kCFFileDescriptorReadCallBack1 = 1;
-
-const int kCFFileDescriptorWriteCallBack1 = 2;
-
-const int kCFUserNotificationStopAlertLevel1 = 0;
-
-const int kCFUserNotificationNoteAlertLevel1 = 1;
-
-const int kCFUserNotificationCautionAlertLevel1 = 2;
-
-const int kCFUserNotificationPlainAlertLevel1 = 3;
-
-const int kCFUserNotificationDefaultResponse1 = 0;
-
-const int kCFUserNotificationAlternateResponse1 = 1;
-
-const int kCFUserNotificationOtherResponse1 = 2;
-
-const int kCFUserNotificationCancelResponse1 = 3;
-
-const int kCFUserNotificationNoDefaultButtonFlag1 = 32;
-
-const int kCFUserNotificationUseRadioButtonsFlag1 = 64;
-
-const int kCFXMLNodeCurrentVersion1 = 1;
-
-const int CSSM_INVALID_HANDLE1 = 0;
-
-const int CSSM_FALSE1 = 0;
-
-const int CSSM_TRUE1 = 1;
-
-const int CSSM_OK1 = 0;
-
-const int CSSM_MODULE_STRING_SIZE1 = 64;
-
-const int CSSM_KEY_HIERARCHY_NONE1 = 0;
-
-const int CSSM_KEY_HIERARCHY_INTEG1 = 1;
-
-const int CSSM_KEY_HIERARCHY_EXPORT1 = 2;
-
-const int CSSM_PVC_NONE1 = 0;
-
-const int CSSM_PVC_APP1 = 1;
-
-const int CSSM_PVC_SP1 = 2;
-
-const int CSSM_PRIVILEGE_SCOPE_NONE1 = 0;
-
-const int CSSM_PRIVILEGE_SCOPE_PROCESS1 = 1;
-
-const int CSSM_PRIVILEGE_SCOPE_THREAD1 = 2;
-
-const int CSSM_SERVICE_CSSM1 = 1;
-
-const int CSSM_SERVICE_CSP1 = 2;
-
-const int CSSM_SERVICE_DL1 = 4;
-
-const int CSSM_SERVICE_CL1 = 8;
-
-const int CSSM_SERVICE_TP1 = 16;
-
-const int CSSM_SERVICE_AC1 = 32;
-
-const int CSSM_SERVICE_KR1 = 64;
-
-const int CSSM_NOTIFY_INSERT1 = 1;
-
-const int CSSM_NOTIFY_REMOVE1 = 2;
-
-const int CSSM_NOTIFY_FAULT1 = 3;
-
-const int CSSM_ATTACH_READ_ONLY1 = 1;
-
-const int CSSM_USEE_LAST1 = 255;
-
-const int CSSM_USEE_NONE1 = 0;
-
-const int CSSM_USEE_DOMESTIC1 = 1;
-
-const int CSSM_USEE_FINANCIAL1 = 2;
-
-const int CSSM_USEE_KRLE1 = 3;
-
-const int CSSM_USEE_KRENT1 = 4;
-
-const int CSSM_USEE_SSL1 = 5;
-
-const int CSSM_USEE_AUTHENTICATION1 = 6;
-
-const int CSSM_USEE_KEYEXCH1 = 7;
-
-const int CSSM_USEE_MEDICAL1 = 8;
-
-const int CSSM_USEE_INSURANCE1 = 9;
-
-const int CSSM_USEE_WEAK1 = 10;
-
-const int CSSM_ADDR_NONE1 = 0;
-
-const int CSSM_ADDR_CUSTOM1 = 1;
-
-const int CSSM_ADDR_URL1 = 2;
-
-const int CSSM_ADDR_SOCKADDR1 = 3;
-
-const int CSSM_ADDR_NAME1 = 4;
-
-const int CSSM_NET_PROTO_NONE1 = 0;
-
-const int CSSM_NET_PROTO_CUSTOM1 = 1;
-
-const int CSSM_NET_PROTO_UNSPECIFIED1 = 2;
-
-const int CSSM_NET_PROTO_LDAP1 = 3;
-
-const int CSSM_NET_PROTO_LDAPS1 = 4;
-
-const int CSSM_NET_PROTO_LDAPNS1 = 5;
-
-const int CSSM_NET_PROTO_X500DAP1 = 6;
-
-const int CSSM_NET_PROTO_FTP1 = 7;
-
-const int CSSM_NET_PROTO_FTPS1 = 8;
-
-const int CSSM_NET_PROTO_OCSP1 = 9;
-
-const int CSSM_NET_PROTO_CMP1 = 10;
-
-const int CSSM_NET_PROTO_CMPS1 = 11;
-
-const int CSSM_WORDID__UNK_1 = -1;
-
-const int CSSM_WORDID__NLU_1 = 0;
-
-const int CSSM_WORDID__STAR_1 = 1;
-
-const int CSSM_WORDID_A1 = 2;
-
-const int CSSM_WORDID_ACL1 = 3;
-
-const int CSSM_WORDID_ALPHA1 = 4;
-
-const int CSSM_WORDID_B1 = 5;
-
-const int CSSM_WORDID_BER1 = 6;
-
-const int CSSM_WORDID_BINARY1 = 7;
-
-const int CSSM_WORDID_BIOMETRIC1 = 8;
-
-const int CSSM_WORDID_C1 = 9;
-
-const int CSSM_WORDID_CANCELED1 = 10;
-
-const int CSSM_WORDID_CERT1 = 11;
-
-const int CSSM_WORDID_COMMENT1 = 12;
-
-const int CSSM_WORDID_CRL1 = 13;
-
-const int CSSM_WORDID_CUSTOM1 = 14;
-
-const int CSSM_WORDID_D1 = 15;
-
-const int CSSM_WORDID_DATE1 = 16;
-
-const int CSSM_WORDID_DB_DELETE1 = 17;
-
-const int CSSM_WORDID_DB_EXEC_STORED_QUERY1 = 18;
-
-const int CSSM_WORDID_DB_INSERT1 = 19;
-
-const int CSSM_WORDID_DB_MODIFY1 = 20;
-
-const int CSSM_WORDID_DB_READ1 = 21;
-
-const int CSSM_WORDID_DBS_CREATE1 = 22;
-
-const int CSSM_WORDID_DBS_DELETE1 = 23;
-
-const int CSSM_WORDID_DECRYPT1 = 24;
-
-const int CSSM_WORDID_DELETE1 = 25;
-
-const int CSSM_WORDID_DELTA_CRL1 = 26;
-
-const int CSSM_WORDID_DER1 = 27;
-
-const int CSSM_WORDID_DERIVE1 = 28;
-
-const int CSSM_WORDID_DISPLAY1 = 29;
-
-const int CSSM_WORDID_DO1 = 30;
-
-const int CSSM_WORDID_DSA1 = 31;
-
-const int CSSM_WORDID_DSA_SHA11 = 32;
-
-const int CSSM_WORDID_E1 = 33;
-
-const int CSSM_WORDID_ELGAMAL1 = 34;
-
-const int CSSM_WORDID_ENCRYPT1 = 35;
-
-const int CSSM_WORDID_ENTRY1 = 36;
-
-const int CSSM_WORDID_EXPORT_CLEAR1 = 37;
-
-const int CSSM_WORDID_EXPORT_WRAPPED1 = 38;
-
-const int CSSM_WORDID_G1 = 39;
-
-const int CSSM_WORDID_GE1 = 40;
-
-const int CSSM_WORDID_GENKEY1 = 41;
-
-const int CSSM_WORDID_HASH1 = 42;
-
-const int CSSM_WORDID_HASHED_PASSWORD1 = 43;
-
-const int CSSM_WORDID_HASHED_SUBJECT1 = 44;
-
-const int CSSM_WORDID_HAVAL1 = 45;
-
-const int CSSM_WORDID_IBCHASH1 = 46;
-
-const int CSSM_WORDID_IMPORT_CLEAR1 = 47;
-
-const int CSSM_WORDID_IMPORT_WRAPPED1 = 48;
-
-const int CSSM_WORDID_INTEL1 = 49;
-
-const int CSSM_WORDID_ISSUER1 = 50;
-
-const int CSSM_WORDID_ISSUER_INFO1 = 51;
-
-const int CSSM_WORDID_K_OF_N1 = 52;
-
-const int CSSM_WORDID_KEA1 = 53;
-
-const int CSSM_WORDID_KEYHOLDER1 = 54;
-
-const int CSSM_WORDID_L1 = 55;
-
-const int CSSM_WORDID_LE1 = 56;
-
-const int CSSM_WORDID_LOGIN1 = 57;
-
-const int CSSM_WORDID_LOGIN_NAME1 = 58;
-
-const int CSSM_WORDID_MAC1 = 59;
-
-const int CSSM_WORDID_MD21 = 60;
-
-const int CSSM_WORDID_MD2WITHRSA1 = 61;
-
-const int CSSM_WORDID_MD41 = 62;
-
-const int CSSM_WORDID_MD51 = 63;
-
-const int CSSM_WORDID_MD5WITHRSA1 = 64;
-
-const int CSSM_WORDID_N1 = 65;
-
-const int CSSM_WORDID_NAME1 = 66;
-
-const int CSSM_WORDID_NDR1 = 67;
-
-const int CSSM_WORDID_NHASH1 = 68;
-
-const int CSSM_WORDID_NOT_AFTER1 = 69;
-
-const int CSSM_WORDID_NOT_BEFORE1 = 70;
-
-const int CSSM_WORDID_NULL1 = 71;
-
-const int CSSM_WORDID_NUMERIC1 = 72;
-
-const int CSSM_WORDID_OBJECT_HASH1 = 73;
-
-const int CSSM_WORDID_ONE_TIME1 = 74;
-
-const int CSSM_WORDID_ONLINE1 = 75;
-
-const int CSSM_WORDID_OWNER1 = 76;
-
-const int CSSM_WORDID_P1 = 77;
-
-const int CSSM_WORDID_PAM_NAME1 = 78;
-
-const int CSSM_WORDID_PASSWORD1 = 79;
-
-const int CSSM_WORDID_PGP1 = 80;
-
-const int CSSM_WORDID_PREFIX1 = 81;
-
-const int CSSM_WORDID_PRIVATE_KEY1 = 82;
-
-const int CSSM_WORDID_PROMPTED_BIOMETRIC1 = 83;
-
-const int CSSM_WORDID_PROMPTED_PASSWORD1 = 84;
-
-const int CSSM_WORDID_PROPAGATE1 = 85;
-
-const int CSSM_WORDID_PROTECTED_BIOMETRIC1 = 86;
-
-const int CSSM_WORDID_PROTECTED_PASSWORD1 = 87;
-
-const int CSSM_WORDID_PROTECTED_PIN1 = 88;
-
-const int CSSM_WORDID_PUBLIC_KEY1 = 89;
-
-const int CSSM_WORDID_PUBLIC_KEY_FROM_CERT1 = 90;
-
-const int CSSM_WORDID_Q1 = 91;
-
-const int CSSM_WORDID_RANGE1 = 92;
-
-const int CSSM_WORDID_REVAL1 = 93;
-
-const int CSSM_WORDID_RIPEMAC1 = 94;
-
-const int CSSM_WORDID_RIPEMD1 = 95;
-
-const int CSSM_WORDID_RIPEMD1601 = 96;
-
-const int CSSM_WORDID_RSA1 = 97;
-
-const int CSSM_WORDID_RSA_ISO97961 = 98;
-
-const int CSSM_WORDID_RSA_PKCS2 = 99;
-
-const int CSSM_WORDID_RSA_PKCS_MD51 = 100;
-
-const int CSSM_WORDID_RSA_PKCS_SHA11 = 101;
-
-const int CSSM_WORDID_RSA_PKCS11 = 102;
-
-const int CSSM_WORDID_RSA_PKCS1_MD51 = 103;
-
-const int CSSM_WORDID_RSA_PKCS1_SHA11 = 104;
-
-const int CSSM_WORDID_RSA_PKCS1_SIG1 = 105;
-
-const int CSSM_WORDID_RSA_RAW1 = 106;
-
-const int CSSM_WORDID_SDSIV11 = 107;
-
-const int CSSM_WORDID_SEQUENCE1 = 108;
-
-const int CSSM_WORDID_SET1 = 109;
-
-const int CSSM_WORDID_SEXPR1 = 110;
-
-const int CSSM_WORDID_SHA11 = 111;
-
-const int CSSM_WORDID_SHA1WITHDSA1 = 112;
-
-const int CSSM_WORDID_SHA1WITHECDSA1 = 113;
-
-const int CSSM_WORDID_SHA1WITHRSA1 = 114;
-
-const int CSSM_WORDID_SIGN1 = 115;
-
-const int CSSM_WORDID_SIGNATURE1 = 116;
-
-const int CSSM_WORDID_SIGNED_NONCE1 = 117;
-
-const int CSSM_WORDID_SIGNED_SECRET1 = 118;
-
-const int CSSM_WORDID_SPKI1 = 119;
-
-const int CSSM_WORDID_SUBJECT1 = 120;
-
-const int CSSM_WORDID_SUBJECT_INFO1 = 121;
-
-const int CSSM_WORDID_TAG1 = 122;
-
-const int CSSM_WORDID_THRESHOLD1 = 123;
-
-const int CSSM_WORDID_TIME1 = 124;
-
-const int CSSM_WORDID_URI1 = 125;
-
-const int CSSM_WORDID_VERSION1 = 126;
-
-const int CSSM_WORDID_X509_ATTRIBUTE1 = 127;
-
-const int CSSM_WORDID_X509V11 = 128;
-
-const int CSSM_WORDID_X509V21 = 129;
-
-const int CSSM_WORDID_X509V31 = 130;
-
-const int CSSM_WORDID_X9_ATTRIBUTE1 = 131;
-
-const int CSSM_WORDID_VENDOR_START1 = 65536;
-
-const int CSSM_WORDID_VENDOR_END1 = 2147418112;
-
-const int CSSM_LIST_ELEMENT_DATUM1 = 0;
-
-const int CSSM_LIST_ELEMENT_SUBLIST1 = 1;
-
-const int CSSM_LIST_ELEMENT_WORDID1 = 2;
-
-const int CSSM_LIST_TYPE_UNKNOWN1 = 0;
-
-const int CSSM_LIST_TYPE_CUSTOM1 = 1;
-
-const int CSSM_LIST_TYPE_SEXPR1 = 2;
-
-const int CSSM_SAMPLE_TYPE_PASSWORD1 = 79;
-
-const int CSSM_SAMPLE_TYPE_HASHED_PASSWORD1 = 43;
-
-const int CSSM_SAMPLE_TYPE_PROTECTED_PASSWORD1 = 87;
-
-const int CSSM_SAMPLE_TYPE_PROMPTED_PASSWORD1 = 84;
-
-const int CSSM_SAMPLE_TYPE_SIGNED_NONCE1 = 117;
-
-const int CSSM_SAMPLE_TYPE_SIGNED_SECRET1 = 118;
-
-const int CSSM_SAMPLE_TYPE_BIOMETRIC1 = 8;
-
-const int CSSM_SAMPLE_TYPE_PROTECTED_BIOMETRIC1 = 86;
-
-const int CSSM_SAMPLE_TYPE_PROMPTED_BIOMETRIC1 = 83;
-
-const int CSSM_SAMPLE_TYPE_THRESHOLD1 = 123;
-
-const int CSSM_CERT_UNKNOWN1 = 0;
-
-const int CSSM_CERT_X_509v11 = 1;
-
-const int CSSM_CERT_X_509v21 = 2;
-
-const int CSSM_CERT_X_509v31 = 3;
-
-const int CSSM_CERT_PGP1 = 4;
-
-const int CSSM_CERT_SPKI1 = 5;
-
-const int CSSM_CERT_SDSIv11 = 6;
-
-const int CSSM_CERT_Intel1 = 8;
-
-const int CSSM_CERT_X_509_ATTRIBUTE1 = 9;
-
-const int CSSM_CERT_X9_ATTRIBUTE1 = 10;
-
-const int CSSM_CERT_TUPLE1 = 11;
-
-const int CSSM_CERT_ACL_ENTRY1 = 12;
-
-const int CSSM_CERT_MULTIPLE1 = 32766;
-
-const int CSSM_CERT_LAST1 = 32767;
-
-const int CSSM_CL_CUSTOM_CERT_TYPE1 = 32768;
-
-const int CSSM_CERT_ENCODING_UNKNOWN1 = 0;
-
-const int CSSM_CERT_ENCODING_CUSTOM1 = 1;
-
-const int CSSM_CERT_ENCODING_BER1 = 2;
-
-const int CSSM_CERT_ENCODING_DER1 = 3;
-
-const int CSSM_CERT_ENCODING_NDR1 = 4;
-
-const int CSSM_CERT_ENCODING_SEXPR1 = 5;
-
-const int CSSM_CERT_ENCODING_PGP1 = 6;
-
-const int CSSM_CERT_ENCODING_MULTIPLE1 = 32766;
-
-const int CSSM_CERT_ENCODING_LAST1 = 32767;
-
-const int CSSM_CL_CUSTOM_CERT_ENCODING1 = 32768;
-
-const int CSSM_CERT_PARSE_FORMAT_NONE1 = 0;
-
-const int CSSM_CERT_PARSE_FORMAT_CUSTOM1 = 1;
-
-const int CSSM_CERT_PARSE_FORMAT_SEXPR1 = 2;
-
-const int CSSM_CERT_PARSE_FORMAT_COMPLEX1 = 3;
-
-const int CSSM_CERT_PARSE_FORMAT_OID_NAMED1 = 4;
-
-const int CSSM_CERT_PARSE_FORMAT_TUPLE1 = 5;
-
-const int CSSM_CERT_PARSE_FORMAT_MULTIPLE1 = 32766;
-
-const int CSSM_CERT_PARSE_FORMAT_LAST1 = 32767;
-
-const int CSSM_CL_CUSTOM_CERT_PARSE_FORMAT1 = 32768;
-
-const int CSSM_CERTGROUP_DATA1 = 0;
-
-const int CSSM_CERTGROUP_ENCODED_CERT1 = 1;
-
-const int CSSM_CERTGROUP_PARSED_CERT1 = 2;
-
-const int CSSM_CERTGROUP_CERT_PAIR1 = 3;
-
-const int CSSM_ACL_SUBJECT_TYPE_ANY1 = 1;
-
-const int CSSM_ACL_SUBJECT_TYPE_THRESHOLD1 = 123;
-
-const int CSSM_ACL_SUBJECT_TYPE_PASSWORD1 = 79;
-
-const int CSSM_ACL_SUBJECT_TYPE_PROTECTED_PASSWORD1 = 87;
-
-const int CSSM_ACL_SUBJECT_TYPE_PROMPTED_PASSWORD1 = 84;
-
-const int CSSM_ACL_SUBJECT_TYPE_PUBLIC_KEY1 = 89;
-
-const int CSSM_ACL_SUBJECT_TYPE_HASHED_SUBJECT1 = 44;
-
-const int CSSM_ACL_SUBJECT_TYPE_BIOMETRIC1 = 8;
-
-const int CSSM_ACL_SUBJECT_TYPE_PROTECTED_BIOMETRIC1 = 86;
-
-const int CSSM_ACL_SUBJECT_TYPE_PROMPTED_BIOMETRIC1 = 83;
-
-const int CSSM_ACL_SUBJECT_TYPE_LOGIN_NAME1 = 58;
-
-const int CSSM_ACL_SUBJECT_TYPE_EXT_PAM_NAME1 = 78;
-
-const int CSSM_ACL_AUTHORIZATION_TAG_VENDOR_DEFINED_START1 = 65536;
-
-const int CSSM_ACL_AUTHORIZATION_ANY1 = 1;
-
-const int CSSM_ACL_AUTHORIZATION_LOGIN1 = 57;
-
-const int CSSM_ACL_AUTHORIZATION_GENKEY1 = 41;
-
-const int CSSM_ACL_AUTHORIZATION_DELETE1 = 25;
-
-const int CSSM_ACL_AUTHORIZATION_EXPORT_WRAPPED1 = 38;
-
-const int CSSM_ACL_AUTHORIZATION_EXPORT_CLEAR1 = 37;
-
-const int CSSM_ACL_AUTHORIZATION_IMPORT_WRAPPED1 = 48;
-
-const int CSSM_ACL_AUTHORIZATION_IMPORT_CLEAR1 = 47;
-
-const int CSSM_ACL_AUTHORIZATION_SIGN1 = 115;
-
-const int CSSM_ACL_AUTHORIZATION_ENCRYPT1 = 35;
-
-const int CSSM_ACL_AUTHORIZATION_DECRYPT1 = 24;
-
-const int CSSM_ACL_AUTHORIZATION_MAC1 = 59;
-
-const int CSSM_ACL_AUTHORIZATION_DERIVE1 = 28;
-
-const int CSSM_ACL_AUTHORIZATION_DBS_CREATE1 = 22;
-
-const int CSSM_ACL_AUTHORIZATION_DBS_DELETE1 = 23;
-
-const int CSSM_ACL_AUTHORIZATION_DB_READ1 = 21;
-
-const int CSSM_ACL_AUTHORIZATION_DB_INSERT1 = 19;
-
-const int CSSM_ACL_AUTHORIZATION_DB_MODIFY1 = 20;
-
-const int CSSM_ACL_AUTHORIZATION_DB_DELETE1 = 17;
-
-const int CSSM_ACL_EDIT_MODE_ADD1 = 1;
-
-const int CSSM_ACL_EDIT_MODE_DELETE1 = 2;
-
-const int CSSM_ACL_EDIT_MODE_REPLACE1 = 3;
-
-const int CSSM_KEYHEADER_VERSION1 = 2;
-
-const int CSSM_KEYBLOB_RAW1 = 0;
-
-const int CSSM_KEYBLOB_REFERENCE1 = 2;
-
-const int CSSM_KEYBLOB_WRAPPED1 = 3;
-
-const int CSSM_KEYBLOB_OTHER1 = -1;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_NONE1 = 0;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_PKCS11 = 1;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_PKCS31 = 2;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_MSCAPI1 = 3;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_PGP1 = 4;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_FIPS1861 = 5;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_BSAFE1 = 6;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_CCA1 = 9;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_PKCS81 = 10;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_SPKI1 = 11;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_OCTET_STRING1 = 12;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_OTHER1 = -1;
-
-const int CSSM_KEYBLOB_WRAPPED_FORMAT_NONE1 = 0;
-
-const int CSSM_KEYBLOB_WRAPPED_FORMAT_PKCS81 = 1;
-
-const int CSSM_KEYBLOB_WRAPPED_FORMAT_PKCS71 = 2;
-
-const int CSSM_KEYBLOB_WRAPPED_FORMAT_MSCAPI1 = 3;
-
-const int CSSM_KEYBLOB_WRAPPED_FORMAT_OTHER1 = -1;
-
-const int CSSM_KEYBLOB_REF_FORMAT_INTEGER1 = 0;
-
-const int CSSM_KEYBLOB_REF_FORMAT_STRING1 = 1;
-
-const int CSSM_KEYBLOB_REF_FORMAT_SPKI1 = 2;
-
-const int CSSM_KEYBLOB_REF_FORMAT_OTHER1 = -1;
-
-const int CSSM_KEYCLASS_PUBLIC_KEY1 = 0;
-
-const int CSSM_KEYCLASS_PRIVATE_KEY1 = 1;
-
-const int CSSM_KEYCLASS_SESSION_KEY1 = 2;
-
-const int CSSM_KEYCLASS_SECRET_PART1 = 3;
-
-const int CSSM_KEYCLASS_OTHER1 = -1;
-
-const int CSSM_KEYATTR_RETURN_DEFAULT1 = 0;
-
-const int CSSM_KEYATTR_RETURN_DATA1 = 268435456;
-
-const int CSSM_KEYATTR_RETURN_REF1 = 536870912;
-
-const int CSSM_KEYATTR_RETURN_NONE1 = 1073741824;
-
-const int CSSM_KEYATTR_PERMANENT1 = 1;
-
-const int CSSM_KEYATTR_PRIVATE1 = 2;
-
-const int CSSM_KEYATTR_MODIFIABLE1 = 4;
-
-const int CSSM_KEYATTR_SENSITIVE1 = 8;
-
-const int CSSM_KEYATTR_EXTRACTABLE1 = 32;
-
-const int CSSM_KEYATTR_ALWAYS_SENSITIVE1 = 16;
-
-const int CSSM_KEYATTR_NEVER_EXTRACTABLE1 = 64;
-
-const int CSSM_KEYUSE_ANY1 = -2147483648;
-
-const int CSSM_KEYUSE_ENCRYPT1 = 1;
-
-const int CSSM_KEYUSE_DECRYPT1 = 2;
-
-const int CSSM_KEYUSE_SIGN1 = 4;
-
-const int CSSM_KEYUSE_VERIFY1 = 8;
-
-const int CSSM_KEYUSE_SIGN_RECOVER1 = 16;
-
-const int CSSM_KEYUSE_VERIFY_RECOVER1 = 32;
-
-const int CSSM_KEYUSE_WRAP1 = 64;
-
-const int CSSM_KEYUSE_UNWRAP1 = 128;
-
-const int CSSM_KEYUSE_DERIVE1 = 256;
-
-const int CSSM_ALGID_NONE1 = 0;
-
-const int CSSM_ALGID_CUSTOM1 = 1;
-
-const int CSSM_ALGID_DH1 = 2;
-
-const int CSSM_ALGID_PH1 = 3;
-
-const int CSSM_ALGID_KEA1 = 4;
-
-const int CSSM_ALGID_MD21 = 5;
-
-const int CSSM_ALGID_MD41 = 6;
-
-const int CSSM_ALGID_MD51 = 7;
-
-const int CSSM_ALGID_SHA11 = 8;
-
-const int CSSM_ALGID_NHASH1 = 9;
-
-const int CSSM_ALGID_HAVAL1 = 10;
-
-const int CSSM_ALGID_RIPEMD1 = 11;
-
-const int CSSM_ALGID_IBCHASH1 = 12;
-
-const int CSSM_ALGID_RIPEMAC1 = 13;
-
-const int CSSM_ALGID_DES1 = 14;
-
-const int CSSM_ALGID_DESX1 = 15;
-
-const int CSSM_ALGID_RDES1 = 16;
-
-const int CSSM_ALGID_3DES_3KEY_EDE1 = 17;
-
-const int CSSM_ALGID_3DES_2KEY_EDE1 = 18;
-
-const int CSSM_ALGID_3DES_1KEY_EEE1 = 19;
-
-const int CSSM_ALGID_3DES_3KEY1 = 17;
-
-const int CSSM_ALGID_3DES_3KEY_EEE1 = 20;
-
-const int CSSM_ALGID_3DES_2KEY1 = 18;
-
-const int CSSM_ALGID_3DES_2KEY_EEE1 = 21;
-
-const int CSSM_ALGID_3DES_1KEY1 = 20;
-
-const int CSSM_ALGID_IDEA1 = 22;
-
-const int CSSM_ALGID_RC21 = 23;
-
-const int CSSM_ALGID_RC51 = 24;
-
-const int CSSM_ALGID_RC41 = 25;
-
-const int CSSM_ALGID_SEAL1 = 26;
-
-const int CSSM_ALGID_CAST1 = 27;
-
-const int CSSM_ALGID_BLOWFISH1 = 28;
-
-const int CSSM_ALGID_SKIPJACK1 = 29;
-
-const int CSSM_ALGID_LUCIFER1 = 30;
-
-const int CSSM_ALGID_MADRYGA1 = 31;
-
-const int CSSM_ALGID_FEAL1 = 32;
-
-const int CSSM_ALGID_REDOC1 = 33;
-
-const int CSSM_ALGID_REDOC31 = 34;
-
-const int CSSM_ALGID_LOKI1 = 35;
-
-const int CSSM_ALGID_KHUFU1 = 36;
-
-const int CSSM_ALGID_KHAFRE1 = 37;
-
-const int CSSM_ALGID_MMB1 = 38;
-
-const int CSSM_ALGID_GOST1 = 39;
-
-const int CSSM_ALGID_SAFER1 = 40;
-
-const int CSSM_ALGID_CRAB1 = 41;
-
-const int CSSM_ALGID_RSA1 = 42;
-
-const int CSSM_ALGID_DSA1 = 43;
-
-const int CSSM_ALGID_MD5WithRSA1 = 44;
-
-const int CSSM_ALGID_MD2WithRSA1 = 45;
-
-const int CSSM_ALGID_ElGamal1 = 46;
-
-const int CSSM_ALGID_MD2Random1 = 47;
-
-const int CSSM_ALGID_MD5Random1 = 48;
-
-const int CSSM_ALGID_SHARandom1 = 49;
-
-const int CSSM_ALGID_DESRandom1 = 50;
-
-const int CSSM_ALGID_SHA1WithRSA1 = 51;
-
-const int CSSM_ALGID_CDMF1 = 52;
-
-const int CSSM_ALGID_CAST31 = 53;
-
-const int CSSM_ALGID_CAST51 = 54;
-
-const int CSSM_ALGID_GenericSecret1 = 55;
-
-const int CSSM_ALGID_ConcatBaseAndKey1 = 56;
-
-const int CSSM_ALGID_ConcatKeyAndBase1 = 57;
-
-const int CSSM_ALGID_ConcatBaseAndData1 = 58;
-
-const int CSSM_ALGID_ConcatDataAndBase1 = 59;
-
-const int CSSM_ALGID_XORBaseAndData1 = 60;
-
-const int CSSM_ALGID_ExtractFromKey1 = 61;
-
-const int CSSM_ALGID_SSL3PrePrimaryGen1 = 62;
-
-const int CSSM_ALGID_SSL3PreMasterGen1 = 62;
-
-const int CSSM_ALGID_SSL3PrimaryDerive1 = 63;
-
-const int CSSM_ALGID_SSL3MasterDerive1 = 63;
-
-const int CSSM_ALGID_SSL3KeyAndMacDerive1 = 64;
-
-const int CSSM_ALGID_SSL3MD5_MAC1 = 65;
-
-const int CSSM_ALGID_SSL3SHA1_MAC1 = 66;
-
-const int CSSM_ALGID_PKCS5_PBKDF1_MD51 = 67;
-
-const int CSSM_ALGID_PKCS5_PBKDF1_MD21 = 68;
-
-const int CSSM_ALGID_PKCS5_PBKDF1_SHA11 = 69;
-
-const int CSSM_ALGID_WrapLynks1 = 70;
-
-const int CSSM_ALGID_WrapSET_OAEP1 = 71;
-
-const int CSSM_ALGID_BATON1 = 72;
-
-const int CSSM_ALGID_ECDSA1 = 73;
-
-const int CSSM_ALGID_MAYFLY1 = 74;
-
-const int CSSM_ALGID_JUNIPER1 = 75;
-
-const int CSSM_ALGID_FASTHASH1 = 76;
-
-const int CSSM_ALGID_3DES1 = 77;
-
-const int CSSM_ALGID_SSL3MD51 = 78;
-
-const int CSSM_ALGID_SSL3SHA11 = 79;
-
-const int CSSM_ALGID_FortezzaTimestamp1 = 80;
-
-const int CSSM_ALGID_SHA1WithDSA1 = 81;
-
-const int CSSM_ALGID_SHA1WithECDSA1 = 82;
-
-const int CSSM_ALGID_DSA_BSAFE1 = 83;
-
-const int CSSM_ALGID_ECDH1 = 84;
-
-const int CSSM_ALGID_ECMQV1 = 85;
-
-const int CSSM_ALGID_PKCS12_SHA1_PBE1 = 86;
-
-const int CSSM_ALGID_ECNRA1 = 87;
-
-const int CSSM_ALGID_SHA1WithECNRA1 = 88;
-
-const int CSSM_ALGID_ECES1 = 89;
-
-const int CSSM_ALGID_ECAES1 = 90;
-
-const int CSSM_ALGID_SHA1HMAC1 = 91;
-
-const int CSSM_ALGID_FIPS186Random1 = 92;
-
-const int CSSM_ALGID_ECC1 = 93;
-
-const int CSSM_ALGID_MQV1 = 94;
-
-const int CSSM_ALGID_NRA1 = 95;
-
-const int CSSM_ALGID_IntelPlatformRandom1 = 96;
-
-const int CSSM_ALGID_UTC1 = 97;
-
-const int CSSM_ALGID_HAVAL31 = 98;
-
-const int CSSM_ALGID_HAVAL41 = 99;
-
-const int CSSM_ALGID_HAVAL51 = 100;
-
-const int CSSM_ALGID_TIGER1 = 101;
-
-const int CSSM_ALGID_MD5HMAC1 = 102;
-
-const int CSSM_ALGID_PKCS5_PBKDF21 = 103;
-
-const int CSSM_ALGID_RUNNING_COUNTER1 = 104;
-
-const int CSSM_ALGID_LAST1 = 2147483647;
-
-const int CSSM_ALGID_VENDOR_DEFINED1 = -2147483648;
-
-const int CSSM_ALGMODE_NONE1 = 0;
-
-const int CSSM_ALGMODE_CUSTOM1 = 1;
-
-const int CSSM_ALGMODE_ECB1 = 2;
-
-const int CSSM_ALGMODE_ECBPad1 = 3;
-
-const int CSSM_ALGMODE_CBC1 = 4;
-
-const int CSSM_ALGMODE_CBC_IV81 = 5;
-
-const int CSSM_ALGMODE_CBCPadIV81 = 6;
-
-const int CSSM_ALGMODE_CFB1 = 7;
-
-const int CSSM_ALGMODE_CFB_IV81 = 8;
-
-const int CSSM_ALGMODE_CFBPadIV81 = 9;
-
-const int CSSM_ALGMODE_OFB1 = 10;
-
-const int CSSM_ALGMODE_OFB_IV81 = 11;
-
-const int CSSM_ALGMODE_OFBPadIV81 = 12;
-
-const int CSSM_ALGMODE_COUNTER1 = 13;
-
-const int CSSM_ALGMODE_BC1 = 14;
-
-const int CSSM_ALGMODE_PCBC1 = 15;
-
-const int CSSM_ALGMODE_CBCC1 = 16;
-
-const int CSSM_ALGMODE_OFBNLF1 = 17;
-
-const int CSSM_ALGMODE_PBC1 = 18;
-
-const int CSSM_ALGMODE_PFB1 = 19;
-
-const int CSSM_ALGMODE_CBCPD1 = 20;
-
-const int CSSM_ALGMODE_PUBLIC_KEY1 = 21;
-
-const int CSSM_ALGMODE_PRIVATE_KEY1 = 22;
-
-const int CSSM_ALGMODE_SHUFFLE1 = 23;
-
-const int CSSM_ALGMODE_ECB641 = 24;
-
-const int CSSM_ALGMODE_CBC641 = 25;
-
-const int CSSM_ALGMODE_OFB641 = 26;
-
-const int CSSM_ALGMODE_CFB321 = 28;
-
-const int CSSM_ALGMODE_CFB161 = 29;
-
-const int CSSM_ALGMODE_CFB81 = 30;
-
-const int CSSM_ALGMODE_WRAP1 = 31;
-
-const int CSSM_ALGMODE_PRIVATE_WRAP1 = 32;
-
-const int CSSM_ALGMODE_RELAYX1 = 33;
-
-const int CSSM_ALGMODE_ECB1281 = 34;
-
-const int CSSM_ALGMODE_ECB961 = 35;
-
-const int CSSM_ALGMODE_CBC1281 = 36;
-
-const int CSSM_ALGMODE_OAEP_HASH1 = 37;
-
-const int CSSM_ALGMODE_PKCS1_EME_V151 = 38;
-
-const int CSSM_ALGMODE_PKCS1_EME_OAEP1 = 39;
-
-const int CSSM_ALGMODE_PKCS1_EMSA_V151 = 40;
-
-const int CSSM_ALGMODE_ISO_97961 = 41;
-
-const int CSSM_ALGMODE_X9_311 = 42;
-
-const int CSSM_ALGMODE_LAST1 = 2147483647;
-
-const int CSSM_ALGMODE_VENDOR_DEFINED1 = -2147483648;
-
-const int CSSM_CSP_SOFTWARE1 = 1;
-
-const int CSSM_CSP_HARDWARE1 = 2;
-
-const int CSSM_CSP_HYBRID1 = 3;
-
-const int CSSM_ALGCLASS_NONE1 = 0;
-
-const int CSSM_ALGCLASS_CUSTOM1 = 1;
-
-const int CSSM_ALGCLASS_SIGNATURE1 = 2;
-
-const int CSSM_ALGCLASS_SYMMETRIC1 = 3;
-
-const int CSSM_ALGCLASS_DIGEST1 = 4;
-
-const int CSSM_ALGCLASS_RANDOMGEN1 = 5;
-
-const int CSSM_ALGCLASS_UNIQUEGEN1 = 6;
-
-const int CSSM_ALGCLASS_MAC1 = 7;
-
-const int CSSM_ALGCLASS_ASYMMETRIC1 = 8;
-
-const int CSSM_ALGCLASS_KEYGEN1 = 9;
-
-const int CSSM_ALGCLASS_DERIVEKEY1 = 10;
-
-const int CSSM_ATTRIBUTE_DATA_NONE1 = 0;
-
-const int CSSM_ATTRIBUTE_DATA_UINT321 = 268435456;
-
-const int CSSM_ATTRIBUTE_DATA_CSSM_DATA1 = 536870912;
-
-const int CSSM_ATTRIBUTE_DATA_CRYPTO_DATA1 = 805306368;
-
-const int CSSM_ATTRIBUTE_DATA_KEY1 = 1073741824;
-
-const int CSSM_ATTRIBUTE_DATA_STRING1 = 1342177280;
-
-const int CSSM_ATTRIBUTE_DATA_DATE1 = 1610612736;
-
-const int CSSM_ATTRIBUTE_DATA_RANGE1 = 1879048192;
-
-const int CSSM_ATTRIBUTE_DATA_ACCESS_CREDENTIALS1 = -2147483648;
-
-const int CSSM_ATTRIBUTE_DATA_VERSION1 = 16777216;
-
-const int CSSM_ATTRIBUTE_DATA_DL_DB_HANDLE1 = 33554432;
-
-const int CSSM_ATTRIBUTE_DATA_KR_PROFILE1 = 50331648;
-
-const int CSSM_ATTRIBUTE_TYPE_MASK1 = -16777216;
-
-const int CSSM_ATTRIBUTE_NONE1 = 0;
-
-const int CSSM_ATTRIBUTE_CUSTOM1 = 536870913;
-
-const int CSSM_ATTRIBUTE_DESCRIPTION1 = 1342177282;
-
-const int CSSM_ATTRIBUTE_KEY1 = 1073741827;
-
-const int CSSM_ATTRIBUTE_INIT_VECTOR1 = 536870916;
-
-const int CSSM_ATTRIBUTE_SALT1 = 536870917;
-
-const int CSSM_ATTRIBUTE_PADDING1 = 268435462;
-
-const int CSSM_ATTRIBUTE_RANDOM1 = 536870919;
-
-const int CSSM_ATTRIBUTE_SEED1 = 805306376;
-
-const int CSSM_ATTRIBUTE_PASSPHRASE1 = 805306377;
-
-const int CSSM_ATTRIBUTE_KEY_LENGTH1 = 268435466;
-
-const int CSSM_ATTRIBUTE_KEY_LENGTH_RANGE1 = 1879048203;
-
-const int CSSM_ATTRIBUTE_BLOCK_SIZE1 = 268435468;
-
-const int CSSM_ATTRIBUTE_OUTPUT_SIZE1 = 268435469;
-
-const int CSSM_ATTRIBUTE_ROUNDS1 = 268435470;
-
-const int CSSM_ATTRIBUTE_IV_SIZE1 = 268435471;
-
-const int CSSM_ATTRIBUTE_ALG_PARAMS1 = 536870928;
-
-const int CSSM_ATTRIBUTE_LABEL1 = 536870929;
-
-const int CSSM_ATTRIBUTE_KEY_TYPE1 = 268435474;
-
-const int CSSM_ATTRIBUTE_MODE1 = 268435475;
-
-const int CSSM_ATTRIBUTE_EFFECTIVE_BITS1 = 268435476;
-
-const int CSSM_ATTRIBUTE_START_DATE1 = 1610612757;
-
-const int CSSM_ATTRIBUTE_END_DATE1 = 1610612758;
-
-const int CSSM_ATTRIBUTE_KEYUSAGE1 = 268435479;
-
-const int CSSM_ATTRIBUTE_KEYATTR1 = 268435480;
-
-const int CSSM_ATTRIBUTE_VERSION1 = 16777241;
-
-const int CSSM_ATTRIBUTE_PRIME1 = 536870938;
-
-const int CSSM_ATTRIBUTE_BASE1 = 536870939;
-
-const int CSSM_ATTRIBUTE_SUBPRIME1 = 536870940;
-
-const int CSSM_ATTRIBUTE_ALG_ID1 = 268435485;
-
-const int CSSM_ATTRIBUTE_ITERATION_COUNT1 = 268435486;
-
-const int CSSM_ATTRIBUTE_ROUNDS_RANGE1 = 1879048223;
-
-const int CSSM_ATTRIBUTE_KRPROFILE_LOCAL1 = 50331680;
-
-const int CSSM_ATTRIBUTE_KRPROFILE_REMOTE1 = 50331681;
-
-const int CSSM_ATTRIBUTE_CSP_HANDLE1 = 268435490;
-
-const int CSSM_ATTRIBUTE_DL_DB_HANDLE1 = 33554467;
-
-const int CSSM_ATTRIBUTE_ACCESS_CREDENTIALS1 = -2147483612;
-
-const int CSSM_ATTRIBUTE_PUBLIC_KEY_FORMAT1 = 268435493;
-
-const int CSSM_ATTRIBUTE_PRIVATE_KEY_FORMAT1 = 268435494;
-
-const int CSSM_ATTRIBUTE_SYMMETRIC_KEY_FORMAT1 = 268435495;
-
-const int CSSM_ATTRIBUTE_WRAPPED_KEY_FORMAT1 = 268435496;
-
-const int CSSM_PADDING_NONE1 = 0;
-
-const int CSSM_PADDING_CUSTOM1 = 1;
-
-const int CSSM_PADDING_ZERO1 = 2;
-
-const int CSSM_PADDING_ONE1 = 3;
-
-const int CSSM_PADDING_ALTERNATE1 = 4;
-
-const int CSSM_PADDING_FF1 = 5;
-
-const int CSSM_PADDING_PKCS51 = 6;
-
-const int CSSM_PADDING_PKCS71 = 7;
-
-const int CSSM_PADDING_CIPHERSTEALING1 = 8;
-
-const int CSSM_PADDING_RANDOM1 = 9;
-
-const int CSSM_PADDING_PKCS11 = 10;
-
-const int CSSM_PADDING_SIGRAW1 = 11;
-
-const int CSSM_PADDING_VENDOR_DEFINED1 = -2147483648;
-
-const int CSSM_CSP_TOK_RNG1 = 1;
-
-const int CSSM_CSP_TOK_CLOCK_EXISTS1 = 64;
-
-const int CSSM_CSP_RDR_TOKENPRESENT1 = 1;
-
-const int CSSM_CSP_RDR_EXISTS1 = 2;
-
-const int CSSM_CSP_RDR_HW1 = 4;
-
-const int CSSM_CSP_TOK_WRITE_PROTECTED1 = 2;
-
-const int CSSM_CSP_TOK_LOGIN_REQUIRED1 = 4;
-
-const int CSSM_CSP_TOK_USER_PIN_INITIALIZED1 = 8;
-
-const int CSSM_CSP_TOK_PROT_AUTHENTICATION1 = 256;
-
-const int CSSM_CSP_TOK_USER_PIN_EXPIRED1 = 1048576;
-
-const int CSSM_CSP_TOK_SESSION_KEY_PASSWORD1 = 2097152;
-
-const int CSSM_CSP_TOK_PRIVATE_KEY_PASSWORD1 = 4194304;
-
-const int CSSM_CSP_STORES_PRIVATE_KEYS1 = 16777216;
-
-const int CSSM_CSP_STORES_PUBLIC_KEYS1 = 33554432;
-
-const int CSSM_CSP_STORES_SESSION_KEYS1 = 67108864;
-
-const int CSSM_CSP_STORES_CERTIFICATES1 = 134217728;
-
-const int CSSM_CSP_STORES_GENERIC1 = 268435456;
-
-const int CSSM_PKCS_OAEP_MGF_NONE1 = 0;
-
-const int CSSM_PKCS_OAEP_MGF1_SHA11 = 1;
-
-const int CSSM_PKCS_OAEP_MGF1_MD51 = 2;
-
-const int CSSM_PKCS_OAEP_PSOURCE_NONE1 = 0;
-
-const int CSSM_PKCS_OAEP_PSOURCE_Pspecified1 = 1;
-
-const int CSSM_VALUE_NOT_AVAILABLE1 = -1;
-
-const int CSSM_PKCS5_PBKDF2_PRF_HMAC_SHA11 = 0;
-
-const int CSSM_TP_AUTHORITY_REQUEST_CERTISSUE1 = 1;
-
-const int CSSM_TP_AUTHORITY_REQUEST_CERTREVOKE1 = 2;
-
-const int CSSM_TP_AUTHORITY_REQUEST_CERTSUSPEND1 = 3;
-
-const int CSSM_TP_AUTHORITY_REQUEST_CERTRESUME1 = 4;
-
-const int CSSM_TP_AUTHORITY_REQUEST_CERTVERIFY1 = 5;
-
-const int CSSM_TP_AUTHORITY_REQUEST_CERTNOTARIZE1 = 6;
-
-const int CSSM_TP_AUTHORITY_REQUEST_CERTUSERECOVER1 = 7;
-
-const int CSSM_TP_AUTHORITY_REQUEST_CRLISSUE1 = 256;
-
-const int CSSM_TP_KEY_ARCHIVE1 = 1;
-
-const int CSSM_TP_CERT_PUBLISH1 = 2;
-
-const int CSSM_TP_CERT_NOTIFY_RENEW1 = 4;
-
-const int CSSM_TP_CERT_DIR_UPDATE1 = 8;
-
-const int CSSM_TP_CRL_DISTRIBUTE1 = 16;
-
-const int CSSM_TP_ACTION_DEFAULT1 = 0;
-
-const int CSSM_TP_STOP_ON_POLICY1 = 0;
-
-const int CSSM_TP_STOP_ON_NONE1 = 1;
-
-const int CSSM_TP_STOP_ON_FIRST_PASS1 = 2;
-
-const int CSSM_TP_STOP_ON_FIRST_FAIL1 = 3;
-
-const int CSSM_CRL_PARSE_FORMAT_NONE1 = 0;
-
-const int CSSM_CRL_PARSE_FORMAT_CUSTOM1 = 1;
-
-const int CSSM_CRL_PARSE_FORMAT_SEXPR1 = 2;
-
-const int CSSM_CRL_PARSE_FORMAT_COMPLEX1 = 3;
-
-const int CSSM_CRL_PARSE_FORMAT_OID_NAMED1 = 4;
-
-const int CSSM_CRL_PARSE_FORMAT_TUPLE1 = 5;
-
-const int CSSM_CRL_PARSE_FORMAT_MULTIPLE1 = 32766;
-
-const int CSSM_CRL_PARSE_FORMAT_LAST1 = 32767;
-
-const int CSSM_CL_CUSTOM_CRL_PARSE_FORMAT1 = 32768;
-
-const int CSSM_CRL_TYPE_UNKNOWN1 = 0;
-
-const int CSSM_CRL_TYPE_X_509v11 = 1;
-
-const int CSSM_CRL_TYPE_X_509v21 = 2;
-
-const int CSSM_CRL_TYPE_SPKI1 = 3;
-
-const int CSSM_CRL_TYPE_MULTIPLE1 = 32766;
-
-const int CSSM_CRL_ENCODING_UNKNOWN1 = 0;
-
-const int CSSM_CRL_ENCODING_CUSTOM1 = 1;
-
-const int CSSM_CRL_ENCODING_BER1 = 2;
-
-const int CSSM_CRL_ENCODING_DER1 = 3;
-
-const int CSSM_CRL_ENCODING_BLOOM1 = 4;
-
-const int CSSM_CRL_ENCODING_SEXPR1 = 5;
-
-const int CSSM_CRL_ENCODING_MULTIPLE1 = 32766;
-
-const int CSSM_CRLGROUP_DATA1 = 0;
-
-const int CSSM_CRLGROUP_ENCODED_CRL1 = 1;
-
-const int CSSM_CRLGROUP_PARSED_CRL1 = 2;
-
-const int CSSM_CRLGROUP_CRL_PAIR1 = 3;
-
-const int CSSM_EVIDENCE_FORM_UNSPECIFIC1 = 0;
-
-const int CSSM_EVIDENCE_FORM_CERT1 = 1;
-
-const int CSSM_EVIDENCE_FORM_CRL1 = 2;
-
-const int CSSM_EVIDENCE_FORM_CERT_ID1 = 3;
-
-const int CSSM_EVIDENCE_FORM_CRL_ID1 = 4;
-
-const int CSSM_EVIDENCE_FORM_VERIFIER_TIME1 = 5;
-
-const int CSSM_EVIDENCE_FORM_CRL_THISTIME1 = 6;
-
-const int CSSM_EVIDENCE_FORM_CRL_NEXTTIME1 = 7;
-
-const int CSSM_EVIDENCE_FORM_POLICYINFO1 = 8;
-
-const int CSSM_EVIDENCE_FORM_TUPLEGROUP1 = 9;
-
-const int CSSM_TP_CONFIRM_STATUS_UNKNOWN1 = 0;
-
-const int CSSM_TP_CONFIRM_ACCEPT1 = 1;
-
-const int CSSM_TP_CONFIRM_REJECT1 = 2;
-
-const int CSSM_ESTIMATED_TIME_UNKNOWN1 = -1;
-
-const int CSSM_ELAPSED_TIME_UNKNOWN1 = -1;
-
-const int CSSM_ELAPSED_TIME_COMPLETE1 = -2;
-
-const int CSSM_TP_CERTISSUE_STATUS_UNKNOWN1 = 0;
-
-const int CSSM_TP_CERTISSUE_OK1 = 1;
-
-const int CSSM_TP_CERTISSUE_OKWITHCERTMODS1 = 2;
-
-const int CSSM_TP_CERTISSUE_OKWITHSERVICEMODS1 = 3;
-
-const int CSSM_TP_CERTISSUE_REJECTED1 = 4;
-
-const int CSSM_TP_CERTISSUE_NOT_AUTHORIZED1 = 5;
-
-const int CSSM_TP_CERTISSUE_WILL_BE_REVOKED1 = 6;
-
-const int CSSM_TP_CERTCHANGE_NONE1 = 0;
-
-const int CSSM_TP_CERTCHANGE_REVOKE1 = 1;
-
-const int CSSM_TP_CERTCHANGE_HOLD1 = 2;
-
-const int CSSM_TP_CERTCHANGE_RELEASE1 = 3;
-
-const int CSSM_TP_CERTCHANGE_REASON_UNKNOWN1 = 0;
-
-const int CSSM_TP_CERTCHANGE_REASON_KEYCOMPROMISE1 = 1;
-
-const int CSSM_TP_CERTCHANGE_REASON_CACOMPROMISE1 = 2;
-
-const int CSSM_TP_CERTCHANGE_REASON_CEASEOPERATION1 = 3;
-
-const int CSSM_TP_CERTCHANGE_REASON_AFFILIATIONCHANGE1 = 4;
-
-const int CSSM_TP_CERTCHANGE_REASON_SUPERCEDED1 = 5;
-
-const int CSSM_TP_CERTCHANGE_REASON_SUSPECTEDCOMPROMISE1 = 6;
-
-const int CSSM_TP_CERTCHANGE_REASON_HOLDRELEASE1 = 7;
-
-const int CSSM_TP_CERTCHANGE_STATUS_UNKNOWN1 = 0;
-
-const int CSSM_TP_CERTCHANGE_OK1 = 1;
-
-const int CSSM_TP_CERTCHANGE_OKWITHNEWTIME1 = 2;
-
-const int CSSM_TP_CERTCHANGE_WRONGCA1 = 3;
-
-const int CSSM_TP_CERTCHANGE_REJECTED1 = 4;
-
-const int CSSM_TP_CERTCHANGE_NOT_AUTHORIZED1 = 5;
-
-const int CSSM_TP_CERTVERIFY_UNKNOWN1 = 0;
-
-const int CSSM_TP_CERTVERIFY_VALID1 = 1;
-
-const int CSSM_TP_CERTVERIFY_INVALID1 = 2;
-
-const int CSSM_TP_CERTVERIFY_REVOKED1 = 3;
-
-const int CSSM_TP_CERTVERIFY_SUSPENDED1 = 4;
-
-const int CSSM_TP_CERTVERIFY_EXPIRED1 = 5;
-
-const int CSSM_TP_CERTVERIFY_NOT_VALID_YET1 = 6;
-
-const int CSSM_TP_CERTVERIFY_INVALID_AUTHORITY1 = 7;
-
-const int CSSM_TP_CERTVERIFY_INVALID_SIGNATURE1 = 8;
-
-const int CSSM_TP_CERTVERIFY_INVALID_CERT_VALUE1 = 9;
-
-const int CSSM_TP_CERTVERIFY_INVALID_CERTGROUP1 = 10;
-
-const int CSSM_TP_CERTVERIFY_INVALID_POLICY1 = 11;
-
-const int CSSM_TP_CERTVERIFY_INVALID_POLICY_IDS1 = 12;
-
-const int CSSM_TP_CERTVERIFY_INVALID_BASIC_CONSTRAINTS1 = 13;
-
-const int CSSM_TP_CERTVERIFY_INVALID_CRL_DIST_PT1 = 14;
-
-const int CSSM_TP_CERTVERIFY_INVALID_NAME_TREE1 = 15;
-
-const int CSSM_TP_CERTVERIFY_UNKNOWN_CRITICAL_EXT1 = 16;
-
-const int CSSM_TP_CERTNOTARIZE_STATUS_UNKNOWN1 = 0;
-
-const int CSSM_TP_CERTNOTARIZE_OK1 = 1;
-
-const int CSSM_TP_CERTNOTARIZE_OKWITHOUTFIELDS1 = 2;
-
-const int CSSM_TP_CERTNOTARIZE_OKWITHSERVICEMODS1 = 3;
-
-const int CSSM_TP_CERTNOTARIZE_REJECTED1 = 4;
-
-const int CSSM_TP_CERTNOTARIZE_NOT_AUTHORIZED1 = 5;
-
-const int CSSM_TP_CERTRECLAIM_STATUS_UNKNOWN1 = 0;
-
-const int CSSM_TP_CERTRECLAIM_OK1 = 1;
-
-const int CSSM_TP_CERTRECLAIM_NOMATCH1 = 2;
-
-const int CSSM_TP_CERTRECLAIM_REJECTED1 = 3;
-
-const int CSSM_TP_CERTRECLAIM_NOT_AUTHORIZED1 = 4;
-
-const int CSSM_TP_CRLISSUE_STATUS_UNKNOWN1 = 0;
-
-const int CSSM_TP_CRLISSUE_OK1 = 1;
-
-const int CSSM_TP_CRLISSUE_NOT_CURRENT1 = 2;
-
-const int CSSM_TP_CRLISSUE_INVALID_DOMAIN1 = 3;
-
-const int CSSM_TP_CRLISSUE_UNKNOWN_IDENTIFIER1 = 4;
-
-const int CSSM_TP_CRLISSUE_REJECTED1 = 5;
-
-const int CSSM_TP_CRLISSUE_NOT_AUTHORIZED1 = 6;
-
-const int CSSM_TP_FORM_TYPE_GENERIC1 = 0;
-
-const int CSSM_TP_FORM_TYPE_REGISTRATION1 = 1;
-
-const int CSSM_CL_TEMPLATE_INTERMEDIATE_CERT1 = 1;
-
-const int CSSM_CL_TEMPLATE_PKIX_CERTTEMPLATE1 = 2;
-
-const int CSSM_CERT_BUNDLE_UNKNOWN1 = 0;
-
-const int CSSM_CERT_BUNDLE_CUSTOM1 = 1;
-
-const int CSSM_CERT_BUNDLE_PKCS7_SIGNED_DATA1 = 2;
-
-const int CSSM_CERT_BUNDLE_PKCS7_SIGNED_ENVELOPED_DATA1 = 3;
-
-const int CSSM_CERT_BUNDLE_PKCS121 = 4;
-
-const int CSSM_CERT_BUNDLE_PFX1 = 5;
-
-const int CSSM_CERT_BUNDLE_SPKI_SEQUENCE1 = 6;
-
-const int CSSM_CERT_BUNDLE_PGP_KEYRING1 = 7;
-
-const int CSSM_CERT_BUNDLE_LAST1 = 32767;
-
-const int CSSM_CL_CUSTOM_CERT_BUNDLE_TYPE1 = 32768;
-
-const int CSSM_CERT_BUNDLE_ENCODING_UNKNOWN1 = 0;
-
-const int CSSM_CERT_BUNDLE_ENCODING_CUSTOM1 = 1;
-
-const int CSSM_CERT_BUNDLE_ENCODING_BER1 = 2;
-
-const int CSSM_CERT_BUNDLE_ENCODING_DER1 = 3;
-
-const int CSSM_CERT_BUNDLE_ENCODING_SEXPR1 = 4;
-
-const int CSSM_CERT_BUNDLE_ENCODING_PGP1 = 5;
-
-const int CSSM_FIELDVALUE_COMPLEX_DATA_TYPE1 = -1;
-
-const int CSSM_DB_ATTRIBUTE_NAME_AS_STRING1 = 0;
-
-const int CSSM_DB_ATTRIBUTE_NAME_AS_OID1 = 1;
-
-const int CSSM_DB_ATTRIBUTE_NAME_AS_INTEGER1 = 2;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_STRING1 = 0;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_SINT321 = 1;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_UINT321 = 2;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_BIG_NUM1 = 3;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_REAL1 = 4;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_TIME_DATE1 = 5;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_BLOB1 = 6;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_MULTI_UINT321 = 7;
-
-const int CSSM_DB_ATTRIBUTE_FORMAT_COMPLEX1 = 8;
-
-const int CSSM_DB_RECORDTYPE_SCHEMA_START1 = 0;
-
-const int CSSM_DB_RECORDTYPE_SCHEMA_END1 = 4;
-
-const int CSSM_DB_RECORDTYPE_OPEN_GROUP_START1 = 10;
-
-const int CSSM_DB_RECORDTYPE_OPEN_GROUP_END1 = 18;
-
-const int CSSM_DB_RECORDTYPE_APP_DEFINED_START1 = -2147483648;
-
-const int CSSM_DB_RECORDTYPE_APP_DEFINED_END1 = -1;
-
-const int CSSM_DL_DB_SCHEMA_INFO1 = 0;
-
-const int CSSM_DL_DB_SCHEMA_INDEXES1 = 1;
-
-const int CSSM_DL_DB_SCHEMA_ATTRIBUTES1 = 2;
-
-const int CSSM_DL_DB_SCHEMA_PARSING_MODULE1 = 3;
-
-const int CSSM_DL_DB_RECORD_ANY1 = 10;
-
-const int CSSM_DL_DB_RECORD_CERT1 = 11;
-
-const int CSSM_DL_DB_RECORD_CRL1 = 12;
-
-const int CSSM_DL_DB_RECORD_POLICY1 = 13;
-
-const int CSSM_DL_DB_RECORD_GENERIC1 = 14;
-
-const int CSSM_DL_DB_RECORD_PUBLIC_KEY1 = 15;
-
-const int CSSM_DL_DB_RECORD_PRIVATE_KEY1 = 16;
-
-const int CSSM_DL_DB_RECORD_SYMMETRIC_KEY1 = 17;
-
-const int CSSM_DL_DB_RECORD_ALL_KEYS1 = 18;
-
-const int CSSM_DB_CERT_USE_TRUSTED1 = 1;
-
-const int CSSM_DB_CERT_USE_SYSTEM1 = 2;
-
-const int CSSM_DB_CERT_USE_OWNER1 = 4;
-
-const int CSSM_DB_CERT_USE_REVOKED1 = 8;
-
-const int CSSM_DB_CERT_USE_SIGNING1 = 16;
-
-const int CSSM_DB_CERT_USE_PRIVACY1 = 32;
-
-const int CSSM_DB_INDEX_UNIQUE1 = 0;
-
-const int CSSM_DB_INDEX_NONUNIQUE1 = 1;
-
-const int CSSM_DB_INDEX_ON_UNKNOWN1 = 0;
-
-const int CSSM_DB_INDEX_ON_ATTRIBUTE1 = 1;
-
-const int CSSM_DB_INDEX_ON_RECORD1 = 2;
-
-const int CSSM_DB_ACCESS_READ1 = 1;
-
-const int CSSM_DB_ACCESS_WRITE1 = 2;
-
-const int CSSM_DB_ACCESS_PRIVILEGED1 = 4;
-
-const int CSSM_DB_MODIFY_ATTRIBUTE_NONE1 = 0;
-
-const int CSSM_DB_MODIFY_ATTRIBUTE_ADD1 = 1;
-
-const int CSSM_DB_MODIFY_ATTRIBUTE_DELETE1 = 2;
-
-const int CSSM_DB_MODIFY_ATTRIBUTE_REPLACE1 = 3;
-
-const int CSSM_DB_EQUAL1 = 0;
-
-const int CSSM_DB_NOT_EQUAL1 = 1;
-
-const int CSSM_DB_LESS_THAN1 = 2;
-
-const int CSSM_DB_GREATER_THAN1 = 3;
-
-const int CSSM_DB_CONTAINS1 = 4;
-
-const int CSSM_DB_CONTAINS_INITIAL_SUBSTRING1 = 5;
-
-const int CSSM_DB_CONTAINS_FINAL_SUBSTRING1 = 6;
-
-const int CSSM_DB_NONE1 = 0;
-
-const int CSSM_DB_AND1 = 1;
-
-const int CSSM_DB_OR1 = 2;
-
-const int CSSM_QUERY_TIMELIMIT_NONE1 = 0;
-
-const int CSSM_QUERY_SIZELIMIT_NONE1 = 0;
-
-const int CSSM_QUERY_RETURN_DATA1 = 1;
-
-const int CSSM_DL_UNKNOWN1 = 0;
-
-const int CSSM_DL_CUSTOM1 = 1;
-
-const int CSSM_DL_LDAP1 = 2;
-
-const int CSSM_DL_ODBC1 = 3;
-
-const int CSSM_DL_PKCS111 = 4;
-
-const int CSSM_DL_FFS1 = 5;
-
-const int CSSM_DL_MEMORY1 = 6;
-
-const int CSSM_DL_REMOTEDIR1 = 7;
-
-const int CSSM_DB_DATASTORES_UNKNOWN1 = -1;
-
-const int CSSM_DB_TRANSACTIONAL_MODE1 = 0;
-
-const int CSSM_DB_FILESYSTEMSCAN_MODE1 = 1;
-
-const int CSSM_BASE_ERROR1 = -2147418112;
-
-const int CSSM_ERRORCODE_MODULE_EXTENT1 = 2048;
-
-const int CSSM_ERRORCODE_CUSTOM_OFFSET1 = 1024;
-
-const int CSSM_ERRORCODE_COMMON_EXTENT1 = 256;
-
-const int CSSM_CSSM_BASE_ERROR1 = -2147418112;
-
-const int CSSM_CSSM_PRIVATE_ERROR1 = -2147417088;
-
-const int CSSM_CSP_BASE_ERROR1 = -2147416064;
-
-const int CSSM_CSP_PRIVATE_ERROR1 = -2147415040;
-
-const int CSSM_DL_BASE_ERROR1 = -2147414016;
-
-const int CSSM_DL_PRIVATE_ERROR1 = -2147412992;
-
-const int CSSM_CL_BASE_ERROR1 = -2147411968;
-
-const int CSSM_CL_PRIVATE_ERROR1 = -2147410944;
-
-const int CSSM_TP_BASE_ERROR1 = -2147409920;
-
-const int CSSM_TP_PRIVATE_ERROR1 = -2147408896;
-
-const int CSSM_KR_BASE_ERROR1 = -2147407872;
-
-const int CSSM_KR_PRIVATE_ERROR1 = -2147406848;
-
-const int CSSM_AC_BASE_ERROR1 = -2147405824;
-
-const int CSSM_AC_PRIVATE_ERROR1 = -2147404800;
-
-const int CSSM_MDS_BASE_ERROR1 = -2147414016;
-
-const int CSSM_MDS_PRIVATE_ERROR1 = -2147412992;
-
-const int CSSMERR_CSSM_INVALID_ADDIN_HANDLE1 = -2147417855;
-
-const int CSSMERR_CSSM_NOT_INITIALIZED1 = -2147417854;
-
-const int CSSMERR_CSSM_INVALID_HANDLE_USAGE1 = -2147417853;
-
-const int CSSMERR_CSSM_PVC_REFERENT_NOT_FOUND1 = -2147417852;
-
-const int CSSMERR_CSSM_FUNCTION_INTEGRITY_FAIL1 = -2147417851;
-
-const int CSSM_ERRCODE_INTERNAL_ERROR1 = 1;
-
-const int CSSM_ERRCODE_MEMORY_ERROR1 = 2;
-
-const int CSSM_ERRCODE_MDS_ERROR1 = 3;
-
-const int CSSM_ERRCODE_INVALID_POINTER1 = 4;
-
-const int CSSM_ERRCODE_INVALID_INPUT_POINTER1 = 5;
-
-const int CSSM_ERRCODE_INVALID_OUTPUT_POINTER1 = 6;
-
-const int CSSM_ERRCODE_FUNCTION_NOT_IMPLEMENTED1 = 7;
-
-const int CSSM_ERRCODE_SELF_CHECK_FAILED1 = 8;
-
-const int CSSM_ERRCODE_OS_ACCESS_DENIED1 = 9;
-
-const int CSSM_ERRCODE_FUNCTION_FAILED1 = 10;
-
-const int CSSM_ERRCODE_MODULE_MANIFEST_VERIFY_FAILED1 = 11;
-
-const int CSSM_ERRCODE_INVALID_GUID1 = 12;
-
-const int CSSM_ERRCODE_OPERATION_AUTH_DENIED1 = 32;
-
-const int CSSM_ERRCODE_OBJECT_USE_AUTH_DENIED1 = 33;
-
-const int CSSM_ERRCODE_OBJECT_MANIP_AUTH_DENIED1 = 34;
-
-const int CSSM_ERRCODE_OBJECT_ACL_NOT_SUPPORTED1 = 35;
-
-const int CSSM_ERRCODE_OBJECT_ACL_REQUIRED1 = 36;
-
-const int CSSM_ERRCODE_INVALID_ACCESS_CREDENTIALS1 = 37;
-
-const int CSSM_ERRCODE_INVALID_ACL_BASE_CERTS1 = 38;
-
-const int CSSM_ERRCODE_ACL_BASE_CERTS_NOT_SUPPORTED1 = 39;
-
-const int CSSM_ERRCODE_INVALID_SAMPLE_VALUE1 = 40;
-
-const int CSSM_ERRCODE_SAMPLE_VALUE_NOT_SUPPORTED1 = 41;
-
-const int CSSM_ERRCODE_INVALID_ACL_SUBJECT_VALUE1 = 42;
-
-const int CSSM_ERRCODE_ACL_SUBJECT_TYPE_NOT_SUPPORTED1 = 43;
-
-const int CSSM_ERRCODE_INVALID_ACL_CHALLENGE_CALLBACK1 = 44;
-
-const int CSSM_ERRCODE_ACL_CHALLENGE_CALLBACK_FAILED1 = 45;
-
-const int CSSM_ERRCODE_INVALID_ACL_ENTRY_TAG1 = 46;
-
-const int CSSM_ERRCODE_ACL_ENTRY_TAG_NOT_FOUND1 = 47;
-
-const int CSSM_ERRCODE_INVALID_ACL_EDIT_MODE1 = 48;
-
-const int CSSM_ERRCODE_ACL_CHANGE_FAILED1 = 49;
-
-const int CSSM_ERRCODE_INVALID_NEW_ACL_ENTRY1 = 50;
-
-const int CSSM_ERRCODE_INVALID_NEW_ACL_OWNER1 = 51;
-
-const int CSSM_ERRCODE_ACL_DELETE_FAILED1 = 52;
-
-const int CSSM_ERRCODE_ACL_REPLACE_FAILED1 = 53;
-
-const int CSSM_ERRCODE_ACL_ADD_FAILED1 = 54;
-
-const int CSSM_ERRCODE_INVALID_CONTEXT_HANDLE1 = 64;
-
-const int CSSM_ERRCODE_INCOMPATIBLE_VERSION1 = 65;
-
-const int CSSM_ERRCODE_INVALID_CERTGROUP_POINTER1 = 66;
-
-const int CSSM_ERRCODE_INVALID_CERT_POINTER1 = 67;
-
-const int CSSM_ERRCODE_INVALID_CRL_POINTER1 = 68;
-
-const int CSSM_ERRCODE_INVALID_FIELD_POINTER1 = 69;
-
-const int CSSM_ERRCODE_INVALID_DATA1 = 70;
-
-const int CSSM_ERRCODE_CRL_ALREADY_SIGNED1 = 71;
-
-const int CSSM_ERRCODE_INVALID_NUMBER_OF_FIELDS1 = 72;
-
-const int CSSM_ERRCODE_VERIFICATION_FAILURE1 = 73;
-
-const int CSSM_ERRCODE_INVALID_DB_HANDLE1 = 74;
-
-const int CSSM_ERRCODE_PRIVILEGE_NOT_GRANTED1 = 75;
-
-const int CSSM_ERRCODE_INVALID_DB_LIST1 = 76;
-
-const int CSSM_ERRCODE_INVALID_DB_LIST_POINTER1 = 77;
-
-const int CSSM_ERRCODE_UNKNOWN_FORMAT1 = 78;
-
-const int CSSM_ERRCODE_UNKNOWN_TAG1 = 79;
-
-const int CSSM_ERRCODE_INVALID_CSP_HANDLE1 = 80;
-
-const int CSSM_ERRCODE_INVALID_DL_HANDLE1 = 81;
-
-const int CSSM_ERRCODE_INVALID_CL_HANDLE1 = 82;
-
-const int CSSM_ERRCODE_INVALID_TP_HANDLE1 = 83;
-
-const int CSSM_ERRCODE_INVALID_KR_HANDLE1 = 84;
-
-const int CSSM_ERRCODE_INVALID_AC_HANDLE1 = 85;
-
-const int CSSM_ERRCODE_INVALID_PASSTHROUGH_ID1 = 86;
-
-const int CSSM_ERRCODE_INVALID_NETWORK_ADDR1 = 87;
-
-const int CSSM_ERRCODE_INVALID_CRYPTO_DATA1 = 88;
-
-const int CSSMERR_CSSM_INTERNAL_ERROR1 = -2147418111;
-
-const int CSSMERR_CSSM_MEMORY_ERROR1 = -2147418110;
-
-const int CSSMERR_CSSM_MDS_ERROR1 = -2147418109;
-
-const int CSSMERR_CSSM_INVALID_POINTER1 = -2147418108;
-
-const int CSSMERR_CSSM_INVALID_INPUT_POINTER1 = -2147418107;
-
-const int CSSMERR_CSSM_INVALID_OUTPUT_POINTER1 = -2147418106;
-
-const int CSSMERR_CSSM_FUNCTION_NOT_IMPLEMENTED1 = -2147418105;
-
-const int CSSMERR_CSSM_SELF_CHECK_FAILED1 = -2147418104;
-
-const int CSSMERR_CSSM_OS_ACCESS_DENIED1 = -2147418103;
-
-const int CSSMERR_CSSM_FUNCTION_FAILED1 = -2147418102;
-
-const int CSSMERR_CSSM_MODULE_MANIFEST_VERIFY_FAILED1 = -2147418101;
-
-const int CSSMERR_CSSM_INVALID_GUID1 = -2147418100;
-
-const int CSSMERR_CSSM_INVALID_CONTEXT_HANDLE1 = -2147418048;
-
-const int CSSMERR_CSSM_INCOMPATIBLE_VERSION1 = -2147418047;
-
-const int CSSMERR_CSSM_PRIVILEGE_NOT_GRANTED1 = -2147418037;
-
-const int CSSM_CSSM_BASE_CSSM_ERROR1 = -2147417840;
-
-const int CSSMERR_CSSM_SCOPE_NOT_SUPPORTED1 = -2147417839;
-
-const int CSSMERR_CSSM_PVC_ALREADY_CONFIGURED1 = -2147417838;
-
-const int CSSMERR_CSSM_INVALID_PVC1 = -2147417837;
-
-const int CSSMERR_CSSM_EMM_LOAD_FAILED1 = -2147417836;
-
-const int CSSMERR_CSSM_EMM_UNLOAD_FAILED1 = -2147417835;
-
-const int CSSMERR_CSSM_ADDIN_LOAD_FAILED1 = -2147417834;
-
-const int CSSMERR_CSSM_INVALID_KEY_HIERARCHY1 = -2147417833;
-
-const int CSSMERR_CSSM_ADDIN_UNLOAD_FAILED1 = -2147417832;
-
-const int CSSMERR_CSSM_LIB_REF_NOT_FOUND1 = -2147417831;
-
-const int CSSMERR_CSSM_INVALID_ADDIN_FUNCTION_TABLE1 = -2147417830;
-
-const int CSSMERR_CSSM_EMM_AUTHENTICATE_FAILED1 = -2147417829;
-
-const int CSSMERR_CSSM_ADDIN_AUTHENTICATE_FAILED1 = -2147417828;
-
-const int CSSMERR_CSSM_INVALID_SERVICE_MASK1 = -2147417827;
-
-const int CSSMERR_CSSM_MODULE_NOT_LOADED1 = -2147417826;
-
-const int CSSMERR_CSSM_INVALID_SUBSERVICEID1 = -2147417825;
-
-const int CSSMERR_CSSM_BUFFER_TOO_SMALL1 = -2147417824;
-
-const int CSSMERR_CSSM_INVALID_ATTRIBUTE1 = -2147417823;
-
-const int CSSMERR_CSSM_ATTRIBUTE_NOT_IN_CONTEXT1 = -2147417822;
-
-const int CSSMERR_CSSM_MODULE_MANAGER_INITIALIZE_FAIL1 = -2147417821;
-
-const int CSSMERR_CSSM_MODULE_MANAGER_NOT_FOUND1 = -2147417820;
-
-const int CSSMERR_CSSM_EVENT_NOTIFICATION_CALLBACK_NOT_FOUND1 = -2147417819;
-
-const int CSSMERR_CSP_INTERNAL_ERROR1 = -2147416063;
-
-const int CSSMERR_CSP_MEMORY_ERROR1 = -2147416062;
-
-const int CSSMERR_CSP_MDS_ERROR1 = -2147416061;
-
-const int CSSMERR_CSP_INVALID_POINTER1 = -2147416060;
-
-const int CSSMERR_CSP_INVALID_INPUT_POINTER1 = -2147416059;
-
-const int CSSMERR_CSP_INVALID_OUTPUT_POINTER1 = -2147416058;
-
-const int CSSMERR_CSP_FUNCTION_NOT_IMPLEMENTED1 = -2147416057;
-
-const int CSSMERR_CSP_SELF_CHECK_FAILED1 = -2147416056;
-
-const int CSSMERR_CSP_OS_ACCESS_DENIED1 = -2147416055;
-
-const int CSSMERR_CSP_FUNCTION_FAILED1 = -2147416054;
-
-const int CSSMERR_CSP_OPERATION_AUTH_DENIED1 = -2147416032;
-
-const int CSSMERR_CSP_OBJECT_USE_AUTH_DENIED1 = -2147416031;
-
-const int CSSMERR_CSP_OBJECT_MANIP_AUTH_DENIED1 = -2147416030;
-
-const int CSSMERR_CSP_OBJECT_ACL_NOT_SUPPORTED1 = -2147416029;
-
-const int CSSMERR_CSP_OBJECT_ACL_REQUIRED1 = -2147416028;
-
-const int CSSMERR_CSP_INVALID_ACCESS_CREDENTIALS1 = -2147416027;
-
-const int CSSMERR_CSP_INVALID_ACL_BASE_CERTS1 = -2147416026;
-
-const int CSSMERR_CSP_ACL_BASE_CERTS_NOT_SUPPORTED1 = -2147416025;
-
-const int CSSMERR_CSP_INVALID_SAMPLE_VALUE1 = -2147416024;
-
-const int CSSMERR_CSP_SAMPLE_VALUE_NOT_SUPPORTED1 = -2147416023;
-
-const int CSSMERR_CSP_INVALID_ACL_SUBJECT_VALUE1 = -2147416022;
-
-const int CSSMERR_CSP_ACL_SUBJECT_TYPE_NOT_SUPPORTED1 = -2147416021;
-
-const int CSSMERR_CSP_INVALID_ACL_CHALLENGE_CALLBACK1 = -2147416020;
-
-const int CSSMERR_CSP_ACL_CHALLENGE_CALLBACK_FAILED1 = -2147416019;
-
-const int CSSMERR_CSP_INVALID_ACL_ENTRY_TAG1 = -2147416018;
-
-const int CSSMERR_CSP_ACL_ENTRY_TAG_NOT_FOUND1 = -2147416017;
-
-const int CSSMERR_CSP_INVALID_ACL_EDIT_MODE1 = -2147416016;
-
-const int CSSMERR_CSP_ACL_CHANGE_FAILED1 = -2147416015;
-
-const int CSSMERR_CSP_INVALID_NEW_ACL_ENTRY1 = -2147416014;
-
-const int CSSMERR_CSP_INVALID_NEW_ACL_OWNER1 = -2147416013;
-
-const int CSSMERR_CSP_ACL_DELETE_FAILED1 = -2147416012;
-
-const int CSSMERR_CSP_ACL_REPLACE_FAILED1 = -2147416011;
-
-const int CSSMERR_CSP_ACL_ADD_FAILED1 = -2147416010;
-
-const int CSSMERR_CSP_INVALID_CONTEXT_HANDLE1 = -2147416000;
-
-const int CSSMERR_CSP_PRIVILEGE_NOT_GRANTED1 = -2147415989;
-
-const int CSSMERR_CSP_INVALID_DATA1 = -2147415994;
-
-const int CSSMERR_CSP_INVALID_PASSTHROUGH_ID1 = -2147415978;
-
-const int CSSMERR_CSP_INVALID_CRYPTO_DATA1 = -2147415976;
-
-const int CSSM_CSP_BASE_CSP_ERROR1 = -2147415808;
-
-const int CSSMERR_CSP_INPUT_LENGTH_ERROR1 = -2147415807;
-
-const int CSSMERR_CSP_OUTPUT_LENGTH_ERROR1 = -2147415806;
-
-const int CSSMERR_CSP_PRIVILEGE_NOT_SUPPORTED1 = -2147415805;
-
-const int CSSMERR_CSP_DEVICE_ERROR1 = -2147415804;
-
-const int CSSMERR_CSP_DEVICE_MEMORY_ERROR1 = -2147415803;
-
-const int CSSMERR_CSP_ATTACH_HANDLE_BUSY1 = -2147415802;
-
-const int CSSMERR_CSP_NOT_LOGGED_IN1 = -2147415801;
-
-const int CSSMERR_CSP_INVALID_KEY1 = -2147415792;
-
-const int CSSMERR_CSP_INVALID_KEY_REFERENCE1 = -2147415791;
-
-const int CSSMERR_CSP_INVALID_KEY_CLASS1 = -2147415790;
-
-const int CSSMERR_CSP_ALGID_MISMATCH1 = -2147415789;
-
-const int CSSMERR_CSP_KEY_USAGE_INCORRECT1 = -2147415788;
-
-const int CSSMERR_CSP_KEY_BLOB_TYPE_INCORRECT1 = -2147415787;
-
-const int CSSMERR_CSP_KEY_HEADER_INCONSISTENT1 = -2147415786;
-
-const int CSSMERR_CSP_UNSUPPORTED_KEY_FORMAT1 = -2147415785;
-
-const int CSSMERR_CSP_UNSUPPORTED_KEY_SIZE1 = -2147415784;
-
-const int CSSMERR_CSP_INVALID_KEY_POINTER1 = -2147415783;
-
-const int CSSMERR_CSP_INVALID_KEYUSAGE_MASK1 = -2147415782;
-
-const int CSSMERR_CSP_UNSUPPORTED_KEYUSAGE_MASK1 = -2147415781;
-
-const int CSSMERR_CSP_INVALID_KEYATTR_MASK1 = -2147415780;
-
-const int CSSMERR_CSP_UNSUPPORTED_KEYATTR_MASK1 = -2147415779;
-
-const int CSSMERR_CSP_INVALID_KEY_LABEL1 = -2147415778;
-
-const int CSSMERR_CSP_UNSUPPORTED_KEY_LABEL1 = -2147415777;
-
-const int CSSMERR_CSP_INVALID_KEY_FORMAT1 = -2147415776;
-
-const int CSSMERR_CSP_INVALID_DATA_COUNT1 = -2147415768;
-
-const int CSSMERR_CSP_VECTOR_OF_BUFS_UNSUPPORTED1 = -2147415767;
-
-const int CSSMERR_CSP_INVALID_INPUT_VECTOR1 = -2147415766;
-
-const int CSSMERR_CSP_INVALID_OUTPUT_VECTOR1 = -2147415765;
-
-const int CSSMERR_CSP_INVALID_CONTEXT1 = -2147415760;
-
-const int CSSMERR_CSP_INVALID_ALGORITHM1 = -2147415759;
-
-const int CSSMERR_CSP_INVALID_ATTR_KEY1 = -2147415754;
-
-const int CSSMERR_CSP_MISSING_ATTR_KEY1 = -2147415753;
-
-const int CSSMERR_CSP_INVALID_ATTR_INIT_VECTOR1 = -2147415752;
-
-const int CSSMERR_CSP_MISSING_ATTR_INIT_VECTOR1 = -2147415751;
-
-const int CSSMERR_CSP_INVALID_ATTR_SALT1 = -2147415750;
-
-const int CSSMERR_CSP_MISSING_ATTR_SALT1 = -2147415749;
-
-const int CSSMERR_CSP_INVALID_ATTR_PADDING1 = -2147415748;
-
-const int CSSMERR_CSP_MISSING_ATTR_PADDING1 = -2147415747;
-
-const int CSSMERR_CSP_INVALID_ATTR_RANDOM1 = -2147415746;
-
-const int CSSMERR_CSP_MISSING_ATTR_RANDOM1 = -2147415745;
-
-const int CSSMERR_CSP_INVALID_ATTR_SEED1 = -2147415744;
-
-const int CSSMERR_CSP_MISSING_ATTR_SEED1 = -2147415743;
-
-const int CSSMERR_CSP_INVALID_ATTR_PASSPHRASE1 = -2147415742;
-
-const int CSSMERR_CSP_MISSING_ATTR_PASSPHRASE1 = -2147415741;
-
-const int CSSMERR_CSP_INVALID_ATTR_KEY_LENGTH1 = -2147415740;
-
-const int CSSMERR_CSP_MISSING_ATTR_KEY_LENGTH1 = -2147415739;
-
-const int CSSMERR_CSP_INVALID_ATTR_BLOCK_SIZE1 = -2147415738;
-
-const int CSSMERR_CSP_MISSING_ATTR_BLOCK_SIZE1 = -2147415737;
-
-const int CSSMERR_CSP_INVALID_ATTR_OUTPUT_SIZE1 = -2147415708;
-
-const int CSSMERR_CSP_MISSING_ATTR_OUTPUT_SIZE1 = -2147415707;
-
-const int CSSMERR_CSP_INVALID_ATTR_ROUNDS1 = -2147415706;
-
-const int CSSMERR_CSP_MISSING_ATTR_ROUNDS1 = -2147415705;
-
-const int CSSMERR_CSP_INVALID_ATTR_ALG_PARAMS1 = -2147415704;
-
-const int CSSMERR_CSP_MISSING_ATTR_ALG_PARAMS1 = -2147415703;
-
-const int CSSMERR_CSP_INVALID_ATTR_LABEL1 = -2147415702;
-
-const int CSSMERR_CSP_MISSING_ATTR_LABEL1 = -2147415701;
-
-const int CSSMERR_CSP_INVALID_ATTR_KEY_TYPE1 = -2147415700;
-
-const int CSSMERR_CSP_MISSING_ATTR_KEY_TYPE1 = -2147415699;
-
-const int CSSMERR_CSP_INVALID_ATTR_MODE1 = -2147415698;
-
-const int CSSMERR_CSP_MISSING_ATTR_MODE1 = -2147415697;
-
-const int CSSMERR_CSP_INVALID_ATTR_EFFECTIVE_BITS1 = -2147415696;
-
-const int CSSMERR_CSP_MISSING_ATTR_EFFECTIVE_BITS1 = -2147415695;
-
-const int CSSMERR_CSP_INVALID_ATTR_START_DATE1 = -2147415694;
-
-const int CSSMERR_CSP_MISSING_ATTR_START_DATE1 = -2147415693;
-
-const int CSSMERR_CSP_INVALID_ATTR_END_DATE1 = -2147415692;
-
-const int CSSMERR_CSP_MISSING_ATTR_END_DATE1 = -2147415691;
-
-const int CSSMERR_CSP_INVALID_ATTR_VERSION1 = -2147415690;
-
-const int CSSMERR_CSP_MISSING_ATTR_VERSION1 = -2147415689;
-
-const int CSSMERR_CSP_INVALID_ATTR_PRIME1 = -2147415688;
-
-const int CSSMERR_CSP_MISSING_ATTR_PRIME1 = -2147415687;
-
-const int CSSMERR_CSP_INVALID_ATTR_BASE1 = -2147415686;
-
-const int CSSMERR_CSP_MISSING_ATTR_BASE1 = -2147415685;
-
-const int CSSMERR_CSP_INVALID_ATTR_SUBPRIME1 = -2147415684;
-
-const int CSSMERR_CSP_MISSING_ATTR_SUBPRIME1 = -2147415683;
-
-const int CSSMERR_CSP_INVALID_ATTR_ITERATION_COUNT1 = -2147415682;
-
-const int CSSMERR_CSP_MISSING_ATTR_ITERATION_COUNT1 = -2147415681;
-
-const int CSSMERR_CSP_INVALID_ATTR_DL_DB_HANDLE1 = -2147415680;
-
-const int CSSMERR_CSP_MISSING_ATTR_DL_DB_HANDLE1 = -2147415679;
-
-const int CSSMERR_CSP_INVALID_ATTR_ACCESS_CREDENTIALS1 = -2147415678;
-
-const int CSSMERR_CSP_MISSING_ATTR_ACCESS_CREDENTIALS1 = -2147415677;
-
-const int CSSMERR_CSP_INVALID_ATTR_PUBLIC_KEY_FORMAT1 = -2147415676;
-
-const int CSSMERR_CSP_MISSING_ATTR_PUBLIC_KEY_FORMAT1 = -2147415675;
-
-const int CSSMERR_CSP_INVALID_ATTR_PRIVATE_KEY_FORMAT1 = -2147415674;
-
-const int CSSMERR_CSP_MISSING_ATTR_PRIVATE_KEY_FORMAT1 = -2147415673;
-
-const int CSSMERR_CSP_INVALID_ATTR_SYMMETRIC_KEY_FORMAT1 = -2147415672;
-
-const int CSSMERR_CSP_MISSING_ATTR_SYMMETRIC_KEY_FORMAT1 = -2147415671;
-
-const int CSSMERR_CSP_INVALID_ATTR_WRAPPED_KEY_FORMAT1 = -2147415670;
-
-const int CSSMERR_CSP_MISSING_ATTR_WRAPPED_KEY_FORMAT1 = -2147415669;
-
-const int CSSMERR_CSP_STAGED_OPERATION_IN_PROGRESS1 = -2147415736;
-
-const int CSSMERR_CSP_STAGED_OPERATION_NOT_STARTED1 = -2147415735;
-
-const int CSSMERR_CSP_VERIFY_FAILED1 = -2147415734;
-
-const int CSSMERR_CSP_INVALID_SIGNATURE1 = -2147415733;
-
-const int CSSMERR_CSP_QUERY_SIZE_UNKNOWN1 = -2147415732;
-
-const int CSSMERR_CSP_BLOCK_SIZE_MISMATCH1 = -2147415731;
-
-const int CSSMERR_CSP_PRIVATE_KEY_NOT_FOUND1 = -2147415730;
-
-const int CSSMERR_CSP_PUBLIC_KEY_INCONSISTENT1 = -2147415729;
-
-const int CSSMERR_CSP_DEVICE_VERIFY_FAILED1 = -2147415728;
-
-const int CSSMERR_CSP_INVALID_LOGIN_NAME1 = -2147415727;
-
-const int CSSMERR_CSP_ALREADY_LOGGED_IN1 = -2147415726;
-
-const int CSSMERR_CSP_PRIVATE_KEY_ALREADY_EXISTS1 = -2147415725;
-
-const int CSSMERR_CSP_KEY_LABEL_ALREADY_EXISTS1 = -2147415724;
-
-const int CSSMERR_CSP_INVALID_DIGEST_ALGORITHM1 = -2147415723;
-
-const int CSSMERR_CSP_CRYPTO_DATA_CALLBACK_FAILED1 = -2147415722;
-
-const int CSSMERR_TP_INTERNAL_ERROR1 = -2147409919;
-
-const int CSSMERR_TP_MEMORY_ERROR1 = -2147409918;
-
-const int CSSMERR_TP_MDS_ERROR1 = -2147409917;
-
-const int CSSMERR_TP_INVALID_POINTER1 = -2147409916;
-
-const int CSSMERR_TP_INVALID_INPUT_POINTER1 = -2147409915;
-
-const int CSSMERR_TP_INVALID_OUTPUT_POINTER1 = -2147409914;
-
-const int CSSMERR_TP_FUNCTION_NOT_IMPLEMENTED1 = -2147409913;
-
-const int CSSMERR_TP_SELF_CHECK_FAILED1 = -2147409912;
-
-const int CSSMERR_TP_OS_ACCESS_DENIED1 = -2147409911;
-
-const int CSSMERR_TP_FUNCTION_FAILED1 = -2147409910;
-
-const int CSSMERR_TP_INVALID_CONTEXT_HANDLE1 = -2147409856;
-
-const int CSSMERR_TP_INVALID_DATA1 = -2147409850;
-
-const int CSSMERR_TP_INVALID_DB_LIST1 = -2147409844;
-
-const int CSSMERR_TP_INVALID_CERTGROUP_POINTER1 = -2147409854;
-
-const int CSSMERR_TP_INVALID_CERT_POINTER1 = -2147409853;
-
-const int CSSMERR_TP_INVALID_CRL_POINTER1 = -2147409852;
-
-const int CSSMERR_TP_INVALID_FIELD_POINTER1 = -2147409851;
-
-const int CSSMERR_TP_INVALID_NETWORK_ADDR1 = -2147409833;
-
-const int CSSMERR_TP_CRL_ALREADY_SIGNED1 = -2147409849;
-
-const int CSSMERR_TP_INVALID_NUMBER_OF_FIELDS1 = -2147409848;
-
-const int CSSMERR_TP_VERIFICATION_FAILURE1 = -2147409847;
-
-const int CSSMERR_TP_INVALID_DB_HANDLE1 = -2147409846;
-
-const int CSSMERR_TP_UNKNOWN_FORMAT1 = -2147409842;
-
-const int CSSMERR_TP_UNKNOWN_TAG1 = -2147409841;
-
-const int CSSMERR_TP_INVALID_PASSTHROUGH_ID1 = -2147409834;
-
-const int CSSMERR_TP_INVALID_CSP_HANDLE1 = -2147409840;
-
-const int CSSMERR_TP_INVALID_DL_HANDLE1 = -2147409839;
-
-const int CSSMERR_TP_INVALID_CL_HANDLE1 = -2147409838;
-
-const int CSSMERR_TP_INVALID_DB_LIST_POINTER1 = -2147409843;
-
-const int CSSM_TP_BASE_TP_ERROR1 = -2147409664;
-
-const int CSSMERR_TP_INVALID_CALLERAUTH_CONTEXT_POINTER1 = -2147409663;
-
-const int CSSMERR_TP_INVALID_IDENTIFIER_POINTER1 = -2147409662;
-
-const int CSSMERR_TP_INVALID_KEYCACHE_HANDLE1 = -2147409661;
-
-const int CSSMERR_TP_INVALID_CERTGROUP1 = -2147409660;
-
-const int CSSMERR_TP_INVALID_CRLGROUP1 = -2147409659;
-
-const int CSSMERR_TP_INVALID_CRLGROUP_POINTER1 = -2147409658;
-
-const int CSSMERR_TP_AUTHENTICATION_FAILED1 = -2147409657;
-
-const int CSSMERR_TP_CERTGROUP_INCOMPLETE1 = -2147409656;
-
-const int CSSMERR_TP_CERTIFICATE_CANT_OPERATE1 = -2147409655;
-
-const int CSSMERR_TP_CERT_EXPIRED1 = -2147409654;
-
-const int CSSMERR_TP_CERT_NOT_VALID_YET1 = -2147409653;
-
-const int CSSMERR_TP_CERT_REVOKED1 = -2147409652;
-
-const int CSSMERR_TP_CERT_SUSPENDED1 = -2147409651;
-
-const int CSSMERR_TP_INSUFFICIENT_CREDENTIALS1 = -2147409650;
-
-const int CSSMERR_TP_INVALID_ACTION1 = -2147409649;
-
-const int CSSMERR_TP_INVALID_ACTION_DATA1 = -2147409648;
-
-const int CSSMERR_TP_INVALID_ANCHOR_CERT1 = -2147409646;
-
-const int CSSMERR_TP_INVALID_AUTHORITY1 = -2147409645;
-
-const int CSSMERR_TP_VERIFY_ACTION_FAILED1 = -2147409644;
-
-const int CSSMERR_TP_INVALID_CERTIFICATE1 = -2147409643;
-
-const int CSSMERR_TP_INVALID_CERT_AUTHORITY1 = -2147409642;
-
-const int CSSMERR_TP_INVALID_CRL_AUTHORITY1 = -2147409641;
-
-const int CSSMERR_TP_INVALID_CRL_ENCODING1 = -2147409640;
-
-const int CSSMERR_TP_INVALID_CRL_TYPE1 = -2147409639;
-
-const int CSSMERR_TP_INVALID_CRL1 = -2147409638;
-
-const int CSSMERR_TP_INVALID_FORM_TYPE1 = -2147409637;
-
-const int CSSMERR_TP_INVALID_ID1 = -2147409636;
-
-const int CSSMERR_TP_INVALID_IDENTIFIER1 = -2147409635;
-
-const int CSSMERR_TP_INVALID_INDEX1 = -2147409634;
-
-const int CSSMERR_TP_INVALID_NAME1 = -2147409633;
-
-const int CSSMERR_TP_INVALID_POLICY_IDENTIFIERS1 = -2147409632;
-
-const int CSSMERR_TP_INVALID_TIMESTRING1 = -2147409631;
-
-const int CSSMERR_TP_INVALID_REASON1 = -2147409630;
-
-const int CSSMERR_TP_INVALID_REQUEST_INPUTS1 = -2147409629;
-
-const int CSSMERR_TP_INVALID_RESPONSE_VECTOR1 = -2147409628;
-
-const int CSSMERR_TP_INVALID_SIGNATURE1 = -2147409627;
-
-const int CSSMERR_TP_INVALID_STOP_ON_POLICY1 = -2147409626;
-
-const int CSSMERR_TP_INVALID_CALLBACK1 = -2147409625;
-
-const int CSSMERR_TP_INVALID_TUPLE1 = -2147409624;
-
-const int CSSMERR_TP_NOT_SIGNER1 = -2147409623;
-
-const int CSSMERR_TP_NOT_TRUSTED1 = -2147409622;
-
-const int CSSMERR_TP_NO_DEFAULT_AUTHORITY1 = -2147409621;
-
-const int CSSMERR_TP_REJECTED_FORM1 = -2147409620;
-
-const int CSSMERR_TP_REQUEST_LOST1 = -2147409619;
-
-const int CSSMERR_TP_REQUEST_REJECTED1 = -2147409618;
-
-const int CSSMERR_TP_UNSUPPORTED_ADDR_TYPE1 = -2147409617;
-
-const int CSSMERR_TP_UNSUPPORTED_SERVICE1 = -2147409616;
-
-const int CSSMERR_TP_INVALID_TUPLEGROUP_POINTER1 = -2147409615;
-
-const int CSSMERR_TP_INVALID_TUPLEGROUP1 = -2147409614;
-
-const int CSSMERR_AC_INTERNAL_ERROR1 = -2147405823;
-
-const int CSSMERR_AC_MEMORY_ERROR1 = -2147405822;
-
-const int CSSMERR_AC_MDS_ERROR1 = -2147405821;
-
-const int CSSMERR_AC_INVALID_POINTER1 = -2147405820;
-
-const int CSSMERR_AC_INVALID_INPUT_POINTER1 = -2147405819;
-
-const int CSSMERR_AC_INVALID_OUTPUT_POINTER1 = -2147405818;
-
-const int CSSMERR_AC_FUNCTION_NOT_IMPLEMENTED1 = -2147405817;
-
-const int CSSMERR_AC_SELF_CHECK_FAILED1 = -2147405816;
-
-const int CSSMERR_AC_OS_ACCESS_DENIED1 = -2147405815;
-
-const int CSSMERR_AC_FUNCTION_FAILED1 = -2147405814;
-
-const int CSSMERR_AC_INVALID_CONTEXT_HANDLE1 = -2147405760;
-
-const int CSSMERR_AC_INVALID_DATA1 = -2147405754;
-
-const int CSSMERR_AC_INVALID_DB_LIST1 = -2147405748;
-
-const int CSSMERR_AC_INVALID_PASSTHROUGH_ID1 = -2147405738;
-
-const int CSSMERR_AC_INVALID_DL_HANDLE1 = -2147405743;
-
-const int CSSMERR_AC_INVALID_CL_HANDLE1 = -2147405742;
-
-const int CSSMERR_AC_INVALID_TP_HANDLE1 = -2147405741;
-
-const int CSSMERR_AC_INVALID_DB_HANDLE1 = -2147405750;
-
-const int CSSMERR_AC_INVALID_DB_LIST_POINTER1 = -2147405747;
-
-const int CSSM_AC_BASE_AC_ERROR1 = -2147405568;
-
-const int CSSMERR_AC_INVALID_BASE_ACLS1 = -2147405567;
-
-const int CSSMERR_AC_INVALID_TUPLE_CREDENTIALS1 = -2147405566;
-
-const int CSSMERR_AC_INVALID_ENCODING1 = -2147405565;
-
-const int CSSMERR_AC_INVALID_VALIDITY_PERIOD1 = -2147405564;
-
-const int CSSMERR_AC_INVALID_REQUESTOR1 = -2147405563;
-
-const int CSSMERR_AC_INVALID_REQUEST_DESCRIPTOR1 = -2147405562;
-
-const int CSSMERR_CL_INTERNAL_ERROR1 = -2147411967;
-
-const int CSSMERR_CL_MEMORY_ERROR1 = -2147411966;
-
-const int CSSMERR_CL_MDS_ERROR1 = -2147411965;
-
-const int CSSMERR_CL_INVALID_POINTER1 = -2147411964;
-
-const int CSSMERR_CL_INVALID_INPUT_POINTER1 = -2147411963;
-
-const int CSSMERR_CL_INVALID_OUTPUT_POINTER1 = -2147411962;
-
-const int CSSMERR_CL_FUNCTION_NOT_IMPLEMENTED1 = -2147411961;
-
-const int CSSMERR_CL_SELF_CHECK_FAILED1 = -2147411960;
-
-const int CSSMERR_CL_OS_ACCESS_DENIED1 = -2147411959;
-
-const int CSSMERR_CL_FUNCTION_FAILED1 = -2147411958;
-
-const int CSSMERR_CL_INVALID_CONTEXT_HANDLE1 = -2147411904;
-
-const int CSSMERR_CL_INVALID_CERTGROUP_POINTER1 = -2147411902;
-
-const int CSSMERR_CL_INVALID_CERT_POINTER1 = -2147411901;
-
-const int CSSMERR_CL_INVALID_CRL_POINTER1 = -2147411900;
-
-const int CSSMERR_CL_INVALID_FIELD_POINTER1 = -2147411899;
-
-const int CSSMERR_CL_INVALID_DATA1 = -2147411898;
-
-const int CSSMERR_CL_CRL_ALREADY_SIGNED1 = -2147411897;
-
-const int CSSMERR_CL_INVALID_NUMBER_OF_FIELDS1 = -2147411896;
-
-const int CSSMERR_CL_VERIFICATION_FAILURE1 = -2147411895;
-
-const int CSSMERR_CL_UNKNOWN_FORMAT1 = -2147411890;
-
-const int CSSMERR_CL_UNKNOWN_TAG1 = -2147411889;
-
-const int CSSMERR_CL_INVALID_PASSTHROUGH_ID1 = -2147411882;
-
-const int CSSM_CL_BASE_CL_ERROR1 = -2147411712;
-
-const int CSSMERR_CL_INVALID_BUNDLE_POINTER1 = -2147411711;
-
-const int CSSMERR_CL_INVALID_CACHE_HANDLE1 = -2147411710;
-
-const int CSSMERR_CL_INVALID_RESULTS_HANDLE1 = -2147411709;
-
-const int CSSMERR_CL_INVALID_BUNDLE_INFO1 = -2147411708;
-
-const int CSSMERR_CL_INVALID_CRL_INDEX1 = -2147411707;
-
-const int CSSMERR_CL_INVALID_SCOPE1 = -2147411706;
-
-const int CSSMERR_CL_NO_FIELD_VALUES1 = -2147411705;
-
-const int CSSMERR_CL_SCOPE_NOT_SUPPORTED1 = -2147411704;
-
-const int CSSMERR_DL_INTERNAL_ERROR1 = -2147414015;
-
-const int CSSMERR_DL_MEMORY_ERROR1 = -2147414014;
-
-const int CSSMERR_DL_MDS_ERROR1 = -2147414013;
-
-const int CSSMERR_DL_INVALID_POINTER1 = -2147414012;
-
-const int CSSMERR_DL_INVALID_INPUT_POINTER1 = -2147414011;
-
-const int CSSMERR_DL_INVALID_OUTPUT_POINTER1 = -2147414010;
-
-const int CSSMERR_DL_FUNCTION_NOT_IMPLEMENTED1 = -2147414009;
-
-const int CSSMERR_DL_SELF_CHECK_FAILED1 = -2147414008;
-
-const int CSSMERR_DL_OS_ACCESS_DENIED1 = -2147414007;
-
-const int CSSMERR_DL_FUNCTION_FAILED1 = -2147414006;
-
-const int CSSMERR_DL_INVALID_CSP_HANDLE1 = -2147413936;
-
-const int CSSMERR_DL_INVALID_DL_HANDLE1 = -2147413935;
-
-const int CSSMERR_DL_INVALID_CL_HANDLE1 = -2147413934;
-
-const int CSSMERR_DL_INVALID_DB_LIST_POINTER1 = -2147413939;
-
-const int CSSMERR_DL_OPERATION_AUTH_DENIED1 = -2147413984;
-
-const int CSSMERR_DL_OBJECT_USE_AUTH_DENIED1 = -2147413983;
-
-const int CSSMERR_DL_OBJECT_MANIP_AUTH_DENIED1 = -2147413982;
-
-const int CSSMERR_DL_OBJECT_ACL_NOT_SUPPORTED1 = -2147413981;
-
-const int CSSMERR_DL_OBJECT_ACL_REQUIRED1 = -2147413980;
-
-const int CSSMERR_DL_INVALID_ACCESS_CREDENTIALS1 = -2147413979;
-
-const int CSSMERR_DL_INVALID_ACL_BASE_CERTS1 = -2147413978;
-
-const int CSSMERR_DL_ACL_BASE_CERTS_NOT_SUPPORTED1 = -2147413977;
-
-const int CSSMERR_DL_INVALID_SAMPLE_VALUE1 = -2147413976;
-
-const int CSSMERR_DL_SAMPLE_VALUE_NOT_SUPPORTED1 = -2147413975;
-
-const int CSSMERR_DL_INVALID_ACL_SUBJECT_VALUE1 = -2147413974;
-
-const int CSSMERR_DL_ACL_SUBJECT_TYPE_NOT_SUPPORTED1 = -2147413973;
-
-const int CSSMERR_DL_INVALID_ACL_CHALLENGE_CALLBACK1 = -2147413972;
-
-const int CSSMERR_DL_ACL_CHALLENGE_CALLBACK_FAILED1 = -2147413971;
-
-const int CSSMERR_DL_INVALID_ACL_ENTRY_TAG1 = -2147413970;
-
-const int CSSMERR_DL_ACL_ENTRY_TAG_NOT_FOUND1 = -2147413969;
-
-const int CSSMERR_DL_INVALID_ACL_EDIT_MODE1 = -2147413968;
-
-const int CSSMERR_DL_ACL_CHANGE_FAILED1 = -2147413967;
-
-const int CSSMERR_DL_INVALID_NEW_ACL_ENTRY1 = -2147413966;
-
-const int CSSMERR_DL_INVALID_NEW_ACL_OWNER1 = -2147413965;
-
-const int CSSMERR_DL_ACL_DELETE_FAILED1 = -2147413964;
-
-const int CSSMERR_DL_ACL_REPLACE_FAILED1 = -2147413963;
-
-const int CSSMERR_DL_ACL_ADD_FAILED1 = -2147413962;
-
-const int CSSMERR_DL_INVALID_DB_HANDLE1 = -2147413942;
-
-const int CSSMERR_DL_INVALID_PASSTHROUGH_ID1 = -2147413930;
-
-const int CSSMERR_DL_INVALID_NETWORK_ADDR1 = -2147413929;
-
-const int CSSM_DL_BASE_DL_ERROR1 = -2147413760;
-
-const int CSSMERR_DL_DATABASE_CORRUPT1 = -2147413759;
-
-const int CSSMERR_DL_INVALID_RECORD_INDEX1 = -2147413752;
-
-const int CSSMERR_DL_INVALID_RECORDTYPE1 = -2147413751;
-
-const int CSSMERR_DL_INVALID_FIELD_NAME1 = -2147413750;
-
-const int CSSMERR_DL_UNSUPPORTED_FIELD_FORMAT1 = -2147413749;
-
-const int CSSMERR_DL_UNSUPPORTED_INDEX_INFO1 = -2147413748;
-
-const int CSSMERR_DL_UNSUPPORTED_LOCALITY1 = -2147413747;
-
-const int CSSMERR_DL_UNSUPPORTED_NUM_ATTRIBUTES1 = -2147413746;
-
-const int CSSMERR_DL_UNSUPPORTED_NUM_INDEXES1 = -2147413745;
-
-const int CSSMERR_DL_UNSUPPORTED_NUM_RECORDTYPES1 = -2147413744;
-
-const int CSSMERR_DL_UNSUPPORTED_RECORDTYPE1 = -2147413743;
-
-const int CSSMERR_DL_FIELD_SPECIFIED_MULTIPLE1 = -2147413742;
-
-const int CSSMERR_DL_INCOMPATIBLE_FIELD_FORMAT1 = -2147413741;
-
-const int CSSMERR_DL_INVALID_PARSING_MODULE1 = -2147413740;
-
-const int CSSMERR_DL_INVALID_DB_NAME1 = -2147413738;
-
-const int CSSMERR_DL_DATASTORE_DOESNOT_EXIST1 = -2147413737;
-
-const int CSSMERR_DL_DATASTORE_ALREADY_EXISTS1 = -2147413736;
-
-const int CSSMERR_DL_DB_LOCKED1 = -2147413735;
-
-const int CSSMERR_DL_DATASTORE_IS_OPEN1 = -2147413734;
-
-const int CSSMERR_DL_RECORD_NOT_FOUND1 = -2147413733;
-
-const int CSSMERR_DL_MISSING_VALUE1 = -2147413732;
-
-const int CSSMERR_DL_UNSUPPORTED_QUERY1 = -2147413731;
-
-const int CSSMERR_DL_UNSUPPORTED_QUERY_LIMITS1 = -2147413730;
-
-const int CSSMERR_DL_UNSUPPORTED_NUM_SELECTION_PREDS1 = -2147413729;
-
-const int CSSMERR_DL_UNSUPPORTED_OPERATOR1 = -2147413727;
-
-const int CSSMERR_DL_INVALID_RESULTS_HANDLE1 = -2147413726;
-
-const int CSSMERR_DL_INVALID_DB_LOCATION1 = -2147413725;
-
-const int CSSMERR_DL_INVALID_ACCESS_REQUEST1 = -2147413724;
-
-const int CSSMERR_DL_INVALID_INDEX_INFO1 = -2147413723;
-
-const int CSSMERR_DL_INVALID_SELECTION_TAG1 = -2147413722;
-
-const int CSSMERR_DL_INVALID_NEW_OWNER1 = -2147413721;
-
-const int CSSMERR_DL_INVALID_RECORD_UID1 = -2147413720;
-
-const int CSSMERR_DL_INVALID_UNIQUE_INDEX_DATA1 = -2147413719;
-
-const int CSSMERR_DL_INVALID_MODIFY_MODE1 = -2147413718;
-
-const int CSSMERR_DL_INVALID_OPEN_PARAMETERS1 = -2147413717;
-
-const int CSSMERR_DL_RECORD_MODIFIED1 = -2147413716;
-
-const int CSSMERR_DL_ENDOFDATA1 = -2147413715;
-
-const int CSSMERR_DL_INVALID_QUERY1 = -2147413714;
-
-const int CSSMERR_DL_INVALID_VALUE1 = -2147413713;
-
-const int CSSMERR_DL_MULTIPLE_VALUES_UNSUPPORTED1 = -2147413712;
-
-const int CSSMERR_DL_STALE_UNIQUE_RECORD1 = -2147413711;
-
-const int CSSM_WORDID_KEYCHAIN_PROMPT1 = 65536;
-
-const int CSSM_WORDID_KEYCHAIN_LOCK1 = 65537;
-
-const int CSSM_WORDID_KEYCHAIN_CHANGE_LOCK1 = 65538;
-
-const int CSSM_WORDID_PROCESS1 = 65539;
-
-const int CSSM_WORDID__RESERVED_11 = 65540;
-
-const int CSSM_WORDID_SYMMETRIC_KEY1 = 65541;
-
-const int CSSM_WORDID_SYSTEM1 = 65542;
-
-const int CSSM_WORDID_KEY1 = 65543;
-
-const int CSSM_WORDID_PIN1 = 65544;
-
-const int CSSM_WORDID_PREAUTH1 = 65545;
-
-const int CSSM_WORDID_PREAUTH_SOURCE1 = 65546;
-
-const int CSSM_WORDID_ASYMMETRIC_KEY1 = 65547;
-
-const int CSSM_WORDID_PARTITION1 = 65548;
-
-const int CSSM_WORDID_KEYBAG_KEY1 = 65549;
-
-const int CSSM_WORDID__FIRST_UNUSED1 = 65550;
-
-const int CSSM_ACL_SUBJECT_TYPE_KEYCHAIN_PROMPT1 = 65536;
-
-const int CSSM_ACL_SUBJECT_TYPE_PROCESS1 = 65539;
-
-const int CSSM_ACL_SUBJECT_TYPE_CODE_SIGNATURE1 = 116;
-
-const int CSSM_ACL_SUBJECT_TYPE_COMMENT1 = 12;
-
-const int CSSM_ACL_SUBJECT_TYPE_SYMMETRIC_KEY1 = 65541;
-
-const int CSSM_ACL_SUBJECT_TYPE_PREAUTH1 = 65545;
-
-const int CSSM_ACL_SUBJECT_TYPE_PREAUTH_SOURCE1 = 65546;
-
-const int CSSM_ACL_SUBJECT_TYPE_ASYMMETRIC_KEY1 = 65547;
-
-const int CSSM_ACL_SUBJECT_TYPE_PARTITION1 = 65548;
-
-const int CSSM_SAMPLE_TYPE_KEYCHAIN_PROMPT1 = 65536;
-
-const int CSSM_SAMPLE_TYPE_KEYCHAIN_LOCK1 = 65537;
-
-const int CSSM_SAMPLE_TYPE_KEYCHAIN_CHANGE_LOCK1 = 65538;
-
-const int CSSM_SAMPLE_TYPE_PROCESS1 = 65539;
-
-const int CSSM_SAMPLE_TYPE_COMMENT1 = 12;
-
-const int CSSM_SAMPLE_TYPE_RETRY_ID1 = 85;
-
-const int CSSM_SAMPLE_TYPE_SYMMETRIC_KEY1 = 65541;
-
-const int CSSM_SAMPLE_TYPE_PREAUTH1 = 65545;
-
-const int CSSM_SAMPLE_TYPE_ASYMMETRIC_KEY1 = 65547;
-
-const int CSSM_SAMPLE_TYPE_KEYBAG_KEY1 = 65549;
-
-const int CSSM_ACL_AUTHORIZATION_CHANGE_ACL1 = 65536;
-
-const int CSSM_ACL_AUTHORIZATION_CHANGE_OWNER1 = 65537;
-
-const int CSSM_ACL_AUTHORIZATION_PARTITION_ID1 = 65538;
-
-const int CSSM_ACL_AUTHORIZATION_INTEGRITY1 = 65539;
-
-const int CSSM_ACL_AUTHORIZATION_PREAUTH_BASE1 = 16842752;
-
-const int CSSM_ACL_AUTHORIZATION_PREAUTH_END1 = 16908288;
-
-const int CSSM_ACL_CODE_SIGNATURE_INVALID1 = 0;
-
-const int CSSM_ACL_CODE_SIGNATURE_OSX1 = 1;
-
-const int CSSM_ACL_MATCH_UID1 = 1;
-
-const int CSSM_ACL_MATCH_GID1 = 2;
-
-const int CSSM_ACL_MATCH_HONOR_ROOT1 = 256;
-
-const int CSSM_ACL_MATCH_BITS1 = 3;
-
-const int CSSM_ACL_PROCESS_SELECTOR_CURRENT_VERSION1 = 257;
-
-const int CSSM_ACL_KEYCHAIN_PROMPT_CURRENT_VERSION1 = 257;
-
-const int CSSM_ACL_KEYCHAIN_PROMPT_REQUIRE_PASSPHRASE1 = 1;
-
-const int CSSM_ACL_KEYCHAIN_PROMPT_UNSIGNED1 = 16;
-
-const int CSSM_ACL_KEYCHAIN_PROMPT_UNSIGNED_ACT1 = 32;
-
-const int CSSM_ACL_KEYCHAIN_PROMPT_INVALID1 = 64;
-
-const int CSSM_ACL_KEYCHAIN_PROMPT_INVALID_ACT1 = 128;
-
-const int CSSM_ACL_PREAUTH_TRACKING_COUNT_MASK1 = 255;
-
-const int CSSM_ACL_PREAUTH_TRACKING_BLOCKED1 = 0;
-
-const int CSSM_ACL_PREAUTH_TRACKING_UNKNOWN1 = 1073741824;
-
-const int CSSM_ACL_PREAUTH_TRACKING_AUTHORIZED1 = -2147483648;
-
-const int CSSM_DB_ACCESS_RESET1 = 65536;
-
-const int CSSM_ALGID_APPLE_YARROW1 = -2147483648;
-
-const int CSSM_ALGID_AES1 = -2147483647;
-
-const int CSSM_ALGID_FEE1 = -2147483646;
-
-const int CSSM_ALGID_FEE_MD51 = -2147483645;
-
-const int CSSM_ALGID_FEE_SHA11 = -2147483644;
-
-const int CSSM_ALGID_FEED1 = -2147483643;
-
-const int CSSM_ALGID_FEEDEXP1 = -2147483642;
-
-const int CSSM_ALGID_ASC1 = -2147483641;
-
-const int CSSM_ALGID_SHA1HMAC_LEGACY1 = -2147483640;
-
-const int CSSM_ALGID_KEYCHAIN_KEY1 = -2147483639;
-
-const int CSSM_ALGID_PKCS12_PBE_ENCR1 = -2147483638;
-
-const int CSSM_ALGID_PKCS12_PBE_MAC1 = -2147483637;
-
-const int CSSM_ALGID_SECURE_PASSPHRASE1 = -2147483636;
-
-const int CSSM_ALGID_PBE_OPENSSL_MD51 = -2147483635;
-
-const int CSSM_ALGID_SHA2561 = -2147483634;
-
-const int CSSM_ALGID_SHA3841 = -2147483633;
-
-const int CSSM_ALGID_SHA5121 = -2147483632;
-
-const int CSSM_ALGID_ENTROPY_DEFAULT1 = -2147483631;
-
-const int CSSM_ALGID_SHA2241 = -2147483630;
-
-const int CSSM_ALGID_SHA224WithRSA1 = -2147483629;
-
-const int CSSM_ALGID_SHA256WithRSA1 = -2147483628;
-
-const int CSSM_ALGID_SHA384WithRSA1 = -2147483627;
-
-const int CSSM_ALGID_SHA512WithRSA1 = -2147483626;
-
-const int CSSM_ALGID_OPENSSH11 = -2147483625;
-
-const int CSSM_ALGID_SHA224WithECDSA1 = -2147483624;
-
-const int CSSM_ALGID_SHA256WithECDSA1 = -2147483623;
-
-const int CSSM_ALGID_SHA384WithECDSA1 = -2147483622;
-
-const int CSSM_ALGID_SHA512WithECDSA1 = -2147483621;
-
-const int CSSM_ALGID_ECDSA_SPECIFIED1 = -2147483620;
-
-const int CSSM_ALGID_ECDH_X963_KDF1 = -2147483619;
-
-const int CSSM_ALGID__FIRST_UNUSED1 = -2147483618;
-
-const int CSSM_PADDING_APPLE_SSLv21 = -2147483648;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_VENDOR_DEFINED1 = -2147483648;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_X5091 = -2147483648;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_OPENSSH1 = -2147483647;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_OPENSSL1 = -2147483646;
-
-const int CSSM_KEYBLOB_RAW_FORMAT_OPENSSH21 = -2147483645;
-
-const int CSSM_CUSTOM_COMMON_ERROR_EXTENT1 = 224;
-
-const int CSSM_ERRCODE_NO_USER_INTERACTION1 = 224;
-
-const int CSSM_ERRCODE_USER_CANCELED1 = 225;
-
-const int CSSM_ERRCODE_SERVICE_NOT_AVAILABLE1 = 226;
-
-const int CSSM_ERRCODE_INSUFFICIENT_CLIENT_IDENTIFICATION1 = 227;
-
-const int CSSM_ERRCODE_DEVICE_RESET1 = 228;
-
-const int CSSM_ERRCODE_DEVICE_FAILED1 = 229;
-
-const int CSSM_ERRCODE_IN_DARK_WAKE1 = 230;
-
-const int CSSMERR_CSSM_NO_USER_INTERACTION1 = -2147417888;
-
-const int CSSMERR_AC_NO_USER_INTERACTION1 = -2147405600;
-
-const int CSSMERR_CSP_NO_USER_INTERACTION1 = -2147415840;
-
-const int CSSMERR_CL_NO_USER_INTERACTION1 = -2147411744;
-
-const int CSSMERR_DL_NO_USER_INTERACTION1 = -2147413792;
-
-const int CSSMERR_TP_NO_USER_INTERACTION1 = -2147409696;
-
-const int CSSMERR_CSSM_USER_CANCELED1 = -2147417887;
-
-const int CSSMERR_AC_USER_CANCELED1 = -2147405599;
-
-const int CSSMERR_CSP_USER_CANCELED1 = -2147415839;
-
-const int CSSMERR_CL_USER_CANCELED1 = -2147411743;
-
-const int CSSMERR_DL_USER_CANCELED1 = -2147413791;
-
-const int CSSMERR_TP_USER_CANCELED1 = -2147409695;
-
-const int CSSMERR_CSSM_SERVICE_NOT_AVAILABLE1 = -2147417886;
-
-const int CSSMERR_AC_SERVICE_NOT_AVAILABLE1 = -2147405598;
-
-const int CSSMERR_CSP_SERVICE_NOT_AVAILABLE1 = -2147415838;
-
-const int CSSMERR_CL_SERVICE_NOT_AVAILABLE1 = -2147411742;
-
-const int CSSMERR_DL_SERVICE_NOT_AVAILABLE1 = -2147413790;
-
-const int CSSMERR_TP_SERVICE_NOT_AVAILABLE1 = -2147409694;
-
-const int CSSMERR_CSSM_INSUFFICIENT_CLIENT_IDENTIFICATION1 = -2147417885;
-
-const int CSSMERR_AC_INSUFFICIENT_CLIENT_IDENTIFICATION1 = -2147405597;
-
-const int CSSMERR_CSP_INSUFFICIENT_CLIENT_IDENTIFICATION1 = -2147415837;
-
-const int CSSMERR_CL_INSUFFICIENT_CLIENT_IDENTIFICATION1 = -2147411741;
-
-const int CSSMERR_DL_INSUFFICIENT_CLIENT_IDENTIFICATION1 = -2147413789;
-
-const int CSSMERR_TP_INSUFFICIENT_CLIENT_IDENTIFICATION1 = -2147409693;
-
-const int CSSMERR_CSSM_DEVICE_RESET1 = -2147417884;
-
-const int CSSMERR_AC_DEVICE_RESET1 = -2147405596;
-
-const int CSSMERR_CSP_DEVICE_RESET1 = -2147415836;
-
-const int CSSMERR_CL_DEVICE_RESET1 = -2147411740;
-
-const int CSSMERR_DL_DEVICE_RESET1 = -2147413788;
-
-const int CSSMERR_TP_DEVICE_RESET1 = -2147409692;
-
-const int CSSMERR_CSSM_DEVICE_FAILED1 = -2147417883;
-
-const int CSSMERR_AC_DEVICE_FAILED1 = -2147405595;
-
-const int CSSMERR_CSP_DEVICE_FAILED1 = -2147415835;
-
-const int CSSMERR_CL_DEVICE_FAILED1 = -2147411739;
-
-const int CSSMERR_DL_DEVICE_FAILED1 = -2147413787;
-
-const int CSSMERR_TP_DEVICE_FAILED1 = -2147409691;
-
-const int CSSMERR_CSSM_IN_DARK_WAKE1 = -2147417882;
-
-const int CSSMERR_AC_IN_DARK_WAKE1 = -2147405594;
-
-const int CSSMERR_CSP_IN_DARK_WAKE1 = -2147415834;
-
-const int CSSMERR_CL_IN_DARK_WAKE1 = -2147411738;
-
-const int CSSMERR_DL_IN_DARK_WAKE1 = -2147413786;
-
-const int CSSMERR_TP_IN_DARK_WAKE1 = -2147409690;
-
-const int CSSMERR_CSP_APPLE_ADD_APPLICATION_ACL_SUBJECT1 = -2147415040;
-
-const int CSSMERR_CSP_APPLE_PUBLIC_KEY_INCOMPLETE1 = -2147415039;
-
-const int CSSMERR_CSP_APPLE_SIGNATURE_MISMATCH1 = -2147415038;
-
-const int CSSMERR_CSP_APPLE_INVALID_KEY_START_DATE1 = -2147415037;
-
-const int CSSMERR_CSP_APPLE_INVALID_KEY_END_DATE1 = -2147415036;
-
-const int CSSMERR_CSPDL_APPLE_DL_CONVERSION_ERROR1 = -2147415035;
-
-const int CSSMERR_CSP_APPLE_SSLv2_ROLLBACK1 = -2147415034;
-
-const int CSSM_DL_DB_RECORD_GENERIC_PASSWORD1 = -2147483648;
-
-const int CSSM_DL_DB_RECORD_INTERNET_PASSWORD1 = -2147483647;
-
-const int CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD1 = -2147483646;
-
-const int CSSM_DL_DB_RECORD_X509_CERTIFICATE1 = -2147479552;
-
-const int CSSM_DL_DB_RECORD_USER_TRUST1 = -2147479551;
-
-const int CSSM_DL_DB_RECORD_X509_CRL1 = -2147479550;
-
-const int CSSM_DL_DB_RECORD_UNLOCK_REFERRAL1 = -2147479549;
-
-const int CSSM_DL_DB_RECORD_EXTENDED_ATTRIBUTE1 = -2147479548;
-
-const int CSSM_DL_DB_RECORD_METADATA1 = -2147450880;
-
-const int CSSM_APPLEFILEDL_TOGGLE_AUTOCOMMIT1 = 0;
-
-const int CSSM_APPLEFILEDL_COMMIT1 = 1;
-
-const int CSSM_APPLEFILEDL_ROLLBACK1 = 2;
-
-const int CSSM_APPLEFILEDL_TAKE_FILE_LOCK1 = 3;
-
-const int CSSM_APPLEFILEDL_MAKE_BACKUP1 = 4;
-
-const int CSSM_APPLEFILEDL_MAKE_COPY1 = 5;
-
-const int CSSM_APPLEFILEDL_DELETE_FILE1 = 6;
-
-const int CSSM_APPLE_UNLOCK_TYPE_KEY_DIRECT1 = 1;
-
-const int CSSM_APPLE_UNLOCK_TYPE_WRAPPED_PRIVATE1 = 2;
-
-const int CSSM_APPLE_UNLOCK_TYPE_KEYBAG1 = 3;
-
-const int CSSMERR_APPLEDL_INVALID_OPEN_PARAMETERS1 = -2147412992;
-
-const int CSSMERR_APPLEDL_DISK_FULL1 = -2147412991;
-
-const int CSSMERR_APPLEDL_QUOTA_EXCEEDED1 = -2147412990;
-
-const int CSSMERR_APPLEDL_FILE_TOO_BIG1 = -2147412989;
-
-const int CSSMERR_APPLEDL_INVALID_DATABASE_BLOB1 = -2147412988;
-
-const int CSSMERR_APPLEDL_INVALID_KEY_BLOB1 = -2147412987;
-
-const int CSSMERR_APPLEDL_INCOMPATIBLE_DATABASE_BLOB1 = -2147412986;
-
-const int CSSMERR_APPLEDL_INCOMPATIBLE_KEY_BLOB1 = -2147412985;
-
-const int CSSMERR_APPLETP_HOSTNAME_MISMATCH1 = -2147408896;
-
-const int CSSMERR_APPLETP_UNKNOWN_CRITICAL_EXTEN1 = -2147408895;
-
-const int CSSMERR_APPLETP_NO_BASIC_CONSTRAINTS1 = -2147408894;
-
-const int CSSMERR_APPLETP_INVALID_CA1 = -2147408893;
-
-const int CSSMERR_APPLETP_INVALID_AUTHORITY_ID1 = -2147408892;
-
-const int CSSMERR_APPLETP_INVALID_SUBJECT_ID1 = -2147408891;
-
-const int CSSMERR_APPLETP_INVALID_KEY_USAGE1 = -2147408890;
-
-const int CSSMERR_APPLETP_INVALID_EXTENDED_KEY_USAGE1 = -2147408889;
-
-const int CSSMERR_APPLETP_INVALID_ID_LINKAGE1 = -2147408888;
-
-const int CSSMERR_APPLETP_PATH_LEN_CONSTRAINT1 = -2147408887;
-
-const int CSSMERR_APPLETP_INVALID_ROOT1 = -2147408886;
-
-const int CSSMERR_APPLETP_CRL_EXPIRED1 = -2147408885;
-
-const int CSSMERR_APPLETP_CRL_NOT_VALID_YET1 = -2147408884;
-
-const int CSSMERR_APPLETP_CRL_NOT_FOUND1 = -2147408883;
-
-const int CSSMERR_APPLETP_CRL_SERVER_DOWN1 = -2147408882;
-
-const int CSSMERR_APPLETP_CRL_BAD_URI1 = -2147408881;
-
-const int CSSMERR_APPLETP_UNKNOWN_CERT_EXTEN1 = -2147408880;
-
-const int CSSMERR_APPLETP_UNKNOWN_CRL_EXTEN1 = -2147408879;
-
-const int CSSMERR_APPLETP_CRL_NOT_TRUSTED1 = -2147408878;
-
-const int CSSMERR_APPLETP_CRL_INVALID_ANCHOR_CERT1 = -2147408877;
-
-const int CSSMERR_APPLETP_CRL_POLICY_FAIL1 = -2147408876;
-
-const int CSSMERR_APPLETP_IDP_FAIL1 = -2147408875;
-
-const int CSSMERR_APPLETP_CERT_NOT_FOUND_FROM_ISSUER1 = -2147408874;
-
-const int CSSMERR_APPLETP_BAD_CERT_FROM_ISSUER1 = -2147408873;
-
-const int CSSMERR_APPLETP_SMIME_EMAIL_ADDRS_NOT_FOUND1 = -2147408872;
-
-const int CSSMERR_APPLETP_SMIME_BAD_EXT_KEY_USE1 = -2147408871;
-
-const int CSSMERR_APPLETP_SMIME_BAD_KEY_USE1 = -2147408870;
-
-const int CSSMERR_APPLETP_SMIME_KEYUSAGE_NOT_CRITICAL1 = -2147408869;
-
-const int CSSMERR_APPLETP_SMIME_NO_EMAIL_ADDRS1 = -2147408868;
-
-const int CSSMERR_APPLETP_SMIME_SUBJ_ALT_NAME_NOT_CRIT1 = -2147408867;
-
-const int CSSMERR_APPLETP_SSL_BAD_EXT_KEY_USE1 = -2147408866;
-
-const int CSSMERR_APPLETP_OCSP_BAD_RESPONSE1 = -2147408865;
-
-const int CSSMERR_APPLETP_OCSP_BAD_REQUEST1 = -2147408864;
-
-const int CSSMERR_APPLETP_OCSP_UNAVAILABLE1 = -2147408863;
-
-const int CSSMERR_APPLETP_OCSP_STATUS_UNRECOGNIZED1 = -2147408862;
-
-const int CSSMERR_APPLETP_INCOMPLETE_REVOCATION_CHECK1 = -2147408861;
-
-const int CSSMERR_APPLETP_NETWORK_FAILURE1 = -2147408860;
-
-const int CSSMERR_APPLETP_OCSP_NOT_TRUSTED1 = -2147408859;
-
-const int CSSMERR_APPLETP_OCSP_INVALID_ANCHOR_CERT1 = -2147408858;
-
-const int CSSMERR_APPLETP_OCSP_SIG_ERROR1 = -2147408857;
-
-const int CSSMERR_APPLETP_OCSP_NO_SIGNER1 = -2147408856;
-
-const int CSSMERR_APPLETP_OCSP_RESP_MALFORMED_REQ1 = -2147408855;
-
-const int CSSMERR_APPLETP_OCSP_RESP_INTERNAL_ERR1 = -2147408854;
-
-const int CSSMERR_APPLETP_OCSP_RESP_TRY_LATER1 = -2147408853;
-
-const int CSSMERR_APPLETP_OCSP_RESP_SIG_REQUIRED1 = -2147408852;
-
-const int CSSMERR_APPLETP_OCSP_RESP_UNAUTHORIZED1 = -2147408851;
-
-const int CSSMERR_APPLETP_OCSP_NONCE_MISMATCH1 = -2147408850;
-
-const int CSSMERR_APPLETP_CS_BAD_CERT_CHAIN_LENGTH1 = -2147408849;
-
-const int CSSMERR_APPLETP_CS_NO_BASIC_CONSTRAINTS1 = -2147408848;
-
-const int CSSMERR_APPLETP_CS_BAD_PATH_LENGTH1 = -2147408847;
-
-const int CSSMERR_APPLETP_CS_NO_EXTENDED_KEY_USAGE1 = -2147408846;
-
-const int CSSMERR_APPLETP_CODE_SIGN_DEVELOPMENT1 = -2147408845;
-
-const int CSSMERR_APPLETP_RS_BAD_CERT_CHAIN_LENGTH1 = -2147408844;
-
-const int CSSMERR_APPLETP_RS_BAD_EXTENDED_KEY_USAGE1 = -2147408843;
-
-const int CSSMERR_APPLETP_TRUST_SETTING_DENY1 = -2147408842;
-
-const int CSSMERR_APPLETP_INVALID_EMPTY_SUBJECT1 = -2147408841;
-
-const int CSSMERR_APPLETP_UNKNOWN_QUAL_CERT_STATEMENT1 = -2147408840;
-
-const int CSSMERR_APPLETP_MISSING_REQUIRED_EXTENSION1 = -2147408839;
-
-const int CSSMERR_APPLETP_EXT_KEYUSAGE_NOT_CRITICAL1 = -2147408838;
-
-const int CSSMERR_APPLETP_IDENTIFIER_MISSING1 = -2147408837;
-
-const int CSSMERR_APPLETP_CA_PIN_MISMATCH1 = -2147408836;
-
-const int CSSMERR_APPLETP_LEAF_PIN_MISMATCH1 = -2147408835;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_QUEUED1 = -2147408796;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_REDIRECT1 = -2147408795;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_SERVER_ERR1 = -2147408794;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_SERVER_PARAM1 = -2147408793;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_SERVER_AUTH1 = -2147408792;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_SERVER_UNIMPL1 = -2147408791;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_SERVER_NOT_AVAIL1 = -2147408790;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_SERVER_ALREADY_EXIST1 = -2147408789;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_SERVER_SERVICE_ERROR1 = -2147408788;
-
-const int CSSMERR_APPLE_DOTMAC_REQ_IS_PENDING1 = -2147408787;
-
-const int CSSMERR_APPLE_DOTMAC_NO_REQ_PENDING1 = -2147408786;
-
-const int CSSMERR_APPLE_DOTMAC_CSR_VERIFY_FAIL1 = -2147408785;
-
-const int CSSMERR_APPLE_DOTMAC_FAILED_CONSISTENCY_CHECK1 = -2147408784;
-
-const int CSSM_APPLEDL_OPEN_PARAMETERS_VERSION1 = 1;
-
-const int CSSM_APPLECSPDL_DB_LOCK1 = 0;
-
-const int CSSM_APPLECSPDL_DB_UNLOCK1 = 1;
-
-const int CSSM_APPLECSPDL_DB_GET_SETTINGS1 = 2;
-
-const int CSSM_APPLECSPDL_DB_SET_SETTINGS1 = 3;
-
-const int CSSM_APPLECSPDL_DB_IS_LOCKED1 = 4;
-
-const int CSSM_APPLECSPDL_DB_CHANGE_PASSWORD1 = 5;
-
-const int CSSM_APPLECSPDL_DB_GET_HANDLE1 = 6;
-
-const int CSSM_APPLESCPDL_CSP_GET_KEYHANDLE1 = 7;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_81 = 8;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_91 = 9;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_101 = 10;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_111 = 11;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_121 = 12;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_131 = 13;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_141 = 14;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_151 = 15;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_161 = 16;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_171 = 17;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_181 = 18;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_191 = 19;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_201 = 20;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_211 = 21;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_221 = 22;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_231 = 23;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_241 = 24;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_251 = 25;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_261 = 26;
-
-const int CSSM_APPLE_PRIVATE_CSPDL_CODE_271 = 27;
-
-const int CSSM_APPLECSP_KEYDIGEST1 = 256;
-
-const int CSSM_APPLECSP_PUBKEY1 = 257;
-
-const int CSSM_KEYBLOB_WRAPPED_FORMAT_APPLE_CUSTOM1 = 100;
-
-const int CSSM_KEYBLOB_WRAPPED_FORMAT_OPENSSL1 = 101;
-
-const int CSSM_KEYBLOB_WRAPPED_FORMAT_OPENSSH11 = 102;
-
-const int CSSM_ATTRIBUTE_VENDOR_DEFINED1 = 8388608;
-
-const int CSSM_ATTRIBUTE_PUBLIC_KEY1 = 1082130432;
-
-const int CSSM_ATTRIBUTE_FEE_PRIME_TYPE1 = 276824065;
-
-const int CSSM_ATTRIBUTE_FEE_CURVE_TYPE1 = 276824066;
-
-const int CSSM_ATTRIBUTE_ASC_OPTIMIZATION1 = 276824067;
-
-const int CSSM_ATTRIBUTE_RSA_BLINDING1 = 276824068;
-
-const int CSSM_ATTRIBUTE_PARAM_KEY1 = 1082130437;
-
-const int CSSM_ATTRIBUTE_PROMPT1 = 545259526;
-
-const int CSSM_ATTRIBUTE_ALERT_TITLE1 = 545259527;
-
-const int CSSM_ATTRIBUTE_VERIFY_PASSPHRASE1 = 276824072;
-
-const int CSSM_FEE_PRIME_TYPE_DEFAULT1 = 0;
-
-const int CSSM_FEE_PRIME_TYPE_MERSENNE1 = 1;
-
-const int CSSM_FEE_PRIME_TYPE_FEE1 = 2;
-
-const int CSSM_FEE_PRIME_TYPE_GENERAL1 = 3;
-
-const int CSSM_FEE_CURVE_TYPE_DEFAULT1 = 0;
-
-const int CSSM_FEE_CURVE_TYPE_MONTGOMERY1 = 1;
-
-const int CSSM_FEE_CURVE_TYPE_WEIERSTRASS1 = 2;
-
-const int CSSM_FEE_CURVE_TYPE_ANSI_X9_621 = 3;
-
-const int CSSM_ASC_OPTIMIZE_DEFAULT1 = 0;
-
-const int CSSM_ASC_OPTIMIZE_SIZE1 = 1;
-
-const int CSSM_ASC_OPTIMIZE_SECURITY1 = 2;
-
-const int CSSM_ASC_OPTIMIZE_TIME1 = 3;
-
-const int CSSM_ASC_OPTIMIZE_TIME_SIZE1 = 4;
-
-const int CSSM_ASC_OPTIMIZE_ASCII1 = 5;
-
-const int CSSM_KEYATTR_PARTIAL1 = 65536;
-
-const int CSSM_KEYATTR_PUBLIC_KEY_ENCRYPT1 = 131072;
-
-const int CSSM_TP_ACTION_REQUIRE_CRL_PER_CERT1 = 1;
-
-const int CSSM_TP_ACTION_FETCH_CRL_FROM_NET1 = 2;
-
-const int CSSM_TP_ACTION_CRL_SUFFICIENT1 = 4;
-
-const int CSSM_TP_ACTION_REQUIRE_CRL_IF_PRESENT1 = 8;
-
-const int CSSM_TP_ACTION_ALLOW_EXPIRED1 = 1;
-
-const int CSSM_TP_ACTION_LEAF_IS_CA1 = 2;
-
-const int CSSM_TP_ACTION_FETCH_CERT_FROM_NET1 = 4;
-
-const int CSSM_TP_ACTION_ALLOW_EXPIRED_ROOT1 = 8;
-
-const int CSSM_TP_ACTION_REQUIRE_REV_PER_CERT1 = 16;
-
-const int CSSM_TP_ACTION_TRUST_SETTINGS1 = 32;
-
-const int CSSM_TP_ACTION_IMPLICIT_ANCHORS1 = 64;
-
-const int CSSM_CERT_STATUS_EXPIRED1 = 1;
-
-const int CSSM_CERT_STATUS_NOT_VALID_YET1 = 2;
-
-const int CSSM_CERT_STATUS_IS_IN_INPUT_CERTS1 = 4;
-
-const int CSSM_CERT_STATUS_IS_IN_ANCHORS1 = 8;
-
-const int CSSM_CERT_STATUS_IS_ROOT1 = 16;
-
-const int CSSM_CERT_STATUS_IS_FROM_NET1 = 32;
-
-const int CSSM_CERT_STATUS_TRUST_SETTINGS_FOUND_USER1 = 64;
-
-const int CSSM_CERT_STATUS_TRUST_SETTINGS_FOUND_ADMIN1 = 128;
-
-const int CSSM_CERT_STATUS_TRUST_SETTINGS_FOUND_SYSTEM1 = 256;
-
-const int CSSM_CERT_STATUS_TRUST_SETTINGS_TRUST1 = 512;
-
-const int CSSM_CERT_STATUS_TRUST_SETTINGS_DENY1 = 1024;
-
-const int CSSM_CERT_STATUS_TRUST_SETTINGS_IGNORED_ERROR1 = 2048;
-
-const int CSSM_EVIDENCE_FORM_APPLE_HEADER1 = -2147483648;
-
-const int CSSM_EVIDENCE_FORM_APPLE_CERTGROUP1 = -2147483647;
-
-const int CSSM_EVIDENCE_FORM_APPLE_CERT_INFO1 = -2147483646;
-
-const int CSSM_APPLEX509CL_OBTAIN_CSR1 = 0;
-
-const int CSSM_APPLEX509CL_VERIFY_CSR1 = 1;
-
-const int kSecSubjectItemAttr1 = 1937072746;
-
-const int kSecIssuerItemAttr1 = 1769173877;
-
-const int kSecSerialNumberItemAttr1 = 1936614002;
-
-const int kSecPublicKeyHashItemAttr1 = 1752198009;
-
-const int kSecSubjectKeyIdentifierItemAttr1 = 1936419172;
-
-const int kSecCertTypeItemAttr1 = 1668577648;
-
-const int kSecCertEncodingItemAttr1 = 1667591779;
-
-const int SSL_NULL_WITH_NULL_NULL1 = 0;
-
-const int SSL_RSA_WITH_NULL_MD51 = 1;
-
-const int SSL_RSA_WITH_NULL_SHA1 = 2;
-
-const int SSL_RSA_EXPORT_WITH_RC4_40_MD51 = 3;
-
-const int SSL_RSA_WITH_RC4_128_MD51 = 4;
-
-const int SSL_RSA_WITH_RC4_128_SHA1 = 5;
-
-const int SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD51 = 6;
-
-const int SSL_RSA_WITH_IDEA_CBC_SHA1 = 7;
-
-const int SSL_RSA_EXPORT_WITH_DES40_CBC_SHA1 = 8;
-
-const int SSL_RSA_WITH_DES_CBC_SHA1 = 9;
-
-const int SSL_RSA_WITH_3DES_EDE_CBC_SHA1 = 10;
-
-const int SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA1 = 11;
-
-const int SSL_DH_DSS_WITH_DES_CBC_SHA1 = 12;
-
-const int SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA1 = 13;
-
-const int SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA1 = 14;
-
-const int SSL_DH_RSA_WITH_DES_CBC_SHA1 = 15;
-
-const int SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA1 = 16;
-
-const int SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA1 = 17;
-
-const int SSL_DHE_DSS_WITH_DES_CBC_SHA1 = 18;
-
-const int SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA1 = 19;
-
-const int SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA1 = 20;
-
-const int SSL_DHE_RSA_WITH_DES_CBC_SHA1 = 21;
-
-const int SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA1 = 22;
-
-const int SSL_DH_anon_EXPORT_WITH_RC4_40_MD51 = 23;
-
-const int SSL_DH_anon_WITH_RC4_128_MD51 = 24;
-
-const int SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA1 = 25;
-
-const int SSL_DH_anon_WITH_DES_CBC_SHA1 = 26;
-
-const int SSL_DH_anon_WITH_3DES_EDE_CBC_SHA1 = 27;
-
-const int SSL_FORTEZZA_DMS_WITH_NULL_SHA1 = 28;
-
-const int SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA1 = 29;
-
-const int TLS_RSA_WITH_AES_128_CBC_SHA1 = 47;
-
-const int TLS_DH_DSS_WITH_AES_128_CBC_SHA1 = 48;
-
-const int TLS_DH_RSA_WITH_AES_128_CBC_SHA1 = 49;
-
-const int TLS_DHE_DSS_WITH_AES_128_CBC_SHA1 = 50;
-
-const int TLS_DHE_RSA_WITH_AES_128_CBC_SHA1 = 51;
-
-const int TLS_DH_anon_WITH_AES_128_CBC_SHA1 = 52;
-
-const int TLS_RSA_WITH_AES_256_CBC_SHA1 = 53;
-
-const int TLS_DH_DSS_WITH_AES_256_CBC_SHA1 = 54;
-
-const int TLS_DH_RSA_WITH_AES_256_CBC_SHA1 = 55;
-
-const int TLS_DHE_DSS_WITH_AES_256_CBC_SHA1 = 56;
-
-const int TLS_DHE_RSA_WITH_AES_256_CBC_SHA1 = 57;
-
-const int TLS_DH_anon_WITH_AES_256_CBC_SHA1 = 58;
-
-const int TLS_ECDH_ECDSA_WITH_NULL_SHA1 = -16383;
-
-const int TLS_ECDH_ECDSA_WITH_RC4_128_SHA1 = -16382;
-
-const int TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA1 = -16381;
-
-const int TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA1 = -16380;
-
-const int TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA1 = -16379;
-
-const int TLS_ECDHE_ECDSA_WITH_NULL_SHA1 = -16378;
-
-const int TLS_ECDHE_ECDSA_WITH_RC4_128_SHA1 = -16377;
-
-const int TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA1 = -16376;
-
-const int TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA1 = -16375;
-
-const int TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA1 = -16374;
-
-const int TLS_ECDH_RSA_WITH_NULL_SHA1 = -16373;
-
-const int TLS_ECDH_RSA_WITH_RC4_128_SHA1 = -16372;
-
-const int TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA1 = -16371;
-
-const int TLS_ECDH_RSA_WITH_AES_128_CBC_SHA1 = -16370;
-
-const int TLS_ECDH_RSA_WITH_AES_256_CBC_SHA1 = -16369;
-
-const int TLS_ECDHE_RSA_WITH_NULL_SHA1 = -16368;
-
-const int TLS_ECDHE_RSA_WITH_RC4_128_SHA1 = -16367;
-
-const int TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA1 = -16366;
-
-const int TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA1 = -16365;
-
-const int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA1 = -16364;
-
-const int TLS_ECDH_anon_WITH_NULL_SHA1 = -16363;
-
-const int TLS_ECDH_anon_WITH_RC4_128_SHA1 = -16362;
-
-const int TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA1 = -16361;
-
-const int TLS_ECDH_anon_WITH_AES_128_CBC_SHA1 = -16360;
-
-const int TLS_ECDH_anon_WITH_AES_256_CBC_SHA1 = -16359;
-
-const int TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA1 = -16331;
-
-const int TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA1 = -16330;
-
-const int TLS_PSK_WITH_CHACHA20_POLY1305_SHA2561 = -13141;
-
-const int TLS_NULL_WITH_NULL_NULL1 = 0;
-
-const int TLS_RSA_WITH_NULL_MD51 = 1;
-
-const int TLS_RSA_WITH_NULL_SHA1 = 2;
-
-const int TLS_RSA_WITH_RC4_128_MD51 = 4;
-
-const int TLS_RSA_WITH_RC4_128_SHA1 = 5;
-
-const int TLS_RSA_WITH_3DES_EDE_CBC_SHA1 = 10;
-
-const int TLS_RSA_WITH_NULL_SHA2561 = 59;
-
-const int TLS_RSA_WITH_AES_128_CBC_SHA2561 = 60;
-
-const int TLS_RSA_WITH_AES_256_CBC_SHA2561 = 61;
-
-const int TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA1 = 13;
-
-const int TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA1 = 16;
-
-const int TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA1 = 19;
-
-const int TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA1 = 22;
-
-const int TLS_DH_DSS_WITH_AES_128_CBC_SHA2561 = 62;
-
-const int TLS_DH_RSA_WITH_AES_128_CBC_SHA2561 = 63;
-
-const int TLS_DHE_DSS_WITH_AES_128_CBC_SHA2561 = 64;
-
-const int TLS_DHE_RSA_WITH_AES_128_CBC_SHA2561 = 103;
-
-const int TLS_DH_DSS_WITH_AES_256_CBC_SHA2561 = 104;
-
-const int TLS_DH_RSA_WITH_AES_256_CBC_SHA2561 = 105;
-
-const int TLS_DHE_DSS_WITH_AES_256_CBC_SHA2561 = 106;
-
-const int TLS_DHE_RSA_WITH_AES_256_CBC_SHA2561 = 107;
-
-const int TLS_DH_anon_WITH_RC4_128_MD51 = 24;
-
-const int TLS_DH_anon_WITH_3DES_EDE_CBC_SHA1 = 27;
-
-const int TLS_DH_anon_WITH_AES_128_CBC_SHA2561 = 108;
-
-const int TLS_DH_anon_WITH_AES_256_CBC_SHA2561 = 109;
-
-const int TLS_PSK_WITH_RC4_128_SHA1 = 138;
-
-const int TLS_PSK_WITH_3DES_EDE_CBC_SHA1 = 139;
-
-const int TLS_PSK_WITH_AES_128_CBC_SHA1 = 140;
-
-const int TLS_PSK_WITH_AES_256_CBC_SHA1 = 141;
-
-const int TLS_DHE_PSK_WITH_RC4_128_SHA1 = 142;
-
-const int TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA1 = 143;
-
-const int TLS_DHE_PSK_WITH_AES_128_CBC_SHA1 = 144;
-
-const int TLS_DHE_PSK_WITH_AES_256_CBC_SHA1 = 145;
-
-const int TLS_RSA_PSK_WITH_RC4_128_SHA1 = 146;
-
-const int TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA1 = 147;
-
-const int TLS_RSA_PSK_WITH_AES_128_CBC_SHA1 = 148;
-
-const int TLS_RSA_PSK_WITH_AES_256_CBC_SHA1 = 149;
-
-const int TLS_PSK_WITH_NULL_SHA1 = 44;
-
-const int TLS_DHE_PSK_WITH_NULL_SHA1 = 45;
-
-const int TLS_RSA_PSK_WITH_NULL_SHA1 = 46;
-
-const int TLS_RSA_WITH_AES_128_GCM_SHA2561 = 156;
-
-const int TLS_RSA_WITH_AES_256_GCM_SHA3841 = 157;
-
-const int TLS_DHE_RSA_WITH_AES_128_GCM_SHA2561 = 158;
-
-const int TLS_DHE_RSA_WITH_AES_256_GCM_SHA3841 = 159;
-
-const int TLS_DH_RSA_WITH_AES_128_GCM_SHA2561 = 160;
-
-const int TLS_DH_RSA_WITH_AES_256_GCM_SHA3841 = 161;
-
-const int TLS_DHE_DSS_WITH_AES_128_GCM_SHA2561 = 162;
-
-const int TLS_DHE_DSS_WITH_AES_256_GCM_SHA3841 = 163;
-
-const int TLS_DH_DSS_WITH_AES_128_GCM_SHA2561 = 164;
-
-const int TLS_DH_DSS_WITH_AES_256_GCM_SHA3841 = 165;
-
-const int TLS_DH_anon_WITH_AES_128_GCM_SHA2561 = 166;
-
-const int TLS_DH_anon_WITH_AES_256_GCM_SHA3841 = 167;
-
-const int TLS_PSK_WITH_AES_128_GCM_SHA2561 = 168;
-
-const int TLS_PSK_WITH_AES_256_GCM_SHA3841 = 169;
-
-const int TLS_DHE_PSK_WITH_AES_128_GCM_SHA2561 = 170;
-
-const int TLS_DHE_PSK_WITH_AES_256_GCM_SHA3841 = 171;
-
-const int TLS_RSA_PSK_WITH_AES_128_GCM_SHA2561 = 172;
-
-const int TLS_RSA_PSK_WITH_AES_256_GCM_SHA3841 = 173;
-
-const int TLS_PSK_WITH_AES_128_CBC_SHA2561 = 174;
-
-const int TLS_PSK_WITH_AES_256_CBC_SHA3841 = 175;
-
-const int TLS_PSK_WITH_NULL_SHA2561 = 176;
-
-const int TLS_PSK_WITH_NULL_SHA3841 = 177;
-
-const int TLS_DHE_PSK_WITH_AES_128_CBC_SHA2561 = 178;
-
-const int TLS_DHE_PSK_WITH_AES_256_CBC_SHA3841 = 179;
-
-const int TLS_DHE_PSK_WITH_NULL_SHA2561 = 180;
-
-const int TLS_DHE_PSK_WITH_NULL_SHA3841 = 181;
-
-const int TLS_RSA_PSK_WITH_AES_128_CBC_SHA2561 = 182;
-
-const int TLS_RSA_PSK_WITH_AES_256_CBC_SHA3841 = 183;
-
-const int TLS_RSA_PSK_WITH_NULL_SHA2561 = 184;
-
-const int TLS_RSA_PSK_WITH_NULL_SHA3841 = 185;
-
-const int TLS_AES_128_GCM_SHA2561 = 4865;
-
-const int TLS_AES_256_GCM_SHA3841 = 4866;
-
-const int TLS_CHACHA20_POLY1305_SHA2561 = 4867;
-
-const int TLS_AES_128_CCM_SHA2561 = 4868;
-
-const int TLS_AES_128_CCM_8_SHA2561 = 4869;
-
-const int TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA2561 = -16349;
-
-const int TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA3841 = -16348;
-
-const int TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA2561 = -16347;
-
-const int TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA3841 = -16346;
-
-const int TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA2561 = -16345;
-
-const int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA3841 = -16344;
-
-const int TLS_ECDH_RSA_WITH_AES_128_CBC_SHA2561 = -16343;
-
-const int TLS_ECDH_RSA_WITH_AES_256_CBC_SHA3841 = -16342;
-
-const int TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA2561 = -16341;
-
-const int TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA3841 = -16340;
-
-const int TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA2561 = -16339;
-
-const int TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA3841 = -16338;
-
-const int TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA2561 = -16337;
-
-const int TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA3841 = -16336;
-
-const int TLS_ECDH_RSA_WITH_AES_128_GCM_SHA2561 = -16335;
-
-const int TLS_ECDH_RSA_WITH_AES_256_GCM_SHA3841 = -16334;
-
-const int TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA2561 = -13144;
-
-const int TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA2561 = -13143;
-
-const int TLS_EMPTY_RENEGOTIATION_INFO_SCSV1 = 255;
-
-const int SSL_RSA_WITH_RC2_CBC_MD51 = -128;
-
-const int SSL_RSA_WITH_IDEA_CBC_MD51 = -127;
-
-const int SSL_RSA_WITH_DES_CBC_MD51 = -126;
-
-const int SSL_RSA_WITH_3DES_EDE_CBC_MD51 = -125;
-
-const int SSL_NO_SUCH_CIPHERSUITE1 = -1;
-
 const int __API_TO_BE_DEPRECATED = 100000;
 
 const int __API_TO_BE_DEPRECATED_MACOS = 100000;
@@ -86587,6 +90382,10 @@
 
 const int __MAC_14_5 = 140500;
 
+const int __MAC_15_0 = 150000;
+
+const int __MAC_15_1 = 150100;
+
 const int __IPHONE_2_0 = 20000;
 
 const int __IPHONE_2_1 = 20100;
@@ -86745,6 +90544,10 @@
 
 const int __IPHONE_17_5 = 170500;
 
+const int __IPHONE_18_0 = 180000;
+
+const int __IPHONE_18_1 = 180100;
+
 const int __WATCHOS_1_0 = 10000;
 
 const int __WATCHOS_2_0 = 20000;
@@ -86839,6 +90642,10 @@
 
 const int __WATCHOS_10_5 = 100500;
 
+const int __WATCHOS_11_0 = 110000;
+
+const int __WATCHOS_11_1 = 110100;
+
 const int __TVOS_9_0 = 90000;
 
 const int __TVOS_9_1 = 90100;
@@ -86935,6 +90742,10 @@
 
 const int __TVOS_17_5 = 170500;
 
+const int __TVOS_18_0 = 180000;
+
+const int __TVOS_18_1 = 180100;
+
 const int __BRIDGEOS_2_0 = 20000;
 
 const int __BRIDGEOS_3_0 = 30000;
@@ -86987,6 +90798,10 @@
 
 const int __BRIDGEOS_8_5 = 80500;
 
+const int __BRIDGEOS_9_0 = 90000;
+
+const int __BRIDGEOS_9_1 = 90100;
+
 const int __DRIVERKIT_19_0 = 190000;
 
 const int __DRIVERKIT_20_0 = 200000;
@@ -87013,12 +90828,20 @@
 
 const int __DRIVERKIT_23_5 = 230500;
 
+const int __DRIVERKIT_24_0 = 240000;
+
+const int __DRIVERKIT_24_1 = 240100;
+
 const int __VISIONOS_1_0 = 10000;
 
 const int __VISIONOS_1_1 = 10100;
 
 const int __VISIONOS_1_2 = 10200;
 
+const int __VISIONOS_2_0 = 20000;
+
+const int __VISIONOS_2_1 = 20100;
+
 const int MAC_OS_X_VERSION_10_0 = 1000;
 
 const int MAC_OS_X_VERSION_10_1 = 1010;
@@ -87141,9 +90964,13 @@
 
 const int MAC_OS_VERSION_14_5 = 140500;
 
-const int __MAC_OS_X_VERSION_MIN_REQUIRED = 140000;
+const int MAC_OS_VERSION_15_0 = 150000;
 
-const int __MAC_OS_X_VERSION_MAX_ALLOWED = 140500;
+const int MAC_OS_VERSION_15_1 = 150100;
+
+const int __MAC_OS_X_VERSION_MIN_REQUIRED = 150000;
+
+const int __MAC_OS_X_VERSION_MAX_ALLOWED = 150100;
 
 const int __ENABLE_LEGACY_MAC_AVAILABILITY = 1;
 
@@ -87743,14 +91570,14 @@
 
 const int __DARWIN_PDP_ENDIAN = 3412;
 
-const int __DARWIN_BYTE_ORDER = 1234;
-
 const int LITTLE_ENDIAN = 1234;
 
 const int BIG_ENDIAN = 4321;
 
 const int PDP_ENDIAN = 3412;
 
+const int __DARWIN_BYTE_ORDER = 1234;
+
 const int BYTE_ORDER = 1234;
 
 const int NULL = 0;
@@ -87761,12 +91588,6 @@
 
 const int RAND_MAX = 2147483647;
 
-const int MAC_OS_X_VERSION_MIN_REQUIRED = 140000;
-
-const int MAC_OS_X_VERSION_MAX_ALLOWED = 140000;
-
-const int __AVAILABILITY_MACROS_USES_AVAILABILITY = 1;
-
 const int TARGET_OS_RTKIT = 0;
 
 const int TARGET_RT_LITTLE_ENDIAN = 1;
@@ -87813,36 +91634,12 @@
 
 const int FD_SETSIZE = 1024;
 
-const int OBJC_API_VERSION = 2;
-
-const int OBJC_NO_GC = 1;
-
-const int NS_ENFORCE_NSOBJECT_DESIGNATED_INITIALIZER = 1;
-
-const int OBJC_OLD_DISPATCH_PROTOTYPES = 0;
-
 const int __bool_true_false_are_defined = 1;
 
 const int true1 = 1;
 
 const int false1 = 0;
 
-const int OBJC_BOOL_IS_BOOL = 1;
-
-const int YES = 1;
-
-const int NO = 0;
-
-const int NSIntegerMax = 9223372036854775807;
-
-const int NSIntegerMin = -9223372036854775808;
-
-const int NSUIntegerMax = -1;
-
-const int NSINTEGER_DEFINED = 1;
-
-const int __GNUC_VA_LIST = 1;
-
 const int __DARWIN_CLK_TCK = 100;
 
 const int MB_LEN_MAX = 6;
@@ -87899,184 +91696,8 @@
 
 const int QUAD_MIN = -9223372036854775808;
 
-const int ARG_MAX = 1048576;
-
-const int CHILD_MAX = 266;
-
-const int GID_MAX = 2147483647;
-
-const int LINK_MAX = 32767;
-
-const int MAX_CANON = 1024;
-
-const int MAX_INPUT = 1024;
-
-const int NAME_MAX = 255;
-
-const int NGROUPS_MAX = 16;
-
-const int UID_MAX = 2147483647;
-
-const int OPEN_MAX = 10240;
-
-const int PATH_MAX = 1024;
-
-const int PIPE_BUF = 512;
-
-const int BC_BASE_MAX = 99;
-
-const int BC_DIM_MAX = 2048;
-
-const int BC_SCALE_MAX = 99;
-
-const int BC_STRING_MAX = 1000;
-
-const int CHARCLASS_NAME_MAX = 14;
-
-const int COLL_WEIGHTS_MAX = 2;
-
-const int EQUIV_CLASS_MAX = 2;
-
-const int EXPR_NEST_MAX = 32;
-
-const int LINE_MAX = 2048;
-
-const int RE_DUP_MAX = 255;
-
-const int NZERO = 20;
-
-const int _POSIX_ARG_MAX = 4096;
-
-const int _POSIX_CHILD_MAX = 25;
-
-const int _POSIX_LINK_MAX = 8;
-
-const int _POSIX_MAX_CANON = 255;
-
-const int _POSIX_MAX_INPUT = 255;
-
-const int _POSIX_NAME_MAX = 14;
-
-const int _POSIX_NGROUPS_MAX = 8;
-
-const int _POSIX_OPEN_MAX = 20;
-
-const int _POSIX_PATH_MAX = 256;
-
-const int _POSIX_PIPE_BUF = 512;
-
-const int _POSIX_SSIZE_MAX = 32767;
-
-const int _POSIX_STREAM_MAX = 8;
-
-const int _POSIX_TZNAME_MAX = 6;
-
-const int _POSIX2_BC_BASE_MAX = 99;
-
-const int _POSIX2_BC_DIM_MAX = 2048;
-
-const int _POSIX2_BC_SCALE_MAX = 99;
-
-const int _POSIX2_BC_STRING_MAX = 1000;
-
-const int _POSIX2_EQUIV_CLASS_MAX = 2;
-
-const int _POSIX2_EXPR_NEST_MAX = 32;
-
-const int _POSIX2_LINE_MAX = 2048;
-
-const int _POSIX2_RE_DUP_MAX = 255;
-
-const int _POSIX_AIO_LISTIO_MAX = 2;
-
-const int _POSIX_AIO_MAX = 1;
-
-const int _POSIX_DELAYTIMER_MAX = 32;
-
-const int _POSIX_MQ_OPEN_MAX = 8;
-
-const int _POSIX_MQ_PRIO_MAX = 32;
-
-const int _POSIX_RTSIG_MAX = 8;
-
-const int _POSIX_SEM_NSEMS_MAX = 256;
-
-const int _POSIX_SEM_VALUE_MAX = 32767;
-
-const int _POSIX_SIGQUEUE_MAX = 32;
-
-const int _POSIX_TIMER_MAX = 32;
-
-const int _POSIX_CLOCKRES_MIN = 20000000;
-
-const int _POSIX_THREAD_DESTRUCTOR_ITERATIONS = 4;
-
 const int _POSIX_THREAD_KEYS_MAX = 128;
 
-const int _POSIX_THREAD_THREADS_MAX = 64;
-
-const int PTHREAD_DESTRUCTOR_ITERATIONS = 4;
-
-const int PTHREAD_KEYS_MAX = 512;
-
-const int PTHREAD_STACK_MIN = 16384;
-
-const int _POSIX_HOST_NAME_MAX = 255;
-
-const int _POSIX_LOGIN_NAME_MAX = 9;
-
-const int _POSIX_SS_REPL_MAX = 4;
-
-const int _POSIX_SYMLINK_MAX = 255;
-
-const int _POSIX_SYMLOOP_MAX = 8;
-
-const int _POSIX_TRACE_EVENT_NAME_MAX = 30;
-
-const int _POSIX_TRACE_NAME_MAX = 8;
-
-const int _POSIX_TRACE_SYS_MAX = 8;
-
-const int _POSIX_TRACE_USER_EVENT_MAX = 32;
-
-const int _POSIX_TTY_NAME_MAX = 9;
-
-const int _POSIX2_CHARCLASS_NAME_MAX = 14;
-
-const int _POSIX2_COLL_WEIGHTS_MAX = 2;
-
-const int _POSIX_RE_DUP_MAX = 255;
-
-const int OFF_MIN = -9223372036854775808;
-
-const int OFF_MAX = 9223372036854775807;
-
-const int PASS_MAX = 128;
-
-const int NL_ARGMAX = 9;
-
-const int NL_LANGMAX = 14;
-
-const int NL_MSGMAX = 32767;
-
-const int NL_NMAX = 1;
-
-const int NL_SETMAX = 255;
-
-const int NL_TEXTMAX = 2048;
-
-const int _XOPEN_IOV_MAX = 16;
-
-const int IOV_MAX = 1024;
-
-const int _XOPEN_NAME_MAX = 255;
-
-const int _XOPEN_PATH_MAX = 1024;
-
-const int NS_BLOCKS_AVAILABLE = 1;
-
-const int __COREFOUNDATION_CFAVAILABILITY__ = 1;
-
 const int API_TO_BE_DEPRECATED = 100000;
 
 const int API_TO_BE_DEPRECATED_MACOS = 100000;
@@ -88091,412 +91712,10 @@
 
 const int API_TO_BE_DEPRECATED_VISIONOS = 100000;
 
-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 UNIVERSAL_INTERFACES_VERSION = 1024;
-
-const int PRAGMA_IMPORT = 0;
-
-const int PRAGMA_ONCE = 0;
-
-const int PRAGMA_STRUCT_PACK = 1;
-
-const int PRAGMA_STRUCT_PACKPUSH = 1;
-
-const int PRAGMA_STRUCT_ALIGN = 0;
-
-const int PRAGMA_ENUM_PACK = 0;
-
-const int PRAGMA_ENUM_ALWAYSINT = 0;
-
-const int PRAGMA_ENUM_OPTIONS = 0;
-
-const int TYPE_EXTENDED = 0;
-
-const int TYPE_LONGDOUBLE_IS_DOUBLE = 0;
-
-const int TYPE_LONGLONG = 1;
-
-const int FUNCTION_PASCAL = 0;
-
-const int FUNCTION_DECLSPEC = 0;
-
-const int FUNCTION_WIN32CC = 0;
-
-const int TARGET_API_MAC_OS8 = 0;
-
-const int TARGET_API_MAC_CARBON = 1;
-
-const int TARGET_API_MAC_OSX = 1;
-
-const int TARGET_CARBON = 1;
-
-const int OLDROUTINENAMES = 0;
-
-const int OPAQUE_TOOLBOX_STRUCTS = 1;
-
-const int OPAQUE_UPP_TYPES = 1;
-
-const int ACCESSOR_CALLS_ARE_FUNCTIONS = 1;
-
-const int CALL_NOT_IN_CARBON = 0;
-
-const int MIXEDMODE_CALLS_ARE_FUNCTIONS = 1;
-
-const int ALLOW_OBSOLETE_CARBON_MACMEMORY = 0;
-
-const int ALLOW_OBSOLETE_CARBON_OSUTILS = 0;
-
-const int kInvalidID = 0;
-
 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 double NSTimeIntervalSince1970 = 978307200.0;
-
-const int __COREFOUNDATION_CFARRAY__ = 1;
-
 const int OS_OBJECT_HAVE_OBJC_SUPPORT = 0;
 
 const int OS_OBJECT_USE_OBJC = 0;
@@ -88505,472 +91724,6 @@
 
 const int OS_OBJECT_USE_OBJC_RETAIN_RELEASE = 0;
 
-const int SEC_OS_IPHONE = 0;
-
-const int SEC_OS_OSX = 1;
-
-const int SEC_OS_OSX_INCLUDES = 1;
-
-const int SECURITY_TYPE_UNIFICATION = 1;
-
-const int __COREFOUNDATION_COREFOUNDATION__ = 1;
-
-const int __COREFOUNDATION__ = 1;
-
-const String __ASSERT_FILE_NAME = 'temp_for_macros.hpp';
-
-const int _CACHED_RUNES = 256;
-
-const int _CRMASK = -256;
-
-const String _RUNE_MAGIC_A = 'RuneMagA';
-
-const int _CTYPE_A = 256;
-
-const int _CTYPE_C = 512;
-
-const int _CTYPE_D = 1024;
-
-const int _CTYPE_G = 2048;
-
-const int _CTYPE_L = 4096;
-
-const int _CTYPE_P = 8192;
-
-const int _CTYPE_S = 16384;
-
-const int _CTYPE_U = 32768;
-
-const int _CTYPE_X = 65536;
-
-const int _CTYPE_B = 131072;
-
-const int _CTYPE_R = 262144;
-
-const int _CTYPE_I = 524288;
-
-const int _CTYPE_T = 1048576;
-
-const int _CTYPE_Q = 2097152;
-
-const int _CTYPE_SW0 = 536870912;
-
-const int _CTYPE_SW1 = 1073741824;
-
-const int _CTYPE_SW2 = 2147483648;
-
-const int _CTYPE_SW3 = 3221225472;
-
-const int _CTYPE_SWM = 3758096384;
-
-const int _CTYPE_SWS = 30;
-
-const int EPERM = 1;
-
-const int ENOENT = 2;
-
-const int ESRCH = 3;
-
-const int EINTR = 4;
-
-const int EIO = 5;
-
-const int ENXIO = 6;
-
-const int E2BIG = 7;
-
-const int ENOEXEC = 8;
-
-const int EBADF = 9;
-
-const int ECHILD = 10;
-
-const int EDEADLK = 11;
-
-const int ENOMEM = 12;
-
-const int EACCES = 13;
-
-const int EFAULT = 14;
-
-const int ENOTBLK = 15;
-
-const int EBUSY = 16;
-
-const int EEXIST = 17;
-
-const int EXDEV = 18;
-
-const int ENODEV = 19;
-
-const int ENOTDIR = 20;
-
-const int EISDIR = 21;
-
-const int EINVAL = 22;
-
-const int ENFILE = 23;
-
-const int EMFILE = 24;
-
-const int ENOTTY = 25;
-
-const int ETXTBSY = 26;
-
-const int EFBIG = 27;
-
-const int ENOSPC = 28;
-
-const int ESPIPE = 29;
-
-const int EROFS = 30;
-
-const int EMLINK = 31;
-
-const int EPIPE = 32;
-
-const int EDOM = 33;
-
-const int ERANGE = 34;
-
-const int EAGAIN = 35;
-
-const int EWOULDBLOCK = 35;
-
-const int EINPROGRESS = 36;
-
-const int EALREADY = 37;
-
-const int ENOTSOCK = 38;
-
-const int EDESTADDRREQ = 39;
-
-const int EMSGSIZE = 40;
-
-const int EPROTOTYPE = 41;
-
-const int ENOPROTOOPT = 42;
-
-const int EPROTONOSUPPORT = 43;
-
-const int ESOCKTNOSUPPORT = 44;
-
-const int ENOTSUP = 45;
-
-const int EPFNOSUPPORT = 46;
-
-const int EAFNOSUPPORT = 47;
-
-const int EADDRINUSE = 48;
-
-const int EADDRNOTAVAIL = 49;
-
-const int ENETDOWN = 50;
-
-const int ENETUNREACH = 51;
-
-const int ENETRESET = 52;
-
-const int ECONNABORTED = 53;
-
-const int ECONNRESET = 54;
-
-const int ENOBUFS = 55;
-
-const int EISCONN = 56;
-
-const int ENOTCONN = 57;
-
-const int ESHUTDOWN = 58;
-
-const int ETOOMANYREFS = 59;
-
-const int ETIMEDOUT = 60;
-
-const int ECONNREFUSED = 61;
-
-const int ELOOP = 62;
-
-const int ENAMETOOLONG = 63;
-
-const int EHOSTDOWN = 64;
-
-const int EHOSTUNREACH = 65;
-
-const int ENOTEMPTY = 66;
-
-const int EPROCLIM = 67;
-
-const int EUSERS = 68;
-
-const int EDQUOT = 69;
-
-const int ESTALE = 70;
-
-const int EREMOTE = 71;
-
-const int EBADRPC = 72;
-
-const int ERPCMISMATCH = 73;
-
-const int EPROGUNAVAIL = 74;
-
-const int EPROGMISMATCH = 75;
-
-const int EPROCUNAVAIL = 76;
-
-const int ENOLCK = 77;
-
-const int ENOSYS = 78;
-
-const int EFTYPE = 79;
-
-const int EAUTH = 80;
-
-const int ENEEDAUTH = 81;
-
-const int EPWROFF = 82;
-
-const int EDEVERR = 83;
-
-const int EOVERFLOW = 84;
-
-const int EBADEXEC = 85;
-
-const int EBADARCH = 86;
-
-const int ESHLIBVERS = 87;
-
-const int EBADMACHO = 88;
-
-const int ECANCELED = 89;
-
-const int EIDRM = 90;
-
-const int ENOMSG = 91;
-
-const int EILSEQ = 92;
-
-const int ENOATTR = 93;
-
-const int EBADMSG = 94;
-
-const int EMULTIHOP = 95;
-
-const int ENODATA = 96;
-
-const int ENOLINK = 97;
-
-const int ENOSR = 98;
-
-const int ENOSTR = 99;
-
-const int EPROTO = 100;
-
-const int ETIME = 101;
-
-const int EOPNOTSUPP = 102;
-
-const int ENOPOLICY = 103;
-
-const int ENOTRECOVERABLE = 104;
-
-const int EOWNERDEAD = 105;
-
-const int EQFULL = 106;
-
-const int ELAST = 106;
-
-const int FLT_EVAL_METHOD = 0;
-
-const int FLT_RADIX = 2;
-
-const int FLT_MANT_DIG = 24;
-
-const int DBL_MANT_DIG = 53;
-
-const int LDBL_MANT_DIG = 53;
-
-const int FLT_DIG = 6;
-
-const int DBL_DIG = 15;
-
-const int LDBL_DIG = 15;
-
-const int FLT_MIN_EXP = -125;
-
-const int DBL_MIN_EXP = -1021;
-
-const int LDBL_MIN_EXP = -1021;
-
-const int FLT_MIN_10_EXP = -37;
-
-const int DBL_MIN_10_EXP = -307;
-
-const int LDBL_MIN_10_EXP = -307;
-
-const int FLT_MAX_EXP = 128;
-
-const int DBL_MAX_EXP = 1024;
-
-const int LDBL_MAX_EXP = 1024;
-
-const int FLT_MAX_10_EXP = 38;
-
-const int DBL_MAX_10_EXP = 308;
-
-const int LDBL_MAX_10_EXP = 308;
-
-const double FLT_MAX = 3.4028234663852886e+38;
-
-const double DBL_MAX = 1.7976931348623157e+308;
-
-const double LDBL_MAX = 1.7976931348623157e+308;
-
-const double FLT_EPSILON = 1.1920928955078125e-7;
-
-const double DBL_EPSILON = 2.220446049250313e-16;
-
-const double LDBL_EPSILON = 2.220446049250313e-16;
-
-const double FLT_MIN = 1.1754943508222875e-38;
-
-const double DBL_MIN = 2.2250738585072014e-308;
-
-const double LDBL_MIN = 2.2250738585072014e-308;
-
-const int DECIMAL_DIG = 17;
-
-const int FLT_HAS_SUBNORM = 1;
-
-const int DBL_HAS_SUBNORM = 1;
-
-const int LDBL_HAS_SUBNORM = 1;
-
-const double FLT_TRUE_MIN = 1.401298464324817e-45;
-
-const double DBL_TRUE_MIN = 5e-324;
-
-const double LDBL_TRUE_MIN = 5e-324;
-
-const int FLT_DECIMAL_DIG = 9;
-
-const int DBL_DECIMAL_DIG = 17;
-
-const int LDBL_DECIMAL_DIG = 17;
-
-const int LC_ALL = 0;
-
-const int LC_COLLATE = 1;
-
-const int LC_CTYPE = 2;
-
-const int LC_MONETARY = 3;
-
-const int LC_NUMERIC = 4;
-
-const int LC_TIME = 5;
-
-const int LC_MESSAGES = 6;
-
-const int _LC_LAST = 7;
-
-const double HUGE_VAL = double.infinity;
-
-const double HUGE_VALF = double.infinity;
-
-const double HUGE_VALL = double.infinity;
-
-const double NAN = double.nan;
-
-const double INFINITY = double.infinity;
-
-const int FP_NAN = 1;
-
-const int FP_INFINITE = 2;
-
-const int FP_ZERO = 3;
-
-const int FP_NORMAL = 4;
-
-const int FP_SUBNORMAL = 5;
-
-const int FP_SUPERNORMAL = 6;
-
-const int FP_FAST_FMA = 1;
-
-const int FP_FAST_FMAF = 1;
-
-const int FP_FAST_FMAL = 1;
-
-const int FP_ILOGB0 = -2147483648;
-
-const int FP_ILOGBNAN = -2147483648;
-
-const int MATH_ERRNO = 1;
-
-const int MATH_ERREXCEPT = 2;
-
-const double M_E = 2.718281828459045;
-
-const double M_LOG2E = 1.4426950408889634;
-
-const double M_LOG10E = 0.4342944819032518;
-
-const double M_LN2 = 0.6931471805599453;
-
-const double M_LN10 = 2.302585092994046;
-
-const double M_PI = 3.141592653589793;
-
-const double M_PI_2 = 1.5707963267948966;
-
-const double M_PI_4 = 0.7853981633974483;
-
-const double M_1_PI = 0.3183098861837907;
-
-const double M_2_PI = 0.6366197723675814;
-
-const double M_2_SQRTPI = 1.1283791670955126;
-
-const double M_SQRT2 = 1.4142135623730951;
-
-const double M_SQRT1_2 = 0.7071067811865476;
-
-const double MAXFLOAT = 3.4028234663852886e+38;
-
-const int FP_SNAN = 1;
-
-const int FP_QNAN = 1;
-
-const double HUGE = 3.4028234663852886e+38;
-
-const double X_TLOSS = 14148475504056880.0;
-
-const int DOMAIN = 1;
-
-const int SING = 2;
-
-const int OVERFLOW = 3;
-
-const int UNDERFLOW = 4;
-
-const int TLOSS = 5;
-
-const int PLOSS = 6;
-
-const int _JBLEN = 48;
-
-const int RENAME_SECLUDE = 1;
-
-const int RENAME_SWAP = 2;
-
-const int RENAME_EXCL = 4;
-
-const int RENAME_RESERVED1 = 8;
-
-const int RENAME_NOFOLLOW_ANY = 16;
-
 const int SEEK_SET = 0;
 
 const int SEEK_CUR = 1;
@@ -88981,144 +91734,6 @@
 
 const int SEEK_DATA = 4;
 
-const int __SLBF = 1;
-
-const int __SNBF = 2;
-
-const int __SRD = 4;
-
-const int __SWR = 8;
-
-const int __SRW = 16;
-
-const int __SEOF = 32;
-
-const int __SERR = 64;
-
-const int __SMBF = 128;
-
-const int __SAPP = 256;
-
-const int __SSTR = 512;
-
-const int __SOPT = 1024;
-
-const int __SNPT = 2048;
-
-const int __SOFF = 4096;
-
-const int __SMOD = 8192;
-
-const int __SALC = 16384;
-
-const int __SIGN = 32768;
-
-const int _IOFBF = 0;
-
-const int _IOLBF = 1;
-
-const int _IONBF = 2;
-
-const int BUFSIZ = 1024;
-
-const int EOF = -1;
-
-const int FOPEN_MAX = 20;
-
-const int FILENAME_MAX = 1024;
-
-const String P_tmpdir = '/var/tmp/';
-
-const int L_tmpnam = 1024;
-
-const int TMP_MAX = 308915776;
-
-const int L_ctermid = 1024;
-
-const int CLOCKS_PER_SEC = 1000000;
-
-const int CLOCK_REALTIME = 0;
-
-const int CLOCK_MONOTONIC = 6;
-
-const int CLOCK_MONOTONIC_RAW = 4;
-
-const int CLOCK_MONOTONIC_RAW_APPROX = 5;
-
-const int CLOCK_UPTIME_RAW = 8;
-
-const int CLOCK_UPTIME_RAW_APPROX = 9;
-
-const int CLOCK_PROCESS_CPUTIME_ID = 12;
-
-const int CLOCK_THREAD_CPUTIME_ID = 16;
-
-const int TIME_UTC = 1;
-
-const int __COREFOUNDATION_CFBAG__ = 1;
-
-const int __COREFOUNDATION_CFBINARYHEAP__ = 1;
-
-const int __COREFOUNDATION_CFBITVECTOR__ = 1;
-
-const int __COREFOUNDATION_CFBYTEORDER__ = 1;
-
-const int CF_USE_OSBYTEORDER_H = 1;
-
-const int __COREFOUNDATION_CFCALENDAR__ = 1;
-
-const int __COREFOUNDATION_CFLOCALE__ = 1;
-
-const int __COREFOUNDATION_CFDICTIONARY__ = 1;
-
-const int __COREFOUNDATION_CFNOTIFICATIONCENTER__ = 1;
-
-const int __COREFOUNDATION_CFDATE__ = 1;
-
-const int __COREFOUNDATION_CFTIMEZONE__ = 1;
-
-const int __COREFOUNDATION_CFDATA__ = 1;
-
-const int __COREFOUNDATION_CFSTRING__ = 1;
-
-const int __COREFOUNDATION_CFCHARACTERSET__ = 1;
-
-const int __COREFOUNDATION_CFERROR__ = 1;
-
-const int kCFStringEncodingInvalidId = 4294967295;
-
-const int __kCFStringInlineBufferLength = 64;
-
-const int __COREFOUNDATION_CFCGTYPES__ = 1;
-
-const int CGFLOAT_IS_DOUBLE = 1;
-
-const double CGFLOAT_MIN = 2.2250738585072014e-308;
-
-const double CGFLOAT_MAX = 1.7976931348623157e+308;
-
-const double CGFLOAT_EPSILON = 2.220446049250313e-16;
-
-const int CGFLOAT_DEFINED = 1;
-
-const int CGVECTOR_DEFINED = 1;
-
-const int __COREFOUNDATION_CFDATEFORMATTER__ = 1;
-
-const int __COREFOUNDATION_CFNUMBER__ = 1;
-
-const int __COREFOUNDATION_CFNUMBERFORMATTER__ = 1;
-
-const int __COREFOUNDATION_CFPREFERENCES__ = 1;
-
-const int __COREFOUNDATION_CFPROPERTYLIST__ = 1;
-
-const int __COREFOUNDATION_CFSTREAM__ = 1;
-
-const int __COREFOUNDATION_CFURL__ = 1;
-
-const int __COREFOUNDATION_CFRUNLOOP__ = 1;
-
 const int MACH_PORT_NULL = 0;
 
 const int MACH_PORT_DEAD = 4294967295;
@@ -89151,6 +91766,12 @@
 
 const int MACH_PORT_TYPE_LABELH = 2097152;
 
+const int MACH_PORT_TYPE_DNREQUEST = 2147483648;
+
+const int MACH_PORT_TYPE_SPREQUEST = 1073741824;
+
+const int MACH_PORT_TYPE_SPREQUEST_DELAYED = 536870912;
+
 const int MACH_PORT_TYPE_SEND_RECEIVE = 196608;
 
 const int MACH_PORT_TYPE_SEND_RIGHTS = 327680;
@@ -89161,12 +91782,6 @@
 
 const int MACH_PORT_TYPE_ALL_RIGHTS = 2031616;
 
-const int MACH_PORT_TYPE_DNREQUEST = 2147483648;
-
-const int MACH_PORT_TYPE_SPREQUEST = 1073741824;
-
-const int MACH_PORT_TYPE_SPREQUEST_DELAYED = 536870912;
-
 const int MACH_PORT_SRIGHTS_NONE = 0;
 
 const int MACH_PORT_SRIGHTS_PRESENT = 1;
@@ -89267,7 +91882,7 @@
 
 const int MPO_PROVISIONAL_REPLY_PORT = 16384;
 
-const int MPO_PROVISIONAL_ID_PROT_OPTOUT = 32768;
+const int MPO_EXCEPTION_PORT = 32768;
 
 const int GUARD_TYPE_MACH_PORT = 1;
 
@@ -89301,8 +91916,6 @@
 
 const int MPG_IMMOVABLE_RECEIVE = 2;
 
-const int __COREFOUNDATION_CFSOCKET__ = 1;
-
 const int _POSIX_VERSION = 200112;
 
 const int _POSIX2_VERSION = 200112;
@@ -90149,6 +92762,8 @@
 
 const int F_ATTRIBUTION_TAG = 111;
 
+const int F_ADDSIGS_MAIN_BINARY = 113;
+
 const int FCNTL_FS_SPECIFIC_BASE = 65536;
 
 const int F_DUPFD_CLOEXEC = 67;
@@ -90763,924 +93378,4 @@
 
 const int DISPATCH_IO_STRICT_INTERVAL = 1;
 
-const int __COREFOUNDATION_CFSET__ = 1;
-
-const int __COREFOUNDATION_CFSTRINGENCODINGEXT__ = 1;
-
-const int __COREFOUNDATION_CFTREE__ = 1;
-
-const int __COREFOUNDATION_CFURLACCESS__ = 1;
-
-const int __COREFOUNDATION_CFUUID__ = 1;
-
-const int __COREFOUNDATION_CFUTILITIES__ = 1;
-
-const int __COREFOUNDATION_CFBUNDLE__ = 1;
-
-const int CPU_STATE_MAX = 4;
-
-const int CPU_STATE_USER = 0;
-
-const int CPU_STATE_SYSTEM = 1;
-
-const int CPU_STATE_IDLE = 2;
-
-const int CPU_STATE_NICE = 3;
-
-const int CPU_ARCH_MASK = 4278190080;
-
-const int CPU_ARCH_ABI64 = 16777216;
-
-const int CPU_ARCH_ABI64_32 = 33554432;
-
-const int CPU_TYPE_ANY = -1;
-
-const int CPU_TYPE_VAX = 1;
-
-const int CPU_TYPE_MC680x0 = 6;
-
-const int CPU_TYPE_X86 = 7;
-
-const int CPU_TYPE_I386 = 7;
-
-const int CPU_TYPE_X86_64 = 16777223;
-
-const int CPU_TYPE_MC98000 = 10;
-
-const int CPU_TYPE_HPPA = 11;
-
-const int CPU_TYPE_ARM = 12;
-
-const int CPU_TYPE_ARM64 = 16777228;
-
-const int CPU_TYPE_ARM64_32 = 33554444;
-
-const int CPU_TYPE_MC88000 = 13;
-
-const int CPU_TYPE_SPARC = 14;
-
-const int CPU_TYPE_I860 = 15;
-
-const int CPU_TYPE_POWERPC = 18;
-
-const int CPU_TYPE_POWERPC64 = 16777234;
-
-const int CPU_SUBTYPE_MASK = 4278190080;
-
-const int CPU_SUBTYPE_LIB64 = 2147483648;
-
-const int CPU_SUBTYPE_PTRAUTH_ABI = 2147483648;
-
-const int CPU_SUBTYPE_ANY = -1;
-
-const int CPU_SUBTYPE_MULTIPLE = -1;
-
-const int CPU_SUBTYPE_LITTLE_ENDIAN = 0;
-
-const int CPU_SUBTYPE_BIG_ENDIAN = 1;
-
-const int CPU_THREADTYPE_NONE = 0;
-
-const int CPU_SUBTYPE_VAX_ALL = 0;
-
-const int CPU_SUBTYPE_VAX780 = 1;
-
-const int CPU_SUBTYPE_VAX785 = 2;
-
-const int CPU_SUBTYPE_VAX750 = 3;
-
-const int CPU_SUBTYPE_VAX730 = 4;
-
-const int CPU_SUBTYPE_UVAXI = 5;
-
-const int CPU_SUBTYPE_UVAXII = 6;
-
-const int CPU_SUBTYPE_VAX8200 = 7;
-
-const int CPU_SUBTYPE_VAX8500 = 8;
-
-const int CPU_SUBTYPE_VAX8600 = 9;
-
-const int CPU_SUBTYPE_VAX8650 = 10;
-
-const int CPU_SUBTYPE_VAX8800 = 11;
-
-const int CPU_SUBTYPE_UVAXIII = 12;
-
-const int CPU_SUBTYPE_MC680x0_ALL = 1;
-
-const int CPU_SUBTYPE_MC68030 = 1;
-
-const int CPU_SUBTYPE_MC68040 = 2;
-
-const int CPU_SUBTYPE_MC68030_ONLY = 3;
-
-const int CPU_SUBTYPE_I386_ALL = 3;
-
-const int CPU_SUBTYPE_386 = 3;
-
-const int CPU_SUBTYPE_486 = 4;
-
-const int CPU_SUBTYPE_486SX = 132;
-
-const int CPU_SUBTYPE_586 = 5;
-
-const int CPU_SUBTYPE_PENT = 5;
-
-const int CPU_SUBTYPE_PENTPRO = 22;
-
-const int CPU_SUBTYPE_PENTII_M3 = 54;
-
-const int CPU_SUBTYPE_PENTII_M5 = 86;
-
-const int CPU_SUBTYPE_CELERON = 103;
-
-const int CPU_SUBTYPE_CELERON_MOBILE = 119;
-
-const int CPU_SUBTYPE_PENTIUM_3 = 8;
-
-const int CPU_SUBTYPE_PENTIUM_3_M = 24;
-
-const int CPU_SUBTYPE_PENTIUM_3_XEON = 40;
-
-const int CPU_SUBTYPE_PENTIUM_M = 9;
-
-const int CPU_SUBTYPE_PENTIUM_4 = 10;
-
-const int CPU_SUBTYPE_PENTIUM_4_M = 26;
-
-const int CPU_SUBTYPE_ITANIUM = 11;
-
-const int CPU_SUBTYPE_ITANIUM_2 = 27;
-
-const int CPU_SUBTYPE_XEON = 12;
-
-const int CPU_SUBTYPE_XEON_MP = 28;
-
-const int CPU_SUBTYPE_INTEL_FAMILY_MAX = 15;
-
-const int CPU_SUBTYPE_INTEL_MODEL_ALL = 0;
-
-const int CPU_SUBTYPE_X86_ALL = 3;
-
-const int CPU_SUBTYPE_X86_64_ALL = 3;
-
-const int CPU_SUBTYPE_X86_ARCH1 = 4;
-
-const int CPU_SUBTYPE_X86_64_H = 8;
-
-const int CPU_THREADTYPE_INTEL_HTT = 1;
-
-const int CPU_SUBTYPE_MIPS_ALL = 0;
-
-const int CPU_SUBTYPE_MIPS_R2300 = 1;
-
-const int CPU_SUBTYPE_MIPS_R2600 = 2;
-
-const int CPU_SUBTYPE_MIPS_R2800 = 3;
-
-const int CPU_SUBTYPE_MIPS_R2000a = 4;
-
-const int CPU_SUBTYPE_MIPS_R2000 = 5;
-
-const int CPU_SUBTYPE_MIPS_R3000a = 6;
-
-const int CPU_SUBTYPE_MIPS_R3000 = 7;
-
-const int CPU_SUBTYPE_MC98000_ALL = 0;
-
-const int CPU_SUBTYPE_MC98601 = 1;
-
-const int CPU_SUBTYPE_HPPA_ALL = 0;
-
-const int CPU_SUBTYPE_HPPA_7100 = 0;
-
-const int CPU_SUBTYPE_HPPA_7100LC = 1;
-
-const int CPU_SUBTYPE_MC88000_ALL = 0;
-
-const int CPU_SUBTYPE_MC88100 = 1;
-
-const int CPU_SUBTYPE_MC88110 = 2;
-
-const int CPU_SUBTYPE_SPARC_ALL = 0;
-
-const int CPU_SUBTYPE_I860_ALL = 0;
-
-const int CPU_SUBTYPE_I860_860 = 1;
-
-const int CPU_SUBTYPE_POWERPC_ALL = 0;
-
-const int CPU_SUBTYPE_POWERPC_601 = 1;
-
-const int CPU_SUBTYPE_POWERPC_602 = 2;
-
-const int CPU_SUBTYPE_POWERPC_603 = 3;
-
-const int CPU_SUBTYPE_POWERPC_603e = 4;
-
-const int CPU_SUBTYPE_POWERPC_603ev = 5;
-
-const int CPU_SUBTYPE_POWERPC_604 = 6;
-
-const int CPU_SUBTYPE_POWERPC_604e = 7;
-
-const int CPU_SUBTYPE_POWERPC_620 = 8;
-
-const int CPU_SUBTYPE_POWERPC_750 = 9;
-
-const int CPU_SUBTYPE_POWERPC_7400 = 10;
-
-const int CPU_SUBTYPE_POWERPC_7450 = 11;
-
-const int CPU_SUBTYPE_POWERPC_970 = 100;
-
-const int CPU_SUBTYPE_ARM_ALL = 0;
-
-const int CPU_SUBTYPE_ARM_V4T = 5;
-
-const int CPU_SUBTYPE_ARM_V6 = 6;
-
-const int CPU_SUBTYPE_ARM_V5TEJ = 7;
-
-const int CPU_SUBTYPE_ARM_XSCALE = 8;
-
-const int CPU_SUBTYPE_ARM_V7 = 9;
-
-const int CPU_SUBTYPE_ARM_V7F = 10;
-
-const int CPU_SUBTYPE_ARM_V7S = 11;
-
-const int CPU_SUBTYPE_ARM_V7K = 12;
-
-const int CPU_SUBTYPE_ARM_V8 = 13;
-
-const int CPU_SUBTYPE_ARM_V6M = 14;
-
-const int CPU_SUBTYPE_ARM_V7M = 15;
-
-const int CPU_SUBTYPE_ARM_V7EM = 16;
-
-const int CPU_SUBTYPE_ARM_V8M = 17;
-
-const int CPU_SUBTYPE_ARM64_ALL = 0;
-
-const int CPU_SUBTYPE_ARM64_V8 = 1;
-
-const int CPU_SUBTYPE_ARM64E = 2;
-
-const int CPU_SUBTYPE_ARM64_PTR_AUTH_MASK = 251658240;
-
-const int CPU_SUBTYPE_ARM64_32_ALL = 0;
-
-const int CPU_SUBTYPE_ARM64_32_V8 = 1;
-
-const int CPUFAMILY_UNKNOWN = 0;
-
-const int CPUFAMILY_POWERPC_G3 = 3471054153;
-
-const int CPUFAMILY_POWERPC_G4 = 2009171118;
-
-const int CPUFAMILY_POWERPC_G5 = 3983988906;
-
-const int CPUFAMILY_INTEL_6_13 = 2855483691;
-
-const int CPUFAMILY_INTEL_PENRYN = 2028621756;
-
-const int CPUFAMILY_INTEL_NEHALEM = 1801080018;
-
-const int CPUFAMILY_INTEL_WESTMERE = 1463508716;
-
-const int CPUFAMILY_INTEL_SANDYBRIDGE = 1418770316;
-
-const int CPUFAMILY_INTEL_IVYBRIDGE = 526772277;
-
-const int CPUFAMILY_INTEL_HASWELL = 280134364;
-
-const int CPUFAMILY_INTEL_BROADWELL = 1479463068;
-
-const int CPUFAMILY_INTEL_SKYLAKE = 939270559;
-
-const int CPUFAMILY_INTEL_KABYLAKE = 260141638;
-
-const int CPUFAMILY_INTEL_ICELAKE = 943936839;
-
-const int CPUFAMILY_INTEL_COMETLAKE = 486055998;
-
-const int CPUFAMILY_ARM_9 = 3878847406;
-
-const int CPUFAMILY_ARM_11 = 2415272152;
-
-const int CPUFAMILY_ARM_XSCALE = 1404044789;
-
-const int CPUFAMILY_ARM_12 = 3172666089;
-
-const int CPUFAMILY_ARM_13 = 214503012;
-
-const int CPUFAMILY_ARM_14 = 2517073649;
-
-const int CPUFAMILY_ARM_15 = 2823887818;
-
-const int CPUFAMILY_ARM_SWIFT = 506291073;
-
-const int CPUFAMILY_ARM_CYCLONE = 933271106;
-
-const int CPUFAMILY_ARM_TYPHOON = 747742334;
-
-const int CPUFAMILY_ARM_TWISTER = 2465937352;
-
-const int CPUFAMILY_ARM_HURRICANE = 1741614739;
-
-const int CPUFAMILY_ARM_MONSOON_MISTRAL = 3894312694;
-
-const int CPUFAMILY_ARM_VORTEX_TEMPEST = 131287967;
-
-const int CPUFAMILY_ARM_LIGHTNING_THUNDER = 1176831186;
-
-const int CPUFAMILY_ARM_FIRESTORM_ICESTORM = 458787763;
-
-const int CPUFAMILY_ARM_BLIZZARD_AVALANCHE = 3660830781;
-
-const int CPUFAMILY_ARM_EVEREST_SAWTOOTH = 2271604202;
-
-const int CPUFAMILY_ARM_IBIZA = 4197663070;
-
-const int CPUFAMILY_ARM_PALMA = 1912690738;
-
-const int CPUFAMILY_ARM_COLL = 678884789;
-
-const int CPUFAMILY_ARM_LOBOS = 1598941843;
-
-const int CPUFAMILY_ARM_DONAN = 1867590060;
-
-const int CPUSUBFAMILY_UNKNOWN = 0;
-
-const int CPUSUBFAMILY_ARM_HP = 1;
-
-const int CPUSUBFAMILY_ARM_HG = 2;
-
-const int CPUSUBFAMILY_ARM_M = 3;
-
-const int CPUSUBFAMILY_ARM_HS = 4;
-
-const int CPUSUBFAMILY_ARM_HC_HD = 5;
-
-const int CPUSUBFAMILY_ARM_HA = 6;
-
-const int CPUFAMILY_INTEL_6_23 = 2028621756;
-
-const int CPUFAMILY_INTEL_6_26 = 1801080018;
-
-const int __COREFOUNDATION_CFMESSAGEPORT__ = 1;
-
-const int __COREFOUNDATION_CFPLUGIN__ = 1;
-
-const int COREFOUNDATION_CFPLUGINCOM_SEPARATE = 1;
-
-const int __COREFOUNDATION_CFMACHPORT__ = 1;
-
-const int __COREFOUNDATION_CFATTRIBUTEDSTRING__ = 1;
-
-const int __COREFOUNDATION_CFURLENUMERATOR__ = 1;
-
-const int __COREFOUNDATION_CFFILESECURITY__ = 1;
-
-const int KAUTH_GUID_SIZE = 16;
-
-const int KAUTH_UID_NONE = 4294967195;
-
-const int KAUTH_GID_NONE = 4294967195;
-
-const int KAUTH_NTSID_MAX_AUTHORITIES = 16;
-
-const int KAUTH_NTSID_HDRSIZE = 8;
-
-const int KAUTH_EXTLOOKUP_SUCCESS = 0;
-
-const int KAUTH_EXTLOOKUP_BADRQ = 1;
-
-const int KAUTH_EXTLOOKUP_FAILURE = 2;
-
-const int KAUTH_EXTLOOKUP_FATAL = 3;
-
-const int KAUTH_EXTLOOKUP_INPROG = 100;
-
-const int KAUTH_EXTLOOKUP_VALID_UID = 1;
-
-const int KAUTH_EXTLOOKUP_VALID_UGUID = 2;
-
-const int KAUTH_EXTLOOKUP_VALID_USID = 4;
-
-const int KAUTH_EXTLOOKUP_VALID_GID = 8;
-
-const int KAUTH_EXTLOOKUP_VALID_GGUID = 16;
-
-const int KAUTH_EXTLOOKUP_VALID_GSID = 32;
-
-const int KAUTH_EXTLOOKUP_WANT_UID = 64;
-
-const int KAUTH_EXTLOOKUP_WANT_UGUID = 128;
-
-const int KAUTH_EXTLOOKUP_WANT_USID = 256;
-
-const int KAUTH_EXTLOOKUP_WANT_GID = 512;
-
-const int KAUTH_EXTLOOKUP_WANT_GGUID = 1024;
-
-const int KAUTH_EXTLOOKUP_WANT_GSID = 2048;
-
-const int KAUTH_EXTLOOKUP_WANT_MEMBERSHIP = 4096;
-
-const int KAUTH_EXTLOOKUP_VALID_MEMBERSHIP = 8192;
-
-const int KAUTH_EXTLOOKUP_ISMEMBER = 16384;
-
-const int KAUTH_EXTLOOKUP_VALID_PWNAM = 32768;
-
-const int KAUTH_EXTLOOKUP_WANT_PWNAM = 65536;
-
-const int KAUTH_EXTLOOKUP_VALID_GRNAM = 131072;
-
-const int KAUTH_EXTLOOKUP_WANT_GRNAM = 262144;
-
-const int KAUTH_EXTLOOKUP_VALID_SUPGRPS = 524288;
-
-const int KAUTH_EXTLOOKUP_WANT_SUPGRPS = 1048576;
-
-const int KAUTH_EXTLOOKUP_REGISTER = 0;
-
-const int KAUTH_EXTLOOKUP_RESULT = 1;
-
-const int KAUTH_EXTLOOKUP_WORKER = 2;
-
-const int KAUTH_EXTLOOKUP_DEREGISTER = 4;
-
-const int KAUTH_GET_CACHE_SIZES = 8;
-
-const int KAUTH_SET_CACHE_SIZES = 16;
-
-const int KAUTH_CLEAR_CACHES = 32;
-
-const String IDENTITYSVC_ENTITLEMENT = 'com.apple.private.identitysvc';
-
-const int KAUTH_ACE_KINDMASK = 15;
-
-const int KAUTH_ACE_PERMIT = 1;
-
-const int KAUTH_ACE_DENY = 2;
-
-const int KAUTH_ACE_AUDIT = 3;
-
-const int KAUTH_ACE_ALARM = 4;
-
-const int KAUTH_ACE_INHERITED = 16;
-
-const int KAUTH_ACE_FILE_INHERIT = 32;
-
-const int KAUTH_ACE_DIRECTORY_INHERIT = 64;
-
-const int KAUTH_ACE_LIMIT_INHERIT = 128;
-
-const int KAUTH_ACE_ONLY_INHERIT = 256;
-
-const int KAUTH_ACE_SUCCESS = 512;
-
-const int KAUTH_ACE_FAILURE = 1024;
-
-const int KAUTH_ACE_INHERIT_CONTROL_FLAGS = 480;
-
-const int KAUTH_ACE_GENERIC_ALL = 2097152;
-
-const int KAUTH_ACE_GENERIC_EXECUTE = 4194304;
-
-const int KAUTH_ACE_GENERIC_WRITE = 8388608;
-
-const int KAUTH_ACE_GENERIC_READ = 16777216;
-
-const int KAUTH_ACL_MAX_ENTRIES = 128;
-
-const int KAUTH_ACL_FLAGS_PRIVATE = 65535;
-
-const int KAUTH_ACL_DEFER_INHERIT = 65536;
-
-const int KAUTH_ACL_NO_INHERIT = 131072;
-
-const int KAUTH_FILESEC_NOACL = 4294967295;
-
-const int KAUTH_FILESEC_MAGIC = 19710317;
-
-const int KAUTH_FILESEC_FLAGS_PRIVATE = 65535;
-
-const int KAUTH_FILESEC_DEFER_INHERIT = 65536;
-
-const int KAUTH_FILESEC_NO_INHERIT = 131072;
-
-const String KAUTH_FILESEC_XATTR = 'com.apple.system.Security';
-
-const int KAUTH_ENDIAN_HOST = 1;
-
-const int KAUTH_ENDIAN_DISK = 2;
-
-const int KAUTH_VNODE_READ_DATA = 2;
-
-const int KAUTH_VNODE_LIST_DIRECTORY = 2;
-
-const int KAUTH_VNODE_WRITE_DATA = 4;
-
-const int KAUTH_VNODE_ADD_FILE = 4;
-
-const int KAUTH_VNODE_EXECUTE = 8;
-
-const int KAUTH_VNODE_SEARCH = 8;
-
-const int KAUTH_VNODE_DELETE = 16;
-
-const int KAUTH_VNODE_APPEND_DATA = 32;
-
-const int KAUTH_VNODE_ADD_SUBDIRECTORY = 32;
-
-const int KAUTH_VNODE_DELETE_CHILD = 64;
-
-const int KAUTH_VNODE_READ_ATTRIBUTES = 128;
-
-const int KAUTH_VNODE_WRITE_ATTRIBUTES = 256;
-
-const int KAUTH_VNODE_READ_EXTATTRIBUTES = 512;
-
-const int KAUTH_VNODE_WRITE_EXTATTRIBUTES = 1024;
-
-const int KAUTH_VNODE_READ_SECURITY = 2048;
-
-const int KAUTH_VNODE_WRITE_SECURITY = 4096;
-
-const int KAUTH_VNODE_TAKE_OWNERSHIP = 8192;
-
-const int KAUTH_VNODE_CHANGE_OWNER = 8192;
-
-const int KAUTH_VNODE_SYNCHRONIZE = 1048576;
-
-const int KAUTH_VNODE_LINKTARGET = 33554432;
-
-const int KAUTH_VNODE_CHECKIMMUTABLE = 67108864;
-
-const int KAUTH_VNODE_ACCESS = 2147483648;
-
-const int KAUTH_VNODE_NOIMMUTABLE = 1073741824;
-
-const int KAUTH_VNODE_SEARCHBYANYONE = 536870912;
-
-const int KAUTH_VNODE_GENERIC_READ_BITS = 2690;
-
-const int KAUTH_VNODE_GENERIC_WRITE_BITS = 5492;
-
-const int KAUTH_VNODE_GENERIC_EXECUTE_BITS = 8;
-
-const int KAUTH_VNODE_GENERIC_ALL_BITS = 8190;
-
-const int KAUTH_VNODE_WRITE_RIGHTS = 100676980;
-
-const int __DARWIN_ACL_READ_DATA = 2;
-
-const int __DARWIN_ACL_LIST_DIRECTORY = 2;
-
-const int __DARWIN_ACL_WRITE_DATA = 4;
-
-const int __DARWIN_ACL_ADD_FILE = 4;
-
-const int __DARWIN_ACL_EXECUTE = 8;
-
-const int __DARWIN_ACL_SEARCH = 8;
-
-const int __DARWIN_ACL_DELETE = 16;
-
-const int __DARWIN_ACL_APPEND_DATA = 32;
-
-const int __DARWIN_ACL_ADD_SUBDIRECTORY = 32;
-
-const int __DARWIN_ACL_DELETE_CHILD = 64;
-
-const int __DARWIN_ACL_READ_ATTRIBUTES = 128;
-
-const int __DARWIN_ACL_WRITE_ATTRIBUTES = 256;
-
-const int __DARWIN_ACL_READ_EXTATTRIBUTES = 512;
-
-const int __DARWIN_ACL_WRITE_EXTATTRIBUTES = 1024;
-
-const int __DARWIN_ACL_READ_SECURITY = 2048;
-
-const int __DARWIN_ACL_WRITE_SECURITY = 4096;
-
-const int __DARWIN_ACL_CHANGE_OWNER = 8192;
-
-const int __DARWIN_ACL_SYNCHRONIZE = 1048576;
-
-const int __DARWIN_ACL_EXTENDED_ALLOW = 1;
-
-const int __DARWIN_ACL_EXTENDED_DENY = 2;
-
-const int __DARWIN_ACL_ENTRY_INHERITED = 16;
-
-const int __DARWIN_ACL_ENTRY_FILE_INHERIT = 32;
-
-const int __DARWIN_ACL_ENTRY_DIRECTORY_INHERIT = 64;
-
-const int __DARWIN_ACL_ENTRY_LIMIT_INHERIT = 128;
-
-const int __DARWIN_ACL_ENTRY_ONLY_INHERIT = 256;
-
-const int __DARWIN_ACL_FLAG_NO_INHERIT = 131072;
-
-const int ACL_MAX_ENTRIES = 128;
-
-const int ACL_UNDEFINED_ID = 0;
-
-const int __COREFOUNDATION_CFSTRINGTOKENIZER__ = 1;
-
-const int __COREFOUNDATION_CFFILEDESCRIPTOR__ = 1;
-
-const int __COREFOUNDATION_CFUSERNOTIFICATION__ = 1;
-
-const int __COREFOUNDATION_CFXMLNODE__ = 1;
-
-const int __COREFOUNDATION_CFXMLPARSER__ = 1;
-
-const int _CSSMTYPE_H_ = 1;
-
-const int _CSSMCONFIG_H_ = 1;
-
-const int SEC_ASN1_TAG_MASK = 255;
-
-const int SEC_ASN1_TAGNUM_MASK = 31;
-
-const int SEC_ASN1_BOOLEAN = 1;
-
-const int SEC_ASN1_INTEGER = 2;
-
-const int SEC_ASN1_BIT_STRING = 3;
-
-const int SEC_ASN1_OCTET_STRING = 4;
-
-const int SEC_ASN1_NULL = 5;
-
-const int SEC_ASN1_OBJECT_ID = 6;
-
-const int SEC_ASN1_OBJECT_DESCRIPTOR = 7;
-
-const int SEC_ASN1_REAL = 9;
-
-const int SEC_ASN1_ENUMERATED = 10;
-
-const int SEC_ASN1_EMBEDDED_PDV = 11;
-
-const int SEC_ASN1_UTF8_STRING = 12;
-
-const int SEC_ASN1_SEQUENCE = 16;
-
-const int SEC_ASN1_SET = 17;
-
-const int SEC_ASN1_NUMERIC_STRING = 18;
-
-const int SEC_ASN1_PRINTABLE_STRING = 19;
-
-const int SEC_ASN1_T61_STRING = 20;
-
-const int SEC_ASN1_VIDEOTEX_STRING = 21;
-
-const int SEC_ASN1_IA5_STRING = 22;
-
-const int SEC_ASN1_UTC_TIME = 23;
-
-const int SEC_ASN1_GENERALIZED_TIME = 24;
-
-const int SEC_ASN1_GRAPHIC_STRING = 25;
-
-const int SEC_ASN1_VISIBLE_STRING = 26;
-
-const int SEC_ASN1_GENERAL_STRING = 27;
-
-const int SEC_ASN1_UNIVERSAL_STRING = 28;
-
-const int SEC_ASN1_BMP_STRING = 30;
-
-const int SEC_ASN1_HIGH_TAG_NUMBER = 31;
-
-const int SEC_ASN1_TELETEX_STRING = 20;
-
-const int SEC_ASN1_METHOD_MASK = 32;
-
-const int SEC_ASN1_PRIMITIVE = 0;
-
-const int SEC_ASN1_CONSTRUCTED = 32;
-
-const int SEC_ASN1_CLASS_MASK = 192;
-
-const int SEC_ASN1_UNIVERSAL = 0;
-
-const int SEC_ASN1_APPLICATION = 64;
-
-const int SEC_ASN1_CONTEXT_SPECIFIC = 128;
-
-const int SEC_ASN1_PRIVATE = 192;
-
-const int SEC_ASN1_OPTIONAL = 256;
-
-const int SEC_ASN1_EXPLICIT = 512;
-
-const int SEC_ASN1_ANY = 1024;
-
-const int SEC_ASN1_INLINE = 2048;
-
-const int SEC_ASN1_POINTER = 4096;
-
-const int SEC_ASN1_GROUP = 8192;
-
-const int SEC_ASN1_DYNAMIC = 16384;
-
-const int SEC_ASN1_SKIP = 32768;
-
-const int SEC_ASN1_INNER = 65536;
-
-const int SEC_ASN1_SAVE = 131072;
-
-const int SEC_ASN1_SKIP_REST = 524288;
-
-const int SEC_ASN1_CHOICE = 1048576;
-
-const int SEC_ASN1_SIGNED_INT = 8388608;
-
-const int SEC_ASN1_SEQUENCE_OF = 8208;
-
-const int SEC_ASN1_SET_OF = 8209;
-
-const int SEC_ASN1_ANY_CONTENTS = 66560;
-
-const int _CSSMAPPLE_H_ = 1;
-
-const int _CSSMERR_H_ = 1;
-
-const int _X509DEFS_H_ = 1;
-
-const int BER_TAG_UNKNOWN = 0;
-
-const int BER_TAG_BOOLEAN = 1;
-
-const int BER_TAG_INTEGER = 2;
-
-const int BER_TAG_BIT_STRING = 3;
-
-const int BER_TAG_OCTET_STRING = 4;
-
-const int BER_TAG_NULL = 5;
-
-const int BER_TAG_OID = 6;
-
-const int BER_TAG_OBJECT_DESCRIPTOR = 7;
-
-const int BER_TAG_EXTERNAL = 8;
-
-const int BER_TAG_REAL = 9;
-
-const int BER_TAG_ENUMERATED = 10;
-
-const int BER_TAG_PKIX_UTF8_STRING = 12;
-
-const int BER_TAG_SEQUENCE = 16;
-
-const int BER_TAG_SET = 17;
-
-const int BER_TAG_NUMERIC_STRING = 18;
-
-const int BER_TAG_PRINTABLE_STRING = 19;
-
-const int BER_TAG_T61_STRING = 20;
-
-const int BER_TAG_TELETEX_STRING = 20;
-
-const int BER_TAG_VIDEOTEX_STRING = 21;
-
-const int BER_TAG_IA5_STRING = 22;
-
-const int BER_TAG_UTC_TIME = 23;
-
-const int BER_TAG_GENERALIZED_TIME = 24;
-
-const int BER_TAG_GRAPHIC_STRING = 25;
-
-const int BER_TAG_ISO646_STRING = 26;
-
-const int BER_TAG_GENERAL_STRING = 27;
-
-const int BER_TAG_VISIBLE_STRING = 26;
-
-const int BER_TAG_PKIX_UNIVERSAL_STRING = 28;
-
-const int BER_TAG_PKIX_BMP_STRING = 30;
-
-const int CSSM_X509_OPTION_PRESENT = 1;
-
-const int CSSM_X509_OPTION_NOT_PRESENT = 0;
-
-const int CE_KU_DigitalSignature = 32768;
-
-const int CE_KU_NonRepudiation = 16384;
-
-const int CE_KU_KeyEncipherment = 8192;
-
-const int CE_KU_DataEncipherment = 4096;
-
-const int CE_KU_KeyAgreement = 2048;
-
-const int CE_KU_KeyCertSign = 1024;
-
-const int CE_KU_CRLSign = 512;
-
-const int CE_KU_EncipherOnly = 256;
-
-const int CE_KU_DecipherOnly = 128;
-
-const int CE_CR_Unspecified = 0;
-
-const int CE_CR_KeyCompromise = 1;
-
-const int CE_CR_CACompromise = 2;
-
-const int CE_CR_AffiliationChanged = 3;
-
-const int CE_CR_Superseded = 4;
-
-const int CE_CR_CessationOfOperation = 5;
-
-const int CE_CR_CertificateHold = 6;
-
-const int CE_CR_RemoveFromCRL = 8;
-
-const int CE_CD_Unspecified = 128;
-
-const int CE_CD_KeyCompromise = 64;
-
-const int CE_CD_CACompromise = 32;
-
-const int CE_CD_AffiliationChanged = 16;
-
-const int CE_CD_Superseded = 8;
-
-const int CE_CD_CessationOfOperation = 4;
-
-const int CE_CD_CertificateHold = 2;
-
-const int CSSM_APPLE_TP_SSL_OPTS_VERSION = 1;
-
-const int CSSM_APPLE_TP_SSL_CLIENT = 1;
-
-const int CSSM_APPLE_TP_CRL_OPTS_VERSION = 0;
-
-const int CSSM_APPLE_TP_SMIME_OPTS_VERSION = 0;
-
-const int CSSM_APPLE_TP_ACTION_VERSION = 0;
-
-const int CSSM_TP_APPLE_EVIDENCE_VERSION = 0;
-
-const int CSSM_EVIDENCE_FORM_APPLE_CUSTOM = 2147483648;
-
-const String CSSM_APPLE_CRL_END_OF_TIME = '99991231235959';
-
-const String kKeychainSuffix = '.keychain';
-
-const String kKeychainDbSuffix = '.keychain-db';
-
-const String kSystemKeychainName = 'System.keychain';
-
-const String kSystemKeychainDir = '/Library/Keychains/';
-
-const String kSystemUnlockFile = '/var/db/SystemKey';
-
-const String kSystemKeychainPath = '/Library/Keychains/System.keychain';
-
-const String CSSM_APPLE_ACL_TAG_PARTITION_ID = '___PARTITION___';
-
-const String CSSM_APPLE_ACL_TAG_INTEGRITY = '___INTEGRITY___';
-
-const int errSecErrnoBase = 100000;
-
-const int errSecErrnoLimit = 100255;
-
-const int errSSLServerAuthCompleted = -9841;
-
-const int errSSLClientAuthCompleted = -9841;
-
-const int errSSLLast = -9849;
-
-const int NSMaximumStringLength = 2147483646;
-
-const int NS_UNICHAR_IS_EIGHT_BIT = 0;
-
 const int NSURLResponseUnknownLength = -1;
-
-const int NSOperationQualityOfServiceUserInteractive = 33;
-
-const int NSOperationQualityOfServiceUserInitiated = 25;
-
-const int NSOperationQualityOfServiceUtility = 17;
-
-const int NSOperationQualityOfServiceBackground = 9;
diff --git a/pkgs/cupertino_http/pubspec.yaml b/pkgs/cupertino_http/pubspec.yaml
index a463092..082bb56 100644
--- a/pkgs/cupertino_http/pubspec.yaml
+++ b/pkgs/cupertino_http/pubspec.yaml
@@ -1,5 +1,5 @@
 name: cupertino_http
-version: 2.0.2-wip
+version: 2.0.3-wip
 description: >-
   A macOS/iOS Flutter plugin that provides access to the Foundation URL
   Loading System.
@@ -16,12 +16,12 @@
     sdk: flutter
   http: ^1.2.0
   http_profile: ^0.1.0
-  objective_c: ^4.0.0
+  objective_c: ^4.1.0
   web_socket: ^0.1.0
 
 dev_dependencies:
   dart_flutter_team_lints: ^3.0.0
-  ffigen: ^16.0.0
+  ffigen: ^16.1.0
 
 flutter:
   plugin:
diff --git a/pkgs/http/CHANGELOG.md b/pkgs/http/CHANGELOG.md
index bbedcd2..a9a0150 100644
--- a/pkgs/http/CHANGELOG.md
+++ b/pkgs/http/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 1.3.0-wip
+## 1.3.0
 
 * Fixed unintended HTML tags in doc comments.
 * Switched `BrowserClient` to use Fetch API instead of `XMLHttpRequest`.
diff --git a/pkgs/http/pubspec.yaml b/pkgs/http/pubspec.yaml
index 9685a17..cc42dd9 100644
--- a/pkgs/http/pubspec.yaml
+++ b/pkgs/http/pubspec.yaml
@@ -1,12 +1,12 @@
 name: http
-version: 1.3.0-wip
+version: 1.3.0
 description: A composable, multi-platform, Future-based API for HTTP requests.
 repository: https://github.com/dart-lang/http/tree/master/pkgs/http
 
 topics:
- - http
- - network
- - protocols
+  - http
+  - network
+  - protocols
 
 environment:
   sdk: ^3.4.0
diff --git a/pkgs/http/test/io/client_conformance_test.dart b/pkgs/http/test/io/client_conformance_test.dart
index 65368e5..cc4b788 100644
--- a/pkgs/http/test/io/client_conformance_test.dart
+++ b/pkgs/http/test/io/client_conformance_test.dart
@@ -14,5 +14,7 @@
     IOClient.new, preservesMethodCase: false, // https://dartbug.com/54187
     canReceiveSetCookieHeaders: true,
     canSendCookieHeaders: true,
+    correctlyHandlesNullHeaderValues:
+        false, // https://github.com/dart-lang/sdk/issues/56636
   );
 }
diff --git a/pkgs/http2/CHANGELOG.md b/pkgs/http2/CHANGELOG.md
index 6e482a9..830df9d 100644
--- a/pkgs/http2/CHANGELOG.md
+++ b/pkgs/http2/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 2.3.2-wip
+
 ## 2.3.1
 
 - Require Dart 3.2
diff --git a/pkgs/http2/lib/http2.dart b/pkgs/http2/lib/http2.dart
index 3f1ed78..46f840a 100644
--- a/pkgs/http2/lib/http2.dart
+++ b/pkgs/http2/lib/http2.dart
@@ -42,7 +42,8 @@
 ///
 /// A simple example on how to connect to a http/2 capable server and
 /// requesting a resource is available at https://github.com/dart-lang/http2/blob/master/example/display_headers.dart.
-library http2.http2;
+library;
 
 import 'transport.dart';
+
 export 'transport.dart';
diff --git a/pkgs/http2/lib/src/frames/frames.dart b/pkgs/http2/lib/src/frames/frames.dart
index f6e74d2..c253adb 100644
--- a/pkgs/http2/lib/src/frames/frames.dart
+++ b/pkgs/http2/lib/src/frames/frames.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library http2.src.frames;
-
 import 'dart:async';
 import 'dart:math' show max;
 import 'dart:typed_data';
@@ -14,7 +12,7 @@
 import '../settings/settings.dart';
 import '../sync_errors.dart';
 
+part 'frame_reader.dart';
 part 'frame_types.dart';
 part 'frame_utils.dart';
-part 'frame_reader.dart';
 part 'frame_writer.dart';
diff --git a/pkgs/http2/lib/src/hpack/hpack.dart b/pkgs/http2/lib/src/hpack/hpack.dart
index ab5d9c8..de44266 100644
--- a/pkgs/http2/lib/src/hpack/hpack.dart
+++ b/pkgs/http2/lib/src/hpack/hpack.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Implements a [HPackContext] for encoding/decoding headers according to the
-/// HPACK specificaiton. See here for more information:
+/// HPACK specification. See here for more information:
 ///   https://tools.ietf.org/html/draft-ietf-httpbis-header-compression-10
-library http2.hpack;
+library;
 
 import 'dart:convert' show ascii;
 import 'dart:typed_data';
diff --git a/pkgs/http2/pubspec.yaml b/pkgs/http2/pubspec.yaml
index 7d9e6b8..bb1c2ca 100644
--- a/pkgs/http2/pubspec.yaml
+++ b/pkgs/http2/pubspec.yaml
@@ -1,18 +1,18 @@
 name: http2
-version: 2.3.1
+version: 2.3.2-wip
 description: A HTTP/2 implementation in Dart.
 repository: https://github.com/dart-lang/http/tree/master/pkgs/http2
 
 topics:
- - http
- - network
- - protocols
+  - http
+  - network
+  - protocols
 
 environment:
   sdk: ^3.2.0
 
 dev_dependencies:
   build_runner: ^2.3.0
-  dart_flutter_team_lints: ^2.0.0
+  dart_flutter_team_lints: ^3.0.0
   mockito: ^5.3.2
   test: ^1.21.4
diff --git a/pkgs/http_client_conformance_tests/lib/http_client_conformance_tests.dart b/pkgs/http_client_conformance_tests/lib/http_client_conformance_tests.dart
index 1a43a6b..0686c9d 100644
--- a/pkgs/http_client_conformance_tests/lib/http_client_conformance_tests.dart
+++ b/pkgs/http_client_conformance_tests/lib/http_client_conformance_tests.dart
@@ -69,6 +69,9 @@
 /// If [supportsFoldedHeaders] is `false` then the tests that assume that the
 /// [Client] can parse folded headers will be skipped.
 ///
+/// If [correctlyHandlesNullHeaderValues] is `false` then the tests that assume
+/// that the [Client] correctly deals with NUL in header values are skipped.
+///
 /// If [supportsMultipartRequest] is `false` then tests that assume that
 /// multipart requests can be sent will be skipped.
 ///
@@ -83,6 +86,7 @@
   bool canWorkInIsolates = true,
   bool preservesMethodCase = false,
   bool supportsFoldedHeaders = true,
+  bool correctlyHandlesNullHeaderValues = true,
   bool canSendCookieHeaders = false,
   bool canReceiveSetCookieHeaders = false,
   bool supportsMultipartRequest = true,
@@ -97,7 +101,8 @@
   testRequestHeaders(clientFactory());
   testRequestMethods(clientFactory(), preservesMethodCase: preservesMethodCase);
   testResponseHeaders(clientFactory(),
-      supportsFoldedHeaders: supportsFoldedHeaders);
+      supportsFoldedHeaders: supportsFoldedHeaders,
+      correctlyHandlesNullHeaderValues: correctlyHandlesNullHeaderValues);
   testResponseStatusLine(clientFactory());
   testRedirect(clientFactory(), redirectAlwaysAllowed: redirectAlwaysAllowed);
   testServerErrors(clientFactory());
diff --git a/pkgs/http_client_conformance_tests/lib/src/response_headers_tests.dart b/pkgs/http_client_conformance_tests/lib/src/response_headers_tests.dart
index 4ecb144..7d02353 100644
--- a/pkgs/http_client_conformance_tests/lib/src/response_headers_tests.dart
+++ b/pkgs/http_client_conformance_tests/lib/src/response_headers_tests.dart
@@ -11,8 +11,15 @@
     if (dart.library.js_interop) 'response_headers_server_web.dart';
 
 /// Tests that the [Client] correctly processes response headers.
+///
+/// If [supportsFoldedHeaders] is `false` then the tests that assume that the
+/// [Client] can parse folded headers will be skipped.
+///
+/// If [correctlyHandlesNullHeaderValues] is `false` then the tests that assume
+/// that the [Client] correctly deals with NUL in header values are skipped.
 void testResponseHeaders(Client client,
-    {bool supportsFoldedHeaders = true}) async {
+    {bool supportsFoldedHeaders = true,
+    bool correctlyHandlesNullHeaderValues = true}) async {
   group('server headers', () {
     late String host;
     late StreamChannel<Object?> httpServerChannel;
@@ -123,6 +130,77 @@
           matches(r'apple[ \t]*,[ \t]*orange[ \t]*,[ \t]*banana'));
     });
 
+    group('invalid headers values', () {
+      // From RFC-9110:
+      // Field values containing CR, LF, or NUL characters are invalid and
+      // dangerous, due to the varying ways that implementations might parse and
+      // interpret those characters; a recipient of CR, LF, or NUL within a
+      // field value MUST either reject the message or replace each of those
+      // characters with SP before further processing or forwarding of that
+      // message.
+      test('NUL', () async {
+        httpServerChannel.sink.add('invalid: 1\x002\r\n');
+
+        try {
+          final response = await client.get(Uri.http(host, ''));
+          expect(response.headers['invalid'], '1 2');
+        } on ClientException {
+          // The client rejected the response, which is allowed per RFC-9110.
+        }
+      },
+          skip: !correctlyHandlesNullHeaderValues
+              ? 'does not correctly handle NUL in header values'
+              : false);
+
+      // Bare CR/LF seem to be interpreted the same as CR + LF by most clients
+      // so allow that behavior.
+      test('LF', () async {
+        httpServerChannel.sink.add('foo: 1\n2\r\n');
+
+        try {
+          final response = await client.get(Uri.http(host, ''));
+          expect(
+              response.headers['foo'],
+              anyOf(
+                  '1 2', // RFC-specified behavior
+                  '1' // Common client behavior.
+                  ));
+        } on ClientException {
+          // The client rejected the response, which is allowed per RFC-9110.
+        }
+      });
+
+      test('CR', () async {
+        httpServerChannel.sink.add('foo: 1\r2\r\n');
+
+        try {
+          final response = await client.get(Uri.http(host, ''));
+          expect(
+              response.headers['foo'],
+              anyOf(
+                  '1 2', // RFC-specified behavior
+                  '1' // Common client behavior.
+                  ));
+        } on ClientException {
+          // The client rejected the response, which is allowed per RFC-9110.
+        }
+      });
+    });
+
+    test('quotes', () async {
+      httpServerChannel.sink.add('FOO: "1, 2, 3"\r\n');
+
+      final response = await client.get(Uri.http(host, ''));
+      expect(response.headers['foo'], '"1, 2, 3"');
+    });
+
+    test('nested quotes', () async {
+      httpServerChannel.sink.add('FOO: "\\"1, 2, 3\\""\r\n');
+
+      final response = await client.get(Uri.http(host, ''));
+      expect(response.headers['foo'], '"\\"1, 2, 3\\""');
+    });
+
     group('content length', () {
       test('surrounded in spaces', () async {
         // RFC-2616 4.2 says:
diff --git a/pkgs/http_client_conformance_tests/pubspec.yaml b/pkgs/http_client_conformance_tests/pubspec.yaml
index 74d165e..2d8d652 100644
--- a/pkgs/http_client_conformance_tests/pubspec.yaml
+++ b/pkgs/http_client_conformance_tests/pubspec.yaml
@@ -11,7 +11,7 @@
 
 dependencies:
   async: ^2.8.2
-  dart_style: ^2.3.7
+  dart_style: '>=2.3.7 <4.0.0'
   http: ^1.2.0
   stream_channel: ^2.1.1
   test: ^1.21.2
diff --git a/pkgs/http_multi_server/.gitignore b/pkgs/http_multi_server/.gitignore
new file mode 100644
index 0000000..e98dd14
--- /dev/null
+++ b/pkgs/http_multi_server/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.dart_tool/
+.packages
+build/
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
diff --git a/pkgs/http_multi_server/.test_config b/pkgs/http_multi_server/.test_config
new file mode 100644
index 0000000..531426a
--- /dev/null
+++ b/pkgs/http_multi_server/.test_config
@@ -0,0 +1,5 @@
+{
+  "test_package": {
+    "platforms": ["vm"]
+  }
+}
\ No newline at end of file
diff --git a/pkgs/http_multi_server/CHANGELOG.md b/pkgs/http_multi_server/CHANGELOG.md
new file mode 100644
index 0000000..2af6d1d
--- /dev/null
+++ b/pkgs/http_multi_server/CHANGELOG.md
@@ -0,0 +1,113 @@
+## 3.2.2
+
+* Require Dart 3.2
+* Move to `dart-lang/http` monorepo.
+
+## 3.2.1
+
+* Populate the pubspec `repository` field.
+
+## 3.2.0
+
+* Honor the `preserveHeaderCase` argument to `MultiHeaders.set` and `.add`.
+
+## 3.1.0
+
+* Add `HttpMultiServer.bindSecure` to match `HttpMultiServer.bind`.
+
+## 3.0.1
+
+* Fix an issue where `bind` would bind to the `anyIPv6` address in unsupported
+  environments.
+
+## 3.0.0
+
+* Migrate to null safety.
+
+## 2.2.0
+
+* Preparation for [HttpHeaders change]. Update signature of `MultiHeaders.add()`
+  and `MultiHeaders.set()` to match new signature of `HttpHeaders`. The
+  parameter is not yet forwarded and will not behave as expected.
+
+  [HttpHeaders change]: https://github.com/dart-lang/sdk/issues/39657
+
+## 2.1.0
+
+* Add `HttpMultiServer.bind` static which centralizes logic around common local
+  serving scenarios - handling a more flexible 'localhost' and listening on
+  'any' hostname.
+* Update SDK constraints to `>=2.1.0 <3.0.0`.
+
+## 2.0.6
+
+* If there is a problem starting a loopback Ipv6 server, don't keep the Ipv4
+  server open when throwing the exception.
+
+## 2.0.5
+
+* Update SDK constraints to `>=2.0.0-dev <3.0.0`.
+
+## 2.0.4
+
+* Declare support for `async` 2.0.0.
+
+## 2.0.3
+
+* Fix `HttpMultiServer.loopback()` and `.loopbackSecure()` for environments that
+  don't support IPv4.
+
+## 2.0.2
+
+* Fix a dependency that was incorrectly marked as dev-only.
+
+## 2.0.1
+
+* Fix most strong mode errors and warnings.
+
+## 2.0.0
+
+* **Breaking:** Change the signature of `HttpMultiServer.loopbackSecure()` to
+  match the new Dart 1.13 `HttpServer.bindSecure()` signature. This removes the
+  `certificateName` named parameter and adds the required `context` parameter
+  and the named `v6Only` and `shared` parameters.
+
+* Added `v6Only` and `shared` parameters to `HttpMultiServer.loopback()` to
+  match `HttpServer.bind()`.
+
+## 1.3.2
+
+* Eventually stop retrying port allocation if it fails repeatedly.
+
+* Properly detect socket errors caused by already-in-use addresses.
+
+## 1.3.1
+
+* `loopback()` and `loopbackSecure()` recover gracefully if an ephemeral port is
+  requested and the located port isn't available on both IPv4 and IPv6.
+
+## 1.3.0
+
+* Add support for `HttpServer.autoCompress`.
+
+## 1.2.0
+
+* Add support for `HttpServer.defaultResponseHeaders.clear`.
+
+* Fix `HttpServer.defaultResponseHeaders.remove` and `.removeAll`.
+
+## 1.1.0
+
+* Add support for `HttpServer.defaultResponseHeaders`.
+
+## 1.0.2
+
+* Remove the workaround for [issue 19815][].
+
+## 1.0.1
+
+* Ignore errors from one of the servers if others are still bound. In
+  particular, this works around [issue 19815][] on some Windows machines where
+  IPv6 failure isn't discovered until we try to connect to the socket.
+
+[issue 19815]: https://code.google.com/p/dart/issues/detail?id=19815
diff --git a/pkgs/http_multi_server/LICENSE b/pkgs/http_multi_server/LICENSE
new file mode 100644
index 0000000..162572a
--- /dev/null
+++ b/pkgs/http_multi_server/LICENSE
@@ -0,0 +1,27 @@
+Copyright 2014, the Dart project authors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google LLC nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkgs/http_multi_server/README.md b/pkgs/http_multi_server/README.md
new file mode 100644
index 0000000..7d1d6bf
--- /dev/null
+++ b/pkgs/http_multi_server/README.md
@@ -0,0 +1,28 @@
+[![Dart CI](https://github.com/dart-lang/http/actions/workflows/http_multi_server.yaml/badge.svg)](https://github.com/dart-lang/http/actions/workflows/http_multi_server.yaml)
+[![pub package](https://img.shields.io/pub/v/http_multi_server.svg)](https://pub.dev/packages/http_multi_server)
+[![package publisher](https://img.shields.io/pub/publisher/http_multi_server.svg)](https://pub.dev/packages/http_multi_server/publisher)
+
+An implementation of `dart:io`'s [HttpServer][] that wraps multiple servers and
+forwards methods to all of them. It's useful for serving the same application on
+multiple network interfaces while still having a unified way of controlling the
+servers. In particular, it supports serving on both the IPv4 and IPv6 loopback
+addresses using [HttpMultiServer.loopback][].
+
+```dart
+import 'package:http_multi_server/http_multi_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
+
+void main() async {
+  // Both http://127.0.0.1:8080 and http://[::1]:8080 will be bound to the same
+  // server.
+  var server = await HttpMultiServer.loopback(8080);
+  shelf_io.serveRequests(server, (request) {
+    return shelf.Response.ok("Hello, world!");
+  });
+}
+```
+
+[HttpServer]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-io.HttpServer
+
+[HttpMultiServer.loopback]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/http_multi_server/http_multi_server.HttpMultiServer#id_loopback
diff --git a/pkgs/http_multi_server/analysis_options.yaml b/pkgs/http_multi_server/analysis_options.yaml
new file mode 100644
index 0000000..99d2063
--- /dev/null
+++ b/pkgs/http_multi_server/analysis_options.yaml
@@ -0,0 +1,25 @@
+# https://dart.dev/tools/analysis#the-analysis-options-file
+include: package:dart_flutter_team_lints/analysis_options.yaml
+
+analyzer:
+  language:
+    strict-casts: true
+
+linter:
+  rules:
+  - avoid_bool_literals_in_conditional_expressions
+  - avoid_classes_with_only_static_members
+  - avoid_private_typedef_functions
+  - avoid_redundant_argument_values
+  - avoid_returning_this
+  - avoid_unused_constructor_parameters
+  - cancel_subscriptions
+  - cascade_invocations
+  - join_return_with_assignment
+  - literal_only_boolean_expressions
+  - no_adjacent_strings_in_list
+  - no_runtimeType_toString
+  - prefer_const_declarations
+  - prefer_expression_function_bodies
+  - prefer_final_locals
+  - use_string_buffers
diff --git a/pkgs/http_multi_server/example/main.dart b/pkgs/http_multi_server/example/main.dart
new file mode 100644
index 0000000..6e90c8b
--- /dev/null
+++ b/pkgs/http_multi_server/example/main.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:http_multi_server/http_multi_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
+
+void main() async {
+  // Both http://127.0.0.1:8080 and http://[::1]:8080 will be bound to the same
+  // server.
+  final server = await HttpMultiServer.loopback(8080);
+  shelf_io.serveRequests(
+    server,
+    (request) => shelf.Response.ok('Hello, world!'),
+  );
+}
diff --git a/pkgs/http_multi_server/lib/http_multi_server.dart b/pkgs/http_multi_server/lib/http_multi_server.dart
new file mode 100644
index 0000000..18fba33
--- /dev/null
+++ b/pkgs/http_multi_server/lib/http_multi_server.dart
@@ -0,0 +1,250 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:async/async.dart';
+
+import 'src/multi_headers.dart';
+import 'src/utils.dart';
+
+/// The error code for an error caused by a port already being in use.
+final _addressInUseErrno = _computeAddressInUseErrno();
+int _computeAddressInUseErrno() {
+  if (Platform.isWindows) return 10048;
+  if (Platform.isMacOS) return 48;
+  assert(Platform.isLinux);
+  return 98;
+}
+
+/// An implementation of `dart:io`'s [HttpServer] that wraps multiple servers
+/// and forwards methods to all of them.
+///
+/// This is useful for serving the same application on multiple network
+/// interfaces while still having a unified way of controlling the servers. In
+/// particular, it supports serving on both the IPv4 and IPv6 loopback addresses
+/// using [HttpMultiServer.loopback].
+class HttpMultiServer extends StreamView<HttpRequest> implements HttpServer {
+  /// The wrapped servers.
+  final Set<HttpServer> _servers;
+
+  /// Returns the default value of the `Server` header for all responses
+  /// generated by each server.
+  ///
+  /// If the wrapped servers have different default values, it's not defined
+  /// which value is returned.
+  @override
+  String? get serverHeader => _servers.first.serverHeader;
+
+  @override
+  set serverHeader(String? value) {
+    for (var server in _servers) {
+      server.serverHeader = value;
+    }
+  }
+
+  /// Returns the default set of headers added to all response objects.
+  ///
+  /// If the wrapped servers have different default headers, it's not defined
+  /// which header is returned for accessor methods.
+  @override
+  final HttpHeaders defaultResponseHeaders;
+
+  @override
+  Duration? get idleTimeout => _servers.first.idleTimeout;
+  @override
+  set idleTimeout(Duration? value) {
+    for (var server in _servers) {
+      server.idleTimeout = value;
+    }
+  }
+
+  @override
+  bool get autoCompress => _servers.first.autoCompress;
+  @override
+  set autoCompress(bool value) {
+    for (var server in _servers) {
+      server.autoCompress = value;
+    }
+  }
+
+  /// Returns the port that one of the wrapped servers is listening on.
+  ///
+  /// If the wrapped servers are listening on different ports, it's not defined
+  /// which port is returned.
+  @override
+  int get port => _servers.first.port;
+
+  /// Returns the address that one of the wrapped servers is listening on.
+  ///
+  /// If the wrapped servers are listening on different addresses, it's not
+  /// defined which address is returned.
+  @override
+  InternetAddress get address => _servers.first.address;
+
+  @override
+  set sessionTimeout(int value) {
+    for (var server in _servers) {
+      server.sessionTimeout = value;
+    }
+  }
+
+  /// Creates an [HttpMultiServer] wrapping [servers].
+  ///
+  /// All [servers] should have the same configuration and none should be
+  /// listened to when this is called.
+  HttpMultiServer(Iterable<HttpServer> servers)
+      : _servers = servers.toSet(),
+        defaultResponseHeaders = MultiHeaders(
+            servers.map((server) => server.defaultResponseHeaders)),
+        super(StreamGroup.merge(servers));
+
+  /// Creates an [HttpServer] listening on all available loopback addresses for
+  /// this computer.
+  ///
+  /// See [HttpServer.bind].
+  static Future<HttpServer> loopback(int port,
+          {int backlog = 0, bool v6Only = false, bool shared = false}) =>
+      _loopback(
+          port,
+          (address, port) => HttpServer.bind(address, port,
+              backlog: backlog, v6Only: v6Only, shared: shared));
+
+  /// Like [loopback], but supports HTTPS requests.
+  ///
+  /// See [HttpServer.bindSecure].
+  static Future<HttpServer> loopbackSecure(int port, SecurityContext context,
+          {int backlog = 0,
+          bool v6Only = false,
+          bool requestClientCertificate = false,
+          bool shared = false}) =>
+      _loopback(
+          port,
+          (address, port) => HttpServer.bindSecure(address, port, context,
+              backlog: backlog,
+              v6Only: v6Only,
+              shared: shared,
+              requestClientCertificate: requestClientCertificate));
+
+  /// Bind an [HttpServer] with handling for special addresses 'localhost' and
+  /// 'any'.
+  ///
+  /// For address 'localhost' behaves like [loopback].
+  ///
+  /// For 'any' listens on [InternetAddress.anyIPv6] if the system supports IPv6
+  /// otherwise [InternetAddress.anyIPv4]. Note [InternetAddress.anyIPv6]
+  /// listens on all hostnames for both IPv4 and IPv6.
+  ///
+  /// For any other address forwards directly to `HttpServer.bind` where
+  /// the IPvX support may vary.
+  ///
+  /// See [HttpServer.bind].
+  static Future<HttpServer> bind(dynamic address, int port,
+      {int backlog = 0, bool v6Only = false, bool shared = false}) async {
+    if (address == 'localhost') {
+      return HttpMultiServer.loopback(port,
+          backlog: backlog, v6Only: v6Only, shared: shared);
+    }
+    if (address == 'any') {
+      return HttpServer.bind(
+          await supportsIPv6
+              ? InternetAddress.anyIPv6
+              : InternetAddress.anyIPv4,
+          port,
+          backlog: backlog,
+          v6Only: v6Only,
+          shared: shared);
+    }
+    return HttpServer.bind(address, port,
+        backlog: backlog, v6Only: v6Only, shared: shared);
+  }
+
+  /// Bind a secure [HttpServer] with handling for special addresses 'localhost'
+  /// and 'any'.
+  ///
+  /// For address 'localhost' behaves like [loopback].
+  ///
+  /// For 'any' listens on [InternetAddress.anyIPv6] if the system supports IPv6
+  /// otherwise [InternetAddress.anyIPv4]. Note [InternetAddress.anyIPv6]
+  /// listens on all hostnames for both IPv4 and IPv6.
+  ///
+  /// See [HttpServer.bindSecure].
+  static Future<HttpServer> bindSecure(
+      dynamic address, int port, SecurityContext context,
+      {int backlog = 0, bool v6Only = false, bool shared = false}) async {
+    if (address == 'localhost') {
+      return await HttpMultiServer.loopbackSecure(port, context,
+          backlog: backlog, v6Only: v6Only, shared: shared);
+    }
+    if (address == 'any') {
+      return await HttpServer.bindSecure(
+          await supportsIPv6
+              ? InternetAddress.anyIPv6
+              : InternetAddress.anyIPv4,
+          port,
+          context,
+          backlog: backlog,
+          v6Only: v6Only,
+          shared: shared);
+    }
+    return await HttpServer.bindSecure(address, port, context,
+        backlog: backlog, v6Only: v6Only, shared: shared);
+  }
+
+  /// A helper method for initializing loopback servers.
+  ///
+  /// [bind] should forward to either [HttpServer.bind] or
+  /// [HttpServer.bindSecure].
+  static Future<HttpServer> _loopback(
+      int port, Future<HttpServer> Function(InternetAddress, int port) bind,
+      [int remainingRetries = 5]) async {
+    if (!await supportsIPv4) {
+      return await bind(InternetAddress.loopbackIPv6, port);
+    }
+
+    final v4Server = await bind(InternetAddress.loopbackIPv4, port);
+    if (!await supportsIPv6) return v4Server;
+
+    try {
+      // Reuse the IPv4 server's port so that if [port] is 0, both servers use
+      // the same ephemeral port.
+      final v6Server = await bind(InternetAddress.loopbackIPv6, v4Server.port);
+      return HttpMultiServer([v4Server, v6Server]);
+    } on SocketException catch (error) {
+      // If there is already a server listening we'll lose the reference on a
+      // rethrow.
+      await v4Server.close();
+
+      if (error.osError?.errorCode != _addressInUseErrno) rethrow;
+      if (port != 0) rethrow;
+      if (remainingRetries == 0) rethrow;
+
+      // A port being available on IPv4 doesn't necessarily mean that the same
+      // port is available on IPv6. If it's not (which is rare in practice),
+      // we try again until we find one that's available on both.
+      return await _loopback(port, bind, remainingRetries - 1);
+    }
+  }
+
+  @override
+  Future close({bool force = false}) =>
+      Future.wait(_servers.map((server) => server.close(force: force)));
+
+  /// Returns an HttpConnectionsInfo object summarizing the total number of
+  /// current connections handled by all the servers.
+  @override
+  HttpConnectionsInfo connectionsInfo() {
+    final info = HttpConnectionsInfo();
+    for (var server in _servers) {
+      final subInfo = server.connectionsInfo();
+      info
+        ..total += subInfo.total
+        ..active += subInfo.active
+        ..idle += subInfo.idle
+        ..closing += subInfo.closing;
+    }
+    return info;
+  }
+}
diff --git a/pkgs/http_multi_server/lib/src/multi_headers.dart b/pkgs/http_multi_server/lib/src/multi_headers.dart
new file mode 100644
index 0000000..c5ee3d2
--- /dev/null
+++ b/pkgs/http_multi_server/lib/src/multi_headers.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+/// A class that delegates header access and setting to many [HttpHeaders]
+/// instances.
+class MultiHeaders implements HttpHeaders {
+  /// The wrapped headers.
+  final Set<HttpHeaders> _headers;
+
+  @override
+  bool get chunkedTransferEncoding => _headers.first.chunkedTransferEncoding;
+  @override
+  set chunkedTransferEncoding(bool value) {
+    for (var headers in _headers) {
+      headers.chunkedTransferEncoding = value;
+    }
+  }
+
+  @override
+  int get contentLength => _headers.first.contentLength;
+  @override
+  set contentLength(int value) {
+    for (var headers in _headers) {
+      headers.contentLength = value;
+    }
+  }
+
+  @override
+  ContentType? get contentType => _headers.first.contentType;
+  @override
+  set contentType(ContentType? value) {
+    for (var headers in _headers) {
+      headers.contentType = value;
+    }
+  }
+
+  @override
+  DateTime? get date => _headers.first.date;
+  @override
+  set date(DateTime? value) {
+    for (var headers in _headers) {
+      headers.date = value;
+    }
+  }
+
+  @override
+  DateTime? get expires => _headers.first.expires;
+  @override
+  set expires(DateTime? value) {
+    for (var headers in _headers) {
+      headers.expires = value;
+    }
+  }
+
+  @override
+  String? get host => _headers.first.host;
+  @override
+  set host(String? value) {
+    for (var headers in _headers) {
+      headers.host = value;
+    }
+  }
+
+  @override
+  DateTime? get ifModifiedSince => _headers.first.ifModifiedSince;
+  @override
+  set ifModifiedSince(DateTime? value) {
+    for (var headers in _headers) {
+      headers.ifModifiedSince = value;
+    }
+  }
+
+  @override
+  bool get persistentConnection => _headers.first.persistentConnection;
+  @override
+  set persistentConnection(bool value) {
+    for (var headers in _headers) {
+      headers.persistentConnection = value;
+    }
+  }
+
+  @override
+  int? get port => _headers.first.port;
+  @override
+  set port(int? value) {
+    for (var headers in _headers) {
+      headers.port = value;
+    }
+  }
+
+  MultiHeaders(Iterable<HttpHeaders> headers) : _headers = headers.toSet();
+
+  @override
+  void add(String name, Object value, {bool preserveHeaderCase = false}) {
+    for (var headers in _headers) {
+      headers.add(name, value, preserveHeaderCase: preserveHeaderCase);
+    }
+  }
+
+  @override
+  void forEach(void Function(String name, List<String> values) f) =>
+      _headers.first.forEach(f);
+
+  @override
+  void noFolding(String name) {
+    for (var headers in _headers) {
+      headers.noFolding(name);
+    }
+  }
+
+  @override
+  void remove(String name, Object value) {
+    for (var headers in _headers) {
+      headers.remove(name, value);
+    }
+  }
+
+  @override
+  void removeAll(String name) {
+    for (var headers in _headers) {
+      headers.removeAll(name);
+    }
+  }
+
+  @override
+  void set(String name, Object value, {bool preserveHeaderCase = false}) {
+    for (var headers in _headers) {
+      headers.set(name, value, preserveHeaderCase: preserveHeaderCase);
+    }
+  }
+
+  @override
+  String? value(String name) => _headers.first.value(name);
+
+  @override
+  List<String>? operator [](String name) => _headers.first[name];
+
+  @override
+  void clear() {
+    for (var headers in _headers) {
+      headers.clear();
+    }
+  }
+}
diff --git a/pkgs/http_multi_server/lib/src/utils.dart b/pkgs/http_multi_server/lib/src/utils.dart
new file mode 100644
index 0000000..87520fb
--- /dev/null
+++ b/pkgs/http_multi_server/lib/src/utils.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+/// Returns whether this computer supports binding to IPv6 addresses.
+final Future<bool> supportsIPv6 = () async {
+  try {
+    final socket = await ServerSocket.bind(InternetAddress.loopbackIPv6, 0);
+    await socket.close();
+    return true;
+  } on SocketException catch (_) {
+    return false;
+  }
+}();
+
+/// Returns whether this computer supports binding to IPv4 addresses.
+final Future<bool> supportsIPv4 = () async {
+  try {
+    final socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
+    await socket.close();
+    return true;
+  } on SocketException catch (_) {
+    return false;
+  }
+}();
diff --git a/pkgs/http_multi_server/pubspec.yaml b/pkgs/http_multi_server/pubspec.yaml
new file mode 100644
index 0000000..a9829ff
--- /dev/null
+++ b/pkgs/http_multi_server/pubspec.yaml
@@ -0,0 +1,17 @@
+name: http_multi_server
+version: 3.2.2
+description: >-
+  A dart:io HttpServer wrapper that handles requests from multiple servers.
+repository: https://github.com/dart-lang/http/tree/master/pkgs/http_multi_server
+
+environment:
+  sdk: ^3.2.0
+
+dependencies:
+  async: ^2.5.0
+
+dev_dependencies:
+  dart_flutter_team_lints: ^3.0.0
+  http: ^1.0.0
+  shelf: ^1.4.0
+  test: ^1.16.6
diff --git a/pkgs/http_multi_server/test/http_multi_server_test.dart b/pkgs/http_multi_server/test/http_multi_server_test.dart
new file mode 100644
index 0000000..a644348
--- /dev/null
+++ b/pkgs/http_multi_server/test/http_multi_server_test.dart
@@ -0,0 +1,418 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:http/io_client.dart' as http;
+import 'package:http_multi_server/http_multi_server.dart';
+import 'package:http_multi_server/src/utils.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('with multiple HttpServers', () {
+    late HttpMultiServer multiServer;
+    late HttpServer subServer1;
+    late HttpServer subServer2;
+    late HttpServer subServer3;
+
+    setUp(() => Future.wait([
+          HttpServer.bind('localhost', 0).then((server) => subServer1 = server),
+          HttpServer.bind('localhost', 0).then((server) => subServer2 = server),
+          HttpServer.bind('localhost', 0).then((server) => subServer3 = server)
+        ]).then((servers) => multiServer = HttpMultiServer(servers)));
+
+    tearDown(() => multiServer.close());
+
+    test('listen listens to all servers', () {
+      multiServer.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      expect(_read(subServer1), completion(equals('got request')));
+      expect(_read(subServer2), completion(equals('got request')));
+      expect(_read(subServer3), completion(equals('got request')));
+    });
+
+    test('serverHeader= sets the value for all servers', () {
+      multiServer
+        ..serverHeader = 'http_multi_server test'
+        ..listen((request) {
+          request.response.write('got request');
+          request.response.close();
+        });
+
+      expect(
+          _get(subServer1).then((response) {
+            expect(
+                response.headers['server'], equals('http_multi_server test'));
+          }),
+          completes);
+
+      expect(
+          _get(subServer2).then((response) {
+            expect(
+                response.headers['server'], equals('http_multi_server test'));
+          }),
+          completes);
+
+      expect(
+          _get(subServer3).then((response) {
+            expect(
+                response.headers['server'], equals('http_multi_server test'));
+          }),
+          completes);
+    });
+
+    test('autoCompress= sets the value for all servers', () {
+      multiServer
+        ..autoCompress = true
+        ..listen((request) {
+          request.response.write('got request');
+          request.response.close();
+        });
+
+      expect(
+          _get(subServer1).then((response) {
+            expect(response.headers['content-encoding'], equals('gzip'));
+          }),
+          completes);
+
+      expect(
+          _get(subServer2).then((response) {
+            expect(response.headers['content-encoding'], equals('gzip'));
+          }),
+          completes);
+
+      expect(
+          _get(subServer3).then((response) {
+            expect(response.headers['content-encoding'], equals('gzip'));
+          }),
+          completes);
+    });
+
+    test('headers.set sets the value for all servers', () {
+      multiServer.defaultResponseHeaders
+          .set('server', 'http_multi_server test');
+
+      multiServer.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      expect(
+          _get(subServer1).then((response) {
+            expect(
+                response.headers['server'], equals('http_multi_server test'));
+          }),
+          completes);
+
+      expect(
+          _get(subServer2).then((response) {
+            expect(
+                response.headers['server'], equals('http_multi_server test'));
+          }),
+          completes);
+
+      expect(
+          _get(subServer3).then((response) {
+            expect(
+                response.headers['server'], equals('http_multi_server test'));
+          }),
+          completes);
+    });
+
+    test('connectionsInfo sums the values for all servers', () {
+      var pendingRequests = 0;
+      final awaitingResponseCompleter = Completer<void>();
+      final sendResponseCompleter = Completer<void>();
+      multiServer.listen((request) {
+        sendResponseCompleter.future.then((_) {
+          request.response.write('got request');
+          request.response.close();
+        });
+
+        pendingRequests++;
+        if (pendingRequests == 2) awaitingResponseCompleter.complete();
+      });
+
+      // Queue up some requests, then wait on [awaitingResponseCompleter] to
+      // make sure they're in-flight before we check [connectionsInfo].
+      expect(_get(subServer1), completes);
+      expect(_get(subServer2), completes);
+
+      return awaitingResponseCompleter.future.then((_) {
+        final info = multiServer.connectionsInfo();
+        expect(info.total, equals(2));
+        expect(info.active, equals(2));
+        expect(info.idle, equals(0));
+        expect(info.closing, equals(0));
+
+        sendResponseCompleter.complete();
+      });
+    });
+  });
+
+  group('HttpMultiServer.loopback', () {
+    late HttpServer server;
+
+    setUp(() => HttpMultiServer.loopback(0).then((s) => server = s));
+
+    tearDown(() => server.close());
+
+    test('listens on all localhost interfaces', () async {
+      server.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      if (await supportsIPv4) {
+        expect(http.read(Uri.http('127.0.0.1:${server.port}', '/')),
+            completion(equals('got request')));
+      }
+
+      if (await supportsIPv6) {
+        expect(http.read(Uri.http('[::1]:${server.port}', '/')),
+            completion(equals('got request')));
+      }
+    });
+  });
+
+  group('HttpMultiServer.bind', () {
+    test("listens on all localhost interfaces for 'localhost'", () async {
+      final server = await HttpMultiServer.bind('localhost', 0);
+      server.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      if (await supportsIPv4) {
+        expect(http.read(Uri.http('127.0.0.1:${server.port}', '/')),
+            completion(equals('got request')));
+      }
+
+      if (await supportsIPv6) {
+        expect(http.read(Uri.http('[::1]:${server.port}', '/')),
+            completion(equals('got request')));
+      }
+    });
+
+    test("listens on all localhost interfaces for 'any'", () async {
+      final server = await HttpMultiServer.bind('any', 0);
+      server.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      if (await supportsIPv4) {
+        expect(http.read(Uri.http('127.0.0.1:${server.port}', '/')),
+            completion(equals('got request')));
+      }
+
+      if (await supportsIPv6) {
+        expect(http.read(Uri.http('[::1]:${server.port}', '/')),
+            completion(equals('got request')));
+      }
+    });
+
+    test("uses the correct server address for 'any'", () async {
+      final server = await HttpMultiServer.bind('any', 0);
+
+      if (!await supportsIPv6) {
+        expect(server.address, InternetAddress.anyIPv4);
+      } else {
+        expect(server.address, InternetAddress.anyIPv6);
+      }
+    });
+
+    test('listens on specified hostname', () async {
+      if (!await supportsIPv4) return;
+      final server = await HttpMultiServer.bind(InternetAddress.anyIPv4, 0);
+      server.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      expect(http.read(Uri.http('127.0.0.1:${server.port}', '/')),
+          completion(equals('got request')));
+
+      if (await supportsIPv6) {
+        expect(http.read(Uri.http('[::1]:${server.port}', '/')),
+            throwsA(isA<SocketException>()));
+      }
+    });
+  });
+
+  group('HttpMultiServer.bindSecure', () {
+    late http.Client client;
+    late SecurityContext context;
+    setUp(() async {
+      context = SecurityContext()
+        ..setTrustedCertificatesBytes(_sslCert)
+        ..useCertificateChainBytes(_sslCert)
+        ..usePrivateKeyBytes(_sslKey, password: 'dartdart');
+      client = http.IOClient(HttpClient(context: context));
+    });
+    test('listens on all localhost interfaces for "localhost"', () async {
+      final server = await HttpMultiServer.bindSecure('localhost', 0, context);
+      server.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      if (await supportsIPv4) {
+        expect(client.read(Uri.https('127.0.0.1:${server.port}')),
+            completion(equals('got request')));
+      }
+
+      if (await supportsIPv6) {
+        expect(client.read(Uri.https('[::1]:${server.port}')),
+            completion(equals('got request')));
+      }
+    });
+
+    test('listens on all localhost interfaces for "any"', () async {
+      final server = await HttpMultiServer.bindSecure('any', 0, context);
+      server.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      if (await supportsIPv4) {
+        expect(client.read(Uri.https('127.0.0.1:${server.port}')),
+            completion(equals('got request')));
+      }
+
+      if (await supportsIPv6) {
+        expect(client.read(Uri.https('[::1]:${server.port}')),
+            completion(equals('got request')));
+      }
+    });
+
+    test('listens on specified hostname', () async {
+      if (!await supportsIPv4) return;
+      final server =
+          await HttpMultiServer.bindSecure(InternetAddress.anyIPv4, 0, context);
+      server.listen((request) {
+        request.response.write('got request');
+        request.response.close();
+      });
+
+      expect(client.read(Uri.https('127.0.0.1:${server.port}')),
+          completion(equals('got request')));
+
+      if (await supportsIPv6) {
+        expect(client.read(Uri.https('[::1]:${server.port}')),
+            throwsA(isA<SocketException>()));
+      }
+    });
+  });
+}
+
+/// Makes a GET request to the root of [server] and returns the response.
+Future<http.Response> _get(HttpServer server) => http.get(_urlFor(server));
+
+/// Makes a GET request to the root of [server] and returns the response body.
+Future<String> _read(HttpServer server) => http.read(_urlFor(server));
+
+/// Returns the URL for the root of [server].
+Uri _urlFor(HttpServer server) =>
+    Uri.http('${server.address.host}:${server.port}', '/');
+
+final _sslCert = utf8.encode('''
+-----BEGIN CERTIFICATE-----
+MIIDZDCCAkygAwIBAgIBATANBgkqhkiG9w0BAQsFADAgMR4wHAYDVQQDDBVpbnRl
+cm1lZGlhdGVhdXRob3JpdHkwHhcNMTUxMDI3MTAyNjM1WhcNMjUxMDI0MTAyNjM1
+WjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCkg/Qr8RQeLTOSgCkyiEX2ztgkgscX8hKGHEHdvlkmVK3JVEIIwkvu
+/Y9LtHZUia3nPAgqEEbexzTENZjSCcC0V6I2XW/e5tIE3rO0KLZyhtZhN/2SfJ6p
+KbOh0HLr1VtkKJGp1tzUmHW/aZI32pK60ZJ/N917NLPCJpCaL8+wHo3+w3oNqln6
+oJsfgxy9SUM8Bsc9WMYKMUdqLO1QKs1A5YwqZuO7Mwj+4LY2QDixC7Ua7V9YAPo2
+1SBeLvMCHbYxSPCuxcZ/kDkgax/DF9u7aZnGhMImkwBka0OQFvpfjKtTIuoobTpe
+PAG7MQYXk4RjnjdyEX/9XAQzvNo1CDObAgMBAAGjgbQwgbEwPAYDVR0RBDUwM4IJ
+bG9jYWxob3N0ggkxMjcuMC4wLjGCAzo6MYcEfwAAAYcQAAAAAAAAAAAAAAAAAAAA
+ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSvhJo6taTggJQBukEvMo/PDk8tKTAf
+BgNVHSMEGDAWgBS98L4T5RaIToE3DkBRsoeWPil0eDAOBgNVHQ8BAf8EBAMCA6gw
+EwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAHLOt0mL2S4A
+B7vN7KsfQeGlVgZUVlEjem6kqBh4fIzl4CsQuOO8oJ0FlO1z5JAIo98hZinymJx1
+phBVpyGIKakT/etMH0op5evLe9dD36VA3IM/FEv5ibk35iGnPokiJXIAcdHd1zam
+YaTHRAnZET5S03+7BgRTKoRuszhbvuFz/vKXaIAnVNOF4Gf2NUJ/Ax7ssJtRkN+5
+UVxe8TZVxzgiRv1uF6NTr+J8PDepkHCbJ6zEQNudcFKAuC56DN1vUe06gRDrNbVq
+2JHEh4pRfMpdsPCrS5YHBjVq/XHtFHgwDR6g0WTwSUJvDeM4OPQY5f61FB0JbFza
+PkLkXmoIod8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDLjCCAhagAwIBAgIBAjANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE1MTAyNzEwMjYzNVoXDTI1MTAyNDEwMjYzNVowIDEeMBwG
+A1UEAwwVaW50ZXJtZWRpYXRlYXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA6GndRFiXk+2q+Ig7ZOWKKGta+is8137qyXz+eVFs5sA0ajMN
+ZBAMWS0TIXw/Yks+y6fEcV/tfv91k1eUN4YXPcoxTdDF97d2hO9wxumeYOMnQeDy
+VZVDKQBZ+jFMeI+VkNpMEdmsLErpZDGob/1dC8tLEuR6RuRR8X6IDGMPOCMw1jLK
+V1bQjPtzqKadTscfjLuKxuLgspJdTrzsu6hdcl1mm8K6CjTY2HNXWxs1yYmwfuQ2
+Z4/8sOMNqFqLjN+ChD7pksTMq7IosqGiJzi2bpd5f44ek/k822Y0ATncJHk4h1Z+
+kZBnW6kgcLna1gDri9heRwSZ+M8T8nlHgIMZIQIDAQABo3sweTASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdDgQWBBS98L4T5RaIToE3DkBRsoeWPil0eDAfBgNVHSME
+GDAWgBRxD5DQHTmtpDFKDOiMf5FAi6vfbzAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l
+BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAD+4KpUeV5mUPw5IG/7w
+eOXnUpeS96XFGuS1JuFo/TbgntPWSPyo+rD4GrPIkUXyoHaMCDd2UBEjyGbBIKlB
+NZA3RJOAEp7DTkLNK4RFn/OEcLwG0J5brL7kaLRO4vwvItVIdZ2XIqzypRQTc0MG
+MmF08zycnSlaN01ryM67AsMhwdHqVa+uXQPo8R8sdFGnZ33yywTYD73FeImXilQ2
+rDnFUVqmrW1fjl0Fi4rV5XI0EQiPrzKvRtmF8ZqjGATPOsRd64cwQX6V+P5hNeIR
+9pba6td7AbNGausHfacRYMyoGJWWWkFPd+7jWOCPqW7Fk1tmBgdB8GzXa3inWIRM
+RUE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIC+zCCAeOgAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE1MTAyNzEwMjYzNFoXDTI1MTAyNDEwMjYzNFowGDEWMBQG
+A1UEAwwNcm9vdGF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMl+dcraUM/E7E6zl7+7hK9oUJYXJLnfiMtP/TRFVbH4+2aEN8vXzPbzKdR3
+FfaHczXQTwnTCaYA4u4uSDvSOsFFEfxEwYORsdKmQEM8nGpVX2NVvKsMcGIhh8kh
+ZwJfkMIOcAxmGIHGdMhF8VghonJ8uGiuqktxdfpARq0g3fqIjDHsF9/LpfshUfk9
+wsRyTF0yr90U/dsfnE+u8l7GvVl8j2Zegp0sagAGtLaNv7tP17AibqEGg2yDBrBN
+9r9ihe4CqMjx+Q2kQ2S9Gz2V2ReO/n6vm2VQxsPRB/lV/9jh7cUcS0/9mggLYrDy
+cq1v7rLLQrWuxMz1E3gOhyCYJ38CAwEAAaNQME4wHQYDVR0OBBYEFHEPkNAdOa2k
+MUoM6Ix/kUCLq99vMB8GA1UdIwQYMBaAFHEPkNAdOa2kMUoM6Ix/kUCLq99vMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABrhjnWC6b+z9Kw73C/niOwo
+9sPdufjS6tb0sCwDjt3mjvE4NdNWt+/+ZOugW6dqtvqhtqZM1q0u9pJkNwIrqgFD
+ZHcfNaf31G6Z2YE+Io7woTVw6fFobg/EFo+a/qwbvWL26McmiRL5yiSBjVjpX4a5
+kdZ+aPQUCBaLrTWwlCDqzSVIULWUQvveRWbToMFKPNID58NtEpymAx3Pgir7YjV9
+UnlU2l5vZrh1PTCqZxvC/IdRESUfW80LdHaeyizRUP+6vKxGgSz2MRuYINjbd6GO
+hGiCpWlwziW2xLV1l2qSRLko2kIafLZP18N0ThM9zKbU5ps9NgFOf//wqSGtLaE=
+-----END CERTIFICATE-----
+''');
+
+List<int> _sslKey = utf8.encode('''
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIE4zAcBgoqhkiG9w0BDAEBMA4ECBMCjlg8JYZ4AgIIAASCBMFd9cBoZ5xcTock
+AVQcg/HzYJtMceKn1gtMDdC7mmXuyN0shoxhG4BpQInHkFARL+nenesXFxEm4X5e
+L603Pcgw72/ratxVpTW7hPMjiLTEBqza0GjQm7Sarbdy+Vzdp/6XFrAcPfFl1juY
+oyYzbozPsvFHz3Re44y1KmI4HAzU/qkjJUbNTTiPPVI2cDP6iYN2XXxBb1wwp8jR
+iqdZqFG7lU/wvPEbD7BVPpmJBHWNG681zb4ea5Zn4hW8UaxpiIBiaH0/IWc2SVZd
+RliAFo3NEsGxCcsnBo/n00oudGbOJxdOp7FbH5hJpeqX2WhCyJRxIeHOWmeuMAet
+03HFriiEmJ99m2nEJN1x0A3QUUM7ji6vZAb4qb1dyq7LlX4M2aaqixRnaTcQkapf
+DOxX35DEBXSKrDpyWp6Rx4wNpUyi1TKyhaVnYgD3Gn0VfC/2w86gSFlrf9PMYGM0
+PvFxTDzTyjOuPBRa728gZOGXgDOL7qvdInU/opVew7kFeRQHXxHzFCLK5dD+Vrig
+5fS3m0++f55ODkxqHXB8gbXbd3GMmsW6MrGpU7VsCNtbVPdSMW0FalovEB0M+2lj
+1VfuvL+0F5huTe+BgZAt6xgET/CIcZXdNMRPVhraqUjqWtI9Rdk4STPCpU1rDkjG
+YDl/fo4W2T6qQWFUpiC9IvVVGkVxaqfZZ4Qu+V5xPUi6vk95QiTNkN1t+m+sCCgS
+Llkea8Um0aHMy33Lj3NsfL0LMrnpniqcAks8BvcgIZwk1VRqcj7BQVCygJSYrmAR
+DBhMpjWlXuSggnyVPuduZDtnTN+8lCHLOKL3a3bDb6ySaKX49Km6GutDLfpDtEA0
+3mQvmEG4XVm7zy+AlN72qFbtSLDRi/D/uQh2q/ZrFQLOBQBQB56TvEbKouLimUDM
+ascQA3aUyhOE7e+d02NOFIFTozwc/C//CIFeA+ZEwxyfha/3Bor6Jez7PC/eHNxZ
+w7YMXzPW9NhcCcerhYGebuCJxLwzqJ+IGdukjKsGV2ytWDoB2xZiJNu096j4RKcq
+YSJoen0R7IH8N4eDujXR8m9kAl724Uqs1OoAs4VNICvzTutbsgVZ6Z+NMOcfnPw9
+jZkFhot16w8znD+OmhBR7/bzOLpaeUhk7EhNq5M6U0NNWx3WwkDlvU/jx+6/EQe3
+iLEHptH2HYBF1xscaKGbtKNtuQsfdzgWpOX0qK2YbK3yCKvL/xIm1DQmDZDKkWdW
+VNh8oGV1H96CivWlvxhAgXKz9F/83CjMw8YXRk7RJvWR4vtNvXFAvGkFIYCN9Jv9
+p+1ukaYoxSLGBik907I6gWSHqumJiCprUyAX/bVfZfNiYh4hzeA3lhwxZSax3JG4
+7QFPvyepOmF/3AAzS/Pusx6jOZnuCMCkfQi6Wpem1o3s4x+fP7kz00Xuj01ErucM
+S10ixfIh84kXBN3dTRDtDdeCyoMsBKO0W5jDBBlWL02YfdF6Opo1Q4cPh2DYgXMh
+XEszNZSK5LB0y+f3A6Kdx/hkZzHVvMONA70OyrkoZzGyWENhcB0c7ntTJyPPD2qM
+s0HRA2VwF/0ypU3OKERM1Ua5NSkTgvnnVTlV9GO90Tkn5v4fxdl8NzIuJLyGguTP
+Xc0tRM34Lg==
+-----END ENCRYPTED PRIVATE KEY-----
+''');
diff --git a/pkgs/http_parser/CHANGELOG.md b/pkgs/http_parser/CHANGELOG.md
index 5c56cf7..4312f63 100644
--- a/pkgs/http_parser/CHANGELOG.md
+++ b/pkgs/http_parser/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 4.1.2
+
+* Fixed a bug where parsing quoted header values could require a regex to
+  backtrack
+* Fixed a bug where quoted header values containing escaped quotes would not
+  be correctly parsed.
+
 ## 4.1.1
 
 * Move to `dart-lang/http` monorepo.
diff --git a/pkgs/http_parser/lib/src/scan.dart b/pkgs/http_parser/lib/src/scan.dart
index 96fb8ae..685f89b 100644
--- a/pkgs/http_parser/lib/src/scan.dart
+++ b/pkgs/http_parser/lib/src/scan.dart
@@ -11,7 +11,12 @@
 final _lws = RegExp(r'(?:\r\n)?[ \t]+');
 
 /// A quoted string.
-final _quotedString = RegExp(r'"(?:[^"\x00-\x1F\x7F]|\\.)*"');
+///
+/// [RFC-2616 2.2](https://datatracker.ietf.org/doc/html/rfc2616#section-2.2)
+/// defines the `quoted-string` production. This expression is identical to
+/// the RFC definition expect that, in this regex, `qdtext` is not allowed to
+/// contain `"\"`.
+final _quotedString = RegExp(r'"(?:[^"\x00-\x1F\x7F\\]|\\.)*"');
 
 /// A quoted pair.
 final _quotedPair = RegExp(r'\\(.)');
@@ -54,7 +59,7 @@
   return result;
 }
 
-/// Parses a single quoted string, and returns its contents.
+/// Parses a double quoted string, and returns its contents.
 ///
 /// If [name] is passed, it's used to describe the expected value if it's not
 /// found.
diff --git a/pkgs/http_parser/pubspec.yaml b/pkgs/http_parser/pubspec.yaml
index 1388827..5b3d521 100644
--- a/pkgs/http_parser/pubspec.yaml
+++ b/pkgs/http_parser/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_parser
-version: 4.1.1
+version: 4.1.2
 description: >-
   A platform-independent package for parsing and serializing HTTP formats.
 repository: https://github.com/dart-lang/http/tree/master/pkgs/http_parser
diff --git a/pkgs/http_parser/test/authentication_challenge_test.dart b/pkgs/http_parser/test/authentication_challenge_test.dart
index 52d798c..3e0f63f 100644
--- a/pkgs/http_parser/test/authentication_challenge_test.dart
+++ b/pkgs/http_parser/test/authentication_challenge_test.dart
@@ -73,6 +73,14 @@
         equals({'realm': 'fblthp, foo=bar', 'baz': 'qux'}));
   });
 
+  test('parses quoted string parameters with surrounding spaces', () {
+    final challenge =
+        parseChallenge('scheme realm= "fblthp, foo=bar" , baz= "qux" ');
+    expect(challenge.scheme, equals('scheme'));
+    expect(challenge.parameters,
+        equals({'realm': 'fblthp, foo=bar', 'baz': 'qux'}));
+  });
+
   test('normalizes the case of the scheme', () {
     final challenge = parseChallenge('ScHeMe realm=fblthp');
     expect(challenge.scheme, equals('scheme'));
diff --git a/pkgs/http_parser/test/scan_test.dart b/pkgs/http_parser/test/scan_test.dart
new file mode 100644
index 0000000..a771077
--- /dev/null
+++ b/pkgs/http_parser/test/scan_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2024, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:http_parser/src/scan.dart';
+import 'package:string_scanner/string_scanner.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('expectQuotedString', () {
+    test('no open quote', () {
+      final scanner = StringScanner('test"');
+      expect(
+          () => expectQuotedString(scanner),
+          throwsA(isA<StringScannerException>()
+              .having((e) => e.offset, 'offset', 0)
+              .having((e) => e.message, 'message', 'expected quoted string.')
+              .having((e) => e.source, 'source', 'test"')));
+      expect(scanner.isDone, isFalse);
+      expect(scanner.lastMatch, null);
+      expect(scanner.position, 0);
+    });
+
+    test('no close quote', () {
+      final scanner = StringScanner('"test');
+      expect(
+          () => expectQuotedString(scanner),
+          throwsA(isA<StringScannerException>()
+              .having((e) => e.offset, 'offset', 0)
+              .having((e) => e.message, 'message', 'expected quoted string.')
+              .having((e) => e.source, 'source', '"test')));
+      expect(scanner.isDone, isFalse);
+      expect(scanner.lastMatch, null);
+      expect(scanner.position, 0);
+    });
+
+    test('simple quoted', () {
+      final scanner = StringScanner('"test"');
+      expect(expectQuotedString(scanner), 'test');
+      expect(scanner.isDone, isTrue);
+      expect(scanner.lastMatch?.group(0), '"test"');
+      expect(scanner.position, 6);
+    });
+
+    test(r'escaped \', () {
+      final scanner = StringScanner(r'"escaped: \\"');
+      expect(expectQuotedString(scanner), r'escaped: \');
+      expect(scanner.isDone, isTrue);
+      expect(scanner.lastMatch?.group(0), r'"escaped: \\"');
+      expect(scanner.position, 13);
+    });
+
+    test(r'bare \', () {
+      final scanner = StringScanner(r'"bare: \"');
+      expect(
+          () => expectQuotedString(scanner),
+          throwsA(isA<StringScannerException>()
+              .having((e) => e.offset, 'offset', 0)
+              .having((e) => e.message, 'message', 'expected quoted string.')
+              .having((e) => e.source, 'source', r'"bare: \"')));
+      expect(scanner.isDone, isFalse);
+      expect(scanner.lastMatch, null);
+      expect(scanner.position, 0);
+    });
+
+    test(r'escaped "', () {
+      final scanner = StringScanner(r'"escaped: \""');
+      expect(expectQuotedString(scanner), r'escaped: "');
+      expect(scanner.isDone, isTrue);
+      expect(scanner.lastMatch?.group(0), r'"escaped: \""');
+      expect(scanner.position, 13);
+    });
+  });
+}
diff --git a/pkgs/web_socket_conformance_tests/pubspec.yaml b/pkgs/web_socket_conformance_tests/pubspec.yaml
index d7b64f2..a444814 100644
--- a/pkgs/web_socket_conformance_tests/pubspec.yaml
+++ b/pkgs/web_socket_conformance_tests/pubspec.yaml
@@ -12,7 +12,7 @@
 dependencies:
   async: ^2.11.0
   crypto: ^3.0.3
-  dart_style: ^2.3.7
+  dart_style: '>2.3.7 <4.0.0'
   stream_channel: ^2.1.2
   test: ^1.24.0
   web_socket: ^0.1.0
