<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Hex-Rays Blog</title><link>https://hex-rays.com/blog/</link><atom:link href="http://rss.144-124-237-35.sslip.io/hex-rays/news" rel="self" type="application/rss+xml"></atom:link><description>Hex-Rays Blog - Powered by AtomRSS</description><generator>AtomRSS</generator><webMaster>contact@atomgroup.dev (AtomRSS)</webMaster><language>en</language><image><url>https://hex-rays.com/hubfs/Ico-logo.png</url><title>Hex-Rays Blog</title><link>https://hex-rays.com/blog/</link></image><lastBuildDate>Sun, 18 Oct 2026 10:57:03 GMT</lastBuildDate><ttl>5</ttl><item><title>Hex-Rays IDA MCP Server</title><description>&lt;span id=&quot;hs_cos_wrapper_post_body&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_rich_text&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;meta_field&quot; data-hs-cos-type=&quot;rich_text&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;We are happy to introduce the official IDA MCP server! This free and open source software connects your IDA installation with AI agents, enabling them to disassemble, decompile, and support reverse engineering tasks. It works great with models like Gemini, Qwen, or Opus using familiar harnesses like Claude Code, Codex, or Pi. Across our internal malware analysis-focused benchmark, IDA MCP’s “code mode” architecture reduced token consumption by approximately 20% compared to popular alternatives.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA%20MCP-2.png?width=2534&amp;amp;height=1654&amp;amp;name=IDA%20MCP-2.png&quot; width=&quot;2534&quot; height=&quot;1654&quot; loading=&quot;lazy&quot; alt=&quot;IDA MCP-2&quot; style=&quot;height: auto; max-width: 100%; width: 2534px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA%20MCP-2.png?width=1267&amp;amp;height=827&amp;amp;name=IDA%20MCP-2.png 1267w, https://hex-rays.com/hs-fs/hubfs/IDA%20MCP-2.png?width=2534&amp;amp;height=1654&amp;amp;name=IDA%20MCP-2.png 2534w, https://hex-rays.com/hs-fs/hubfs/IDA%20MCP-2.png?width=3801&amp;amp;height=2481&amp;amp;name=IDA%20MCP-2.png 3801w, https://hex-rays.com/hs-fs/hubfs/IDA%20MCP-2.png?width=5068&amp;amp;height=3308&amp;amp;name=IDA%20MCP-2.png 5068w, https://hex-rays.com/hs-fs/hubfs/IDA%20MCP-2.png?width=6335&amp;amp;height=4135&amp;amp;name=IDA%20MCP-2.png 6335w, https://hex-rays.com/hs-fs/hubfs/IDA%20MCP-2.png?width=7602&amp;amp;height=4962&amp;amp;name=IDA%20MCP-2.png 7602w&quot; sizes=&quot;(max-width: 2534px) 100vw, 2534px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;The reverse engineering capabilities of LLMs have dramatically improved over the past year and coding agent adoption has skyrocketed. The Model Codex Protocol is here to stay and we will provide you with the best tools to integrate LLMs into your day-to-day RE workflows.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;One of the most exciting features of IDA MCP is that it can share many IDBs across many agents (and a human!) at the same time. This means a fleet of agents can collaborate on a project or an orchestrator agent can use subagents to concurrently study different parts of the same program. When IDA is open in the GUI, changes like renaming, commenting, or applying types, take effect immediately. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;The MCP server is model-agnostic, enabling seamless integration with any capable LLM, whether deployed locally or accessed through a cloud provider. This means it fits well in an airgapped environment. Since it works headlessly with idalib, you can deploy IDA MCP in AI-supported reverse engineering systems, such as large-scale pipeline processing. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;IDA MCP is freely available and open source, and works with IDA Pro, Home, Classroom and OEM.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span&gt;Get started with IDA MCP today using &lt;a href=&quot;https://hcli.docs.hex-rays.com/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;HCLI&lt;/a&gt; with this one-liner (if you already have &lt;a href=&quot;https://astral.sh/uv&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;uv&lt;/a&gt; installed)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;color: #222222;&quot;&gt;uvx ida-hcli mcp install&lt;/span&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Key Features &amp;amp; Usage&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;When you install the IDA MCP server, your agent gains access to IDA’s disassemblers and decompilers to help reverse engineer programs. Some of the most exciting aspects of its capabilities include:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;that the &lt;strong&gt;codemode architecture&lt;/strong&gt; is very token efficient, reducing token consumption by approximately 20% compared with popular alternatives.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;that the underlying &lt;strong&gt;ida-nexus library coordinates access&lt;/strong&gt; across many agents to many IDB files, enabling realtime collaboration across a swarm of users.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;that the server &lt;strong&gt;is model agnostic and runs fully locally&lt;/strong&gt;, making it a good choice for environments that are airgapped.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Let&#39;s look into these in more detail.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #222222;&quot;&gt;The Code Mode Architecture&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;We’ve found that many LLMs already have a really good knowledge of IDA and quickly begin exploring programs effectively. The IDA MCP server provides a minimal and powerful set of tools to the agent, along with descriptions that explain when and how to use them:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Database: open, close, list, save&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;IDAPython: read/write/update the database and evaluate logic using Python&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Reference: search for API documentation and examples using keywords&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Note that this is a very small set of tools! Many other MCP servers provide a separate tool for each operation: list the functions, list the strings, list the imports, decompile one or more functions, disassemble a range, etc. Since IDA has so many features, you easily end up with 100+ tools that each need to be tuned separately. Every tool takes up space in the context window, and more importantly, the &lt;strong&gt;tools are not composable&lt;/strong&gt; and all intermediate output ends up in the context window, too. These systems are slow, token hungry, and inefficient.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Instead, IDA MCP uses the architecture known as &lt;a href=&quot;https://blog.cloudflare.com/code-mode/&quot; style=&quot;color: #222222;&quot;&gt;&lt;u&gt;Code Mode&lt;/u&gt;&lt;/a&gt; that was popularized by Cloudflare. Agents interact with structured data by evaluating programs written in languages such as Python or Javascript. Based on user reports, models already naturally reach for IDAPython when it is available to them, so we decided to make that the primary way for a model to interact with an IDB. A further advantage is that giving your agent skills with generic IDAPython/IDA Domain snippets will automatically improve its performance when using the IDA MCP.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;A tradeoff with this approach is that, because IDA does not yet isolate its Python interpreter from the wider system, the agent can evaluate scripts that reach beyond IDA’s database. While coding agents typically already have a Bash tool for manipulating the system, it&#39;s important to understand this additional surface provided by IDA MCP. Therefore, we recommend running the harness and IDA MCP in a sandboxed environment when dealing with untrusted data.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #222222;&quot;&gt;IDA Nexus Resource Coordination&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;When an agent interacts with an IDB already open in the IDA GUI, changes are reflected instantly in the UI, as if the agent and human are working together in the session. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;However, the IDA MCP server does not &lt;em&gt;require&lt;/em&gt; the user to open a binary in the IDA GUI first. An agent can independently create or open a new database, which spawns a headless idalib instance to manage the analysis. This session can then be automatically reused by the next open_database call for the same binary. This enables an agent to extract a second-stage payload from a malware sample, open it up independently and continue the analysis without any user interaction.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;There is always one instance of IDA (headless or GUI) running for each open IDB, and one or many parallel agents connect to these instances to perform their analysis. IDA MCP, via &lt;a href=&quot;https://github.com/HexRaysSA/ida-nexus&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;ida-nexus&lt;/u&gt;&lt;/a&gt;, coordinates this resource tracking. Ultimately this means that changes made by an agent are instantly reflected in the IDA GUI and vice versa. You can also use IDA Nexus in your own projects!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;white-space-collapse: preserve; color: #222222;&quot;&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-0898-PM.png?width=1616&amp;amp;height=950&amp;amp;name=undefined-Sep-25-2026-01-16-04-0898-PM.png&quot; width=&quot;1616&quot; height=&quot;950&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-0898-PM.png?width=808&amp;amp;height=475&amp;amp;name=undefined-Sep-25-2026-01-16-04-0898-PM.png 808w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-0898-PM.png?width=1616&amp;amp;height=950&amp;amp;name=undefined-Sep-25-2026-01-16-04-0898-PM.png 1616w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-0898-PM.png?width=2424&amp;amp;height=1425&amp;amp;name=undefined-Sep-25-2026-01-16-04-0898-PM.png 2424w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-0898-PM.png?width=3232&amp;amp;height=1900&amp;amp;name=undefined-Sep-25-2026-01-16-04-0898-PM.png 3232w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-0898-PM.png?width=4040&amp;amp;height=2375&amp;amp;name=undefined-Sep-25-2026-01-16-04-0898-PM.png 4040w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-0898-PM.png?width=4848&amp;amp;height=2850&amp;amp;name=undefined-Sep-25-2026-01-16-04-0898-PM.png 4848w&quot; sizes=&quot;(max-width: 1616px) 100vw, 1616px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;An example of a community integration is &lt;a href=&quot;https://github.com/JustasMasiulis/ida_buddy&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;ida_buddy&lt;/u&gt;&lt;/a&gt;, which is a CLI tool for interacting with IDA. Because ida_buddy uses the IDA Nexus library it can operate on an IDB that is currently also in use by the MCP.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Another example is &lt;a href=&quot;https://github.com/blasty/ida-tui&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;ida-tui&lt;/u&gt;&lt;/a&gt;, which allows you to use IDA from the terminal. If you have a binary open in the IDA GUI, you can SSH into your machine and see/edit that binary remotely without closing the GUI&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-1089-PM.png?width=2048&amp;amp;height=1168&amp;amp;name=undefined-Sep-25-2026-01-16-05-1089-PM.png&quot; width=&quot;2048&quot; height=&quot;1168&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-1089-PM.png?width=1024&amp;amp;height=584&amp;amp;name=undefined-Sep-25-2026-01-16-05-1089-PM.png 1024w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-1089-PM.png?width=2048&amp;amp;height=1168&amp;amp;name=undefined-Sep-25-2026-01-16-05-1089-PM.png 2048w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-1089-PM.png?width=3072&amp;amp;height=1752&amp;amp;name=undefined-Sep-25-2026-01-16-05-1089-PM.png 3072w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-1089-PM.png?width=4096&amp;amp;height=2336&amp;amp;name=undefined-Sep-25-2026-01-16-05-1089-PM.png 4096w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-1089-PM.png?width=5120&amp;amp;height=2920&amp;amp;name=undefined-Sep-25-2026-01-16-05-1089-PM.png 5120w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-1089-PM.png?width=6144&amp;amp;height=3504&amp;amp;name=undefined-Sep-25-2026-01-16-05-1089-PM.png 6144w&quot; sizes=&quot;(max-width: 2048px) 100vw, 2048px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #222222;&quot;&gt;IDA MCP is Model Agnostic&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;While State of the Art (SOTA) models provided by organizations like Anthropic and OpenAI perform great on reverse engineering tasks, we know that not every reverse engineer can use these options. Token costs for frontier models are very high, data retention policies vary by provider, and some models refuse cybersecurity tasks without onerous additional approval by the vendor. The good news is that open weight models are widely available and have recently become proficient at reverse engineering tasks!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;According to our internal, malware analysis-focused benchmarks, we’ve found that DeepSeek v4.1 Flash, Kimi K3, and GLM 5.3 perform on a level similar to GPT-6-Luna and Gemini 3.8 Flash. Unfortunately, they do require dedicated hardware. For “prosumer grade” hardware (128-256GB VRAM), &lt;a href=&quot;https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;DeepSeek V4 Flash 0731&lt;/u&gt;&lt;/a&gt; and &lt;a href=&quot;https://huggingface.co/zai-org/GLM-5.3-Flash&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;GLM 5.3 Flash&lt;/u&gt;&lt;/a&gt; also give decent results. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;We also tested &lt;a href=&quot;https://huggingface.co/Qwen/Qwen3.8-27B&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;Qwen 3.8 27B&lt;/u&gt;&lt;/a&gt;, which can run (quantized) on a single consumer GPU (24GB NVIDIA RTX 3090). This class of models can perform reverse engineering tasks, but tends to get stuck and overthink, so you need a more hands-on approach. That being said, a minimal harness like Pi and the small footprint of the IDA MCP tools make a suitable combination for consumer hardware where prefill speeds are relatively low.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Recommended Setups&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;In our experience the following model and harness combinations work well with IDA MCP:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Use Opus 5.5 via Claude Code with a monthly coding plan. However, cybersecurity safeguards frequently interrupt work, so falling back to Opus 4.6 might be necessary.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Use GPT-6-Sol or Astra via Codex with a monthly coding plan.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Use DeepSeek 4.1 Flash, Gemini 3.8 Flash, Kimi K3, or GLM 5.3 via OpenRouter using Pi.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;We recommend using a VM or other sandboxed environment. Install IDA with HCLI. Once IDA MCP is installed, your agent will reach for IDA any time you have reverse engineering tasks!&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Demonstration&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;To demonstrate IDA MCP, we explore a scenario called &lt;span style=&quot;font-weight: bold;&quot;&gt;ParcelDesk&lt;/span&gt; that involves multiple, related PE files. The idea of the challenge is that you need to enter a parcel identifier and the corresponding collection code to open a door and retrieve some mail. In our case we need to obtain the collection code for parcel ZX-4815.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;[Hint] If you would like to play along at home you can find the files &lt;a href=&quot;https://github.com/HexRaysSA/ida-mcp/releases/download/v2026.915.3/ida-mcp-parceldesk-demo.zip&quot; style=&quot;color: #222222;&quot;&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;To get started we extract the challenge files into a new folder and open a coding agent there (we used Claude Code with Sonnet 5 for this demonstration). Then we can ask:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;padding-left: 48px;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;em&gt;Can you obtain the collection code for parcel ZX-4815 in ParcelDesk.exe?&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;The agent will work for a few minutes, iteratively calling &lt;span style=&quot;font-family: &#39;Andale Mono&#39;, AndaleMono, &#39;Lucida Console&#39;, monospace;&quot;&gt;open_database&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Andale Mono&#39;, AndaleMono, &#39;Lucida Console&#39;, monospace;&quot;&gt; &lt;/span&gt;and &lt;span style=&quot;font-family: &#39;Andale Mono&#39;, AndaleMono, &#39;Lucida Console&#39;, monospace;&quot;&gt;execute_python&lt;/span&gt; on the relevant binaries and it should come back with an answer like this:&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-6070-PM.png?width=1684&amp;amp;height=764&amp;amp;name=undefined-Sep-25-2026-01-16-05-6070-PM.png&quot; width=&quot;1684&quot; height=&quot;764&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-6070-PM.png?width=842&amp;amp;height=382&amp;amp;name=undefined-Sep-25-2026-01-16-05-6070-PM.png 842w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-6070-PM.png?width=1684&amp;amp;height=764&amp;amp;name=undefined-Sep-25-2026-01-16-05-6070-PM.png 1684w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-6070-PM.png?width=2526&amp;amp;height=1146&amp;amp;name=undefined-Sep-25-2026-01-16-05-6070-PM.png 2526w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-6070-PM.png?width=3368&amp;amp;height=1528&amp;amp;name=undefined-Sep-25-2026-01-16-05-6070-PM.png 3368w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-6070-PM.png?width=4210&amp;amp;height=1910&amp;amp;name=undefined-Sep-25-2026-01-16-05-6070-PM.png 4210w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-05-6070-PM.png?width=5052&amp;amp;height=2292&amp;amp;name=undefined-Sep-25-2026-01-16-05-6070-PM.png 5052w&quot; sizes=&quot;(max-width: 1684px) 100vw, 1684px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;In this case none of the binaries were opened in the IDA GUI, but this makes no difference from the agent’s perspective. Calling open_database on a file that is already open in IDA will reuse that instance instead of spawning a headless idalib worker.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Notably, this challenge required the agent to traverse three separate DLL files and extract raw data from resource sections. Using IDA MCP, it successfully traces data flow across binaries, identifies the correct DLLs, extracts and parses PE resources, and replicates a custom decryption algorithm.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;If you’re curious about how the agent came to these conclusions, you can read through the tool call trace that we’ve exported &lt;a href=&quot;https://gistpreview.github.io/?c8a1c51f1821062236813d1ab5448563&quot; style=&quot;color: #222222;&quot;&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;. It’s amusing to see how an agent decides to combine API functions to collect data, and to contrast this with how a human approaches reverse engineering.&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-5161-PM.png?width=2048&amp;amp;height=1344&amp;amp;name=undefined-Sep-25-2026-01-16-04-5161-PM.png&quot; width=&quot;2048&quot; height=&quot;1344&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-5161-PM.png?width=1024&amp;amp;height=672&amp;amp;name=undefined-Sep-25-2026-01-16-04-5161-PM.png 1024w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-5161-PM.png?width=2048&amp;amp;height=1344&amp;amp;name=undefined-Sep-25-2026-01-16-04-5161-PM.png 2048w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-5161-PM.png?width=3072&amp;amp;height=2016&amp;amp;name=undefined-Sep-25-2026-01-16-04-5161-PM.png 3072w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-5161-PM.png?width=4096&amp;amp;height=2688&amp;amp;name=undefined-Sep-25-2026-01-16-04-5161-PM.png 4096w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-5161-PM.png?width=5120&amp;amp;height=3360&amp;amp;name=undefined-Sep-25-2026-01-16-04-5161-PM.png 5120w, https://hex-rays.com/hs-fs/hubfs/undefined-Sep-25-2026-01-16-04-5161-PM.png?width=6144&amp;amp;height=4032&amp;amp;name=undefined-Sep-25-2026-01-16-04-5161-PM.png 6144w&quot; sizes=&quot;(max-width: 2048px) 100vw, 2048px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Installation&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Since IDA MCP communicates with external AI systems, their use may not be compatible with every organization&#39;s security or air-gapped deployment policies. Consequently, IDA MCP must be explicitly installed and configured before it can be used. It is provided as a &lt;a href=&quot;https://github.com/HexRaysSA/ida-mcp&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;free, open source software&lt;/u&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;You can find detailed installation instructions in &lt;a href=&quot;https://docs.hex-rays.com/core/mcp/getting-started&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;our documentation&lt;/u&gt;&lt;/a&gt;, but in short, once you have &lt;a href=&quot;https://github.com/astral-sh/uv&quot; style=&quot;color: #222222;&quot;&gt;&lt;u&gt;uv&lt;/u&gt;&lt;/a&gt; installed you can use &lt;a href=&quot;https://hcli.docs.hex-rays.com/&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;HCLI&lt;/u&gt;&lt;/a&gt; to install the plugins for IDA and your coding agent. Today we support one-command installs for &lt;a href=&quot;https://claude.com/product/claude-code&quot; style=&quot;color: #222222;&quot;&gt;&lt;u&gt;Claude Code&lt;/u&gt;&lt;/a&gt;, &lt;a href=&quot;https://openai.com/codex&quot; style=&quot;color: #222222;&quot;&gt;&lt;u&gt;Codex&lt;/u&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/features/copilot/cli&quot; style=&quot;color: #222222;&quot;&gt;&lt;u&gt;GitHub Copilot&lt;/u&gt;&lt;/a&gt;, &lt;a href=&quot;https://pi.dev/&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;Pi&lt;/u&gt;&lt;/a&gt; and &lt;a href=&quot;https://omp.sh/&quot; style=&quot;color: #222222;&quot;&gt;&lt;u&gt;oh-my-pi&lt;/u&gt;&lt;/a&gt;, but any client supporting stdio MCP servers works, including LM Studio and Antigravity.&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;color: #222222;&quot;&gt;uvx ida-hcli mcp install&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;or, if you already have hcli installed&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;color: #222222;&quot;&gt;hcli mcp install&lt;/span&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Acknowledgements&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;We would like to thank &lt;a href=&quot;https://jtsylve.blog/&quot; style=&quot;color: #222222;&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;Joe T. Sylve&lt;/u&gt;&lt;/a&gt; for giving us the &lt;span style=&quot;font-weight: bold;&quot;&gt;ida-mcp&lt;/span&gt; name on PyPI. Additionally we would like to thank our early access testers for the feedback and ideas!&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;
        </description><link>https://hex-rays.com/blog/hex-rays-ida-mcp-server</link><guid isPermaLink="false">https://hex-rays.com/blog/hex-rays-ida-mcp-server</guid><pubDate>Sun, 18 Oct 2026 10:57:02 GMT</pubDate></item><item><title>LLMs Have Reshaped How We Think About Decompilation and Collaboration</title><description>&lt;span id=&quot;hs_cos_wrapper_post_body&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_rich_text&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;meta_field&quot; data-hs-cos-type=&quot;rich_text&quot;&gt;&lt;h2 style=&quot;line-height: 1.25; color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Shifting Times&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;A few weekends ago, I was playing DEF CON CTF Quals, the qualification event for the &quot;&lt;a href=&quot;https://news.asu.edu/20200804-olympics-hacking&quot; style=&quot;color: #000000;&quot;&gt;Olympics of Hacking&lt;/a&gt;,&quot; with my team &lt;a href=&quot;https://shellphish.net/&quot; style=&quot;color: #000000;&quot;&gt;Shellphish&lt;/a&gt;. I say &quot;playing&quot; because I am, at this point, a washed-up hacker, but add me to the 40-something ranks! Nonetheless, I showed up, downloaded a binary, and went to open it in IDA Pro: a reflexive, built-in response to anything compiled. But as that ever-knowing face rendered on my screen, I paused for a moment to take in the surrounding feverish hacking. Something was strange: no one else had IDA Pro open. In fact, no one had any decompiler open!&lt;/span&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Across the room and on my machine too, we all had &lt;a href=&quot;https://openai.com/academy/what-is-codex/&quot; style=&quot;color: #000000;&quot;&gt;Codex&lt;/a&gt; open, a flexible coding agent that was now doing the hacking. This agent, of course, had IDA Pro open, because it actually needed to analyze the binary like a real hacker. So what did we, the humans, do for the whole game? We each became a multi-challenge hacker: a sort of general with an army. We spent most of our time suggesting high-level reversing routes, invalidating broken PoCs, and fixing or enabling better tools for our agents.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;But after some of our armies began to falter on the harder tasks, we encountered a new problem. How do we coordinate our armies, validate what they found, and know where they are stuck? Or, better put, in this new world of hacking, how do we optimize the way information is relayed and validated in an agent-human hacking environment? Funny enough, this is the premise of this post: we&#39;ve been trying to solve almost this exact collaboration problem for years. Now the same problem is coming back, except the workers are agents and the humans are supervising the whole mess.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;line-height: 1.25; color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Collaborating with Humans&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;In 2021, days before that year&#39;s DEF CON Finals, we began development on our decompiler collaboration framework &lt;a href=&quot;https://binsync.net/&quot; style=&quot;color: #000000;&quot;&gt;BinSync&lt;/a&gt;, which recently won &lt;a href=&quot;https://hex-rays.com/blog/announcing-the-2025-plugin-contest-winners&quot; style=&quot;color: #000000;&quot;&gt;second place&lt;/a&gt; at the Hex-Rays plugin contest. At the time, it was obvious that no challenge &lt;em&gt;was an island, entire of itself&lt;/em&gt;, and so we needed many eyes on one binary. We had two problems then:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;color: #000000;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Not everyone on the team was equally good at hacking (especially me!). Therefore, a level of control was needed to keep noobs and pros from clobbering each other&#39;s work.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;We had a diverse breakdown of decompiler usage: 70% used IDA Pro, 20% used Binary Ninja, 5% used Ghidra, and 5% used the angr decompiler (mostly Fish and I). We couldn&#39;t just share IDBs, and we couldn&#39;t rely on one-off translations from each tool.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;The solutions emerged somewhat naturally. Do not share the whole decompiler database; share the &lt;em&gt;information&lt;/em&gt; learned from the binary. Record names, types, patches, and other facts in a form with history and the ability to selectively merge that history: Git! When storing information, lift it from one specific tool (decompiler) into something high-level and human-readable. Finally, to get that information back into each tool, translate it from high-level form back into the tool-specific format (think &lt;code style=&quot;background-color: #f6f6f6; line-height: 1.357em;&quot;&gt;_WORD&lt;/code&gt; versus &lt;code style=&quot;background-color: #f6f6f6; line-height: 1.357em;&quot;&gt;uint16&lt;/code&gt;). This gave every tool a path to collaboration and let pros selectively merge changes from noobs into their local reversing branches. Wrap all of this in a fancy GUI that works on all decompilers, and we were rolling!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Since every atom of information learned was a commit in BinSync, it also created a cool historical way to view team progress. Here is what one DEF CON Quals looked like by commit, with annotations indicating when a challenge was solved. If you look closely, you can see when the team was sleeping. &lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/image-10.png?width=640&amp;amp;height=317&amp;amp;name=image-10.png&quot; width=&quot;640&quot; height=&quot;317&quot; loading=&quot;lazy&quot; alt=&quot;image-10&quot; style=&quot;height: auto; max-width: 100%; width: 640px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/image-10.png?width=320&amp;amp;height=159&amp;amp;name=image-10.png 320w, https://hex-rays.com/hs-fs/hubfs/image-10.png?width=640&amp;amp;height=317&amp;amp;name=image-10.png 640w, https://hex-rays.com/hs-fs/hubfs/image-10.png?width=960&amp;amp;height=476&amp;amp;name=image-10.png 960w, https://hex-rays.com/hs-fs/hubfs/image-10.png?width=1280&amp;amp;height=634&amp;amp;name=image-10.png 1280w, https://hex-rays.com/hs-fs/hubfs/image-10.png?width=1600&amp;amp;height=793&amp;amp;name=image-10.png 1600w, https://hex-rays.com/hs-fs/hubfs/image-10.png?width=1920&amp;amp;height=951&amp;amp;name=image-10.png 1920w&quot; sizes=&quot;(max-width: 640px) 100vw, 640px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Before long, BinSync created a way for our team to share information rapidly, but the more interesting thing it created was shared reversing memory. As we (&lt;a href=&quot;https://www.zionbasque.com/&quot; style=&quot;color: #000000;&quot;&gt;myself&lt;/a&gt;, &lt;a href=&quot;https://x.com/shellphish&quot; style=&quot;color: #000000;&quot;&gt;Shellphish&lt;/a&gt;, and &lt;a href=&quot;https://sefcom.asu.edu/&quot; style=&quot;color: #000000;&quot;&gt;SEFCOM&lt;/a&gt;) continued to refine it, more teams began to adopt it in some form. Eventually, people started using it for &lt;a href=&quot;https://decompilation.wiki/applications/program-reconstruction/#video-games&quot; style=&quot;color: #000000;&quot;&gt;open-source reversing&lt;/a&gt; (reversing a binary with the diff living on GitHub), which was awesome! This all created a sense that we were trending in the right direction for closing the gap in human-to-human hacking collaboration. The durable lessons were about common representation, history, selective trust, and visibility into progress.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;But snap back to reality: does any of this matter now?&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;line-height: 1.25; color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Collaborating with Agents&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Our recent hacking experience has taught us that humans are no longer the center of the collaboration chain. Agents are now the central workers in any program-hacking task. Agents talk to other agents, which in turn talk to tools, and a final agent talks to us. This reframing makes some previous work less central, but it also opens new avenues for research. Let&#39;s start with what changes.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;First, although agents may use multiple decompilers, they are often perfectly happy to translate between those formats themselves, with no BinSync needed. They do benefit slightly from a lifted common format, but those gains may not justify the effort. So, you really don&#39;t need the same translator layer when LLMs are already built-in translators.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Second, agents rarely need help from other agents when reverse engineering. In our early experiments, the majority of binaries you encounter on a system are fully reversible by a single Codex agent. These agents can much more easily &quot;fan out&quot; and explore every path to an exploit through independent work rather than relaying information. Goodbye to Git merging as the way agents send changes to each other.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Third, the human-first GUIs we&#39;ve come to develop, both in BinSync and more broadly in decompilers, matter much less to agents. This hurts especially hard, since those GUIs are often the parts that took the longest to refine.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Not all previous lessons disappear, however. Coordinating many agents with humans for oversight and redirection is actually a lot like being a captain on a big CTF team. You need ways to know where agents are stuck at scale, what they already tried, and how much you should trust what they found. This also matters significantly on multi-binary targets like firmware. Lessons learned from BinSync are beginning to take shape as similar history, provenance, and progress analytics, but for agents. Thanks, Git!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;However, harder concepts still exist. For an expert hacker, learning how to effectively redirect or steer these agents is hard to measure and improve. So hard, in fact, that &lt;a href=&quot;https://www.ndss-symposium.org/wp-content/uploads/2026-f380-paper.pdf&quot; style=&quot;color: #000000;&quot;&gt;we have published papers&lt;/a&gt; and &lt;a href=&quot;https://x.com/mahal0z/status/2026759100957167766?s=20&quot; style=&quot;color: #000000;&quot;&gt;won awards&lt;/a&gt; for exploring the early science of this process. But there is still much we do not know. Do you only need to know the right words to unstick a model? Are there higher-level concepts in hacking that improve performance when taught to a model? Can we represent any of this graphically and build better human interfaces for understanding reversing reasoning?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;More questions than answers, but isn&#39;t it exciting!?! We are in a whole new era, and the science of hacking collaboration has a new direction.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;line-height: 1.25; color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;The Future&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;I see a few changes coming to &lt;em&gt;a local tool near you&lt;/em&gt;. Decompilers, as they exist now, are going to undergo significant change in this age of agent collaboration. The tools best suited for agents will likely be the ones to survive into the next era of reversing. For the first time in a long time, you may see significant changes to the GUIs of your decompilers.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;The new interfaces need to toe-the-line on what &lt;em&gt;really&lt;/em&gt; must be known by a human, and what instead can be automated. It should expose what agents believe, what evidence they used, what paths they already tried, where they are stuck, and when a human should step in. That is not the same as dumping a chat log next to pseudocode. It is closer to making reversing progress inspectable, an area currently receiving significant &lt;a href=&quot;https://www.darpa.mil/research/programs/ai-forge&quot; style=&quot;color: #000000;&quot;&gt;money and attention through AI&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;For better or for worse, how we collaborate, how we reverse engineer, and how we hack, is changing. The best tools in this next phase will not hide the human or pretend the agent is magic. They will make the handoff between human judgment and agent work cleaner, faster, and easier to trust.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Discovering the ways we can harness that change to improve our lives and the security of the world will require work. We, on the BinSync team, look forward to chasing the next phase of that collaboration and sharing it with you all.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #cccccc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;See you on the other side!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;display: block; padding: 0 20px; box-sizing: border-box; max-width: 100%; background-color: #f6f6f6; color: #000000; border: 1px solid #E4E4E4; border-radius: 16px; margin: 0 20px;&quot;&gt;
&lt;h3&gt;&lt;span&gt;&lt;strong&gt;Help Shape the Next Generation of Reverse Engineering&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;
Have an idea for improving how humans, agents, and analysis tools work together? Turn it into an IDA extension and enter the &lt;strong&gt;2026 IDA Plugin Contest&lt;/strong&gt;.&lt;br&gt;
&lt;p&gt;Whether your project uses AI to support smarter analysis, improves collaboration, automates repetitive work, or connects IDA with another tool or ecosystem, we want to see what you build.&lt;/p&gt;
&lt;p&gt;Compete for cash prizes, an IDA Pro Expert-2 license, and the opportunity to showcase your work to the reverse-engineering community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Submit your project by November 30, 2026.&lt;/strong&gt;&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_bd80bd91-5746-4d4b-986c-a9b9797b18c6&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;&lt;div class=&quot;text-section text-section-widget_bd80bd91-5746-4d4b-986c-a9b9797b18c6&quot;&gt;
  
  &lt;div class=&quot;buttons&quot;&gt;
    
    
    
    &lt;a href=&quot;https://hex-rays.com/plugin-contest&quot; class=&quot;primary-button  content-modal-button&quot; data-target=&quot;&quot;&gt;
      &lt;span&gt;Explore the 2026 Plugin Contest&lt;/span&gt;
      &lt;i class=&quot;icon icon-arrow-narrow-left&quot;&gt;&lt;/i&gt;
    &lt;/a&gt;
    
  &lt;/div&gt;
  
&lt;/div&gt;

&lt;style&gt;
  .text-section-widget_bd80bd91-5746-4d4b-986c-a9b9797b18c6 {
    display:flex;
    flex-direction: column;
      
    justify-content: center;
    
    
    align-items: flex-start;
    
    text-align: CENTER
;
  }
  .text-section-widget_bd80bd91-5746-4d4b-986c-a9b9797b18c6 .buttons {
      
    justify-content: center;
    
    width: 100%;
    margin: 0;
  }
  .link span {
    text-decoration: underline;
  }
  @media (max-width: 767px) {
    .text-section-widget_bd80bd91-5746-4d4b-986c-a9b9797b18c6 .buttons,
    .text-section-widget_bd80bd91-5746-4d4b-986c-a9b9797b18c6 {
      align-items: center;
      justify-content: center;
      text-align: center;
    }
  }
&lt;/style&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/span&gt;
        </description><link>https://hex-rays.com/blog/llms-have-reshaped-how-we-think-about-decompilation-and-collaboration</link><guid isPermaLink="false">https://hex-rays.com/blog/llms-have-reshaped-how-we-think-about-decompilation-and-collaboration</guid><pubDate>Sun, 18 Oct 2026 10:57:02 GMT</pubDate></item><item><title>Hex-Rays is Heading to Hacker Summer Camp 2026</title><description>&lt;span id=&quot;hs_cos_wrapper_post_body&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_rich_text&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;meta_field&quot; data-hs-cos-type=&quot;rich_text&quot;&gt;&lt;p&gt;Vegas in August generally means one thing for the reverse engineering community: Hacker Summer Camp. Hex-Rays will be on the ground for all three events, and we&#39;ve packed the week with demos, a workshop, some light recruiting and more. Here&#39;s where to find us.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h1&gt;Black Hat&lt;/h1&gt;
&lt;p&gt;Our Tech Evangelist, &lt;a href=&quot;https://www.linkedin.com/in/david-rushmer-msc-64b80834/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;David Rushmer&lt;/strong&gt;&lt;/a&gt;, will be available for meetings Monday, August 3 - Wednesday, August 5. If you&#39;d like to have a chat or get a demo of new or upcoming features like our revamped Teams Add-On or upcoming Malware Add-On, just email &lt;strong&gt;&lt;a href=&quot;mailto:marketing@hex-rays.com&quot;&gt;marketing@hex-rays.com&lt;/a&gt;&lt;/strong&gt; and we&#39;ll get something on the calendar.&lt;/p&gt;
&lt;h1&gt;B-Sides Las Vegas&lt;/h1&gt;
&lt;p&gt;David will be onsite and ready to talk all things IDA. Whether you&#39;ve got a technical question, want to share your current or upcoming research,&amp;nbsp;feedback on the product, or just want to say hi, drop a line to &lt;strong&gt;&lt;a href=&quot;mailto:marketing@hex-rays.com&quot;&gt;marketing@hex-rays.com&lt;/a&gt;&lt;/strong&gt; and we&#39;ll make it easy to connect.&lt;/p&gt;
&lt;h1&gt;DEF CON 34 | Malware Village&lt;/h1&gt;
&lt;p&gt;DEF CON is where we&#39;re really setting up shop this year. We will be stationed within the Malware Village at our own table.&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Demos: Malware Analysis Add-On (Private Beta)&lt;/h4&gt;
&lt;p&gt;📅 &lt;strong&gt;Friday, August 7&amp;nbsp;&amp;amp; Saturday&lt;/strong&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;, August 8&lt;/span&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;. E&lt;/span&gt;very hour on the hour, &lt;strong&gt;10:00am – 4:00pm.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;This demo will walk through three features available today in private beta: &lt;br&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Unpacking Helpers&lt;/span&gt;, which detects packed binaries on load and unpacks them in-place so analysts can get straight to work&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;One-Click Debug&lt;/span&gt;, which launches emulation-based debugging from a single button without leaving IDA or risking execution on the wrong system&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Sandbox Integration&lt;/span&gt;, which pulls code coverage, API call timelines, and memory regions from sandbox runs directly into IDA&#39;s UI&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;If you&#39;ve ever lost time to boilerplate unpacking, manual debugger setup, or manually correlating sandbox output with static analysis, this demo is for you. &lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Workshop: Follow the Execution -&amp;nbsp;A DLL Sideloading Teardown &amp;amp; Intro to IDA&lt;/h4&gt;
&lt;p&gt;📅 &lt;strong&gt;Saturday, August 8&lt;/strong&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;@ 12:55pm&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Join us for a hands-on DLL sideloading teardown and intro to IDA. Space is limited to &lt;strong&gt;40 seats&lt;/strong&gt;, and &lt;strong&gt;registration is required.&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;👉 &lt;a href=&quot;https://www.eventbrite.com/e/follow-the-execution-a-dll-sideloading-teardown-intro-in-ida-tickets-1994828069455&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Read the Workshop Overview &amp;amp; Register Here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Need a license to participate? We&#39;ve got you covered — just note that a license will be provided subject to standard KYC (know-your-customer) verification requirements.&lt;/p&gt;
&lt;h4&gt;Recruiting for US-Based Roles&lt;/h4&gt;
&lt;p&gt;We&#39;re looking to fill two US-based positions. Come learn more about the company and the roles, and more importantly, meet the people you might work with. &amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hex-rays.com/careers/strategic-tech-evangelist-americas&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Strategic Tech Evangelist, Americas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hex-rays.com/careers/vp-americas-strategic-partnerships&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;VP, Americas Strategic Partnerships&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Teams Add-On: Now Git-Native&lt;/h4&gt;
&lt;p&gt;We&#39;ll also have a live demo of the newly revamped Teams add-on. Teams can now run on top of any Git server — GitHub, GitLab, Bitbucket, or self-hosted. No new server to spin up, no new credentials to manage — just clone, analyze, commit, push. Migration guides are available for teams moving over from Vault.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;➥ We&#39;re looking for qualified corporate testers with a minimum of two users to try our collaboration features at &lt;span style=&quot;font-weight: bold;&quot;&gt;no charge&lt;/span&gt;. Specific eligibility terms apply.&lt;/p&gt;
&lt;p&gt;To see if you qualify, email &lt;a href=&quot;mailto:sales@hex-rays.com&quot;&gt;sales@hex-rays.com&lt;/a&gt; for more info or come talk to us at our table.&lt;/p&gt;
&lt;p&gt;Read more: &lt;a href=&quot;https://hex-rays.com/blog/teams-git-native-versioning-collaborative-reversing&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Teams: Git-native Versioning &amp;amp; Collaborative Reversing&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;What&#39;s New in IDA 9.4&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;We&#39;ll be spreading the word on the latest release and happy to answer any questions. A few highlights worth asking about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reworked Dyld Shared Cache handling&lt;/strong&gt; — a cleaner workflow for navigating Apple&#39;s system-framework bundles, with better accuracy and support for the latest iOS formats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Swift, Rust, and Go get smarter&lt;/strong&gt; — the decompiler now understands Swift&#39;s calling convention, detects Rust crate versions, and reads Go binaries more reliably.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pathfinder&lt;/strong&gt;, a new widget that traces call paths between two points in a binary, plus a redesigned Xrefs Graph.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Read more: &lt;a href=&quot;https://hex-rays.com/blog/ida-9.4-release-a-new-dyld-shared-cache-swift-analysis-new-teams-add-on-and-more-&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;text-align: center;&quot;&gt;I&lt;/span&gt;&lt;span style=&quot;text-align: center;&quot;&gt;DA 9.4 Release Overview Blog&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&amp;nbsp;➥ Pssst... we&#39;ll also have a special license discount for those who visit us in-person.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Bring Your Feedback, Take Home Swag&lt;/h4&gt;
&lt;p&gt;As always, we want to hear what&#39;s working and what isn&#39;t. Swing by our sponsor table in the Malware Village, share your IDA feedback, and walk away with some swag for your thoughts.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;See you in Vegas!&lt;/strong&gt;&lt;/h4&gt;&lt;/span&gt;
        </description><link>https://hex-rays.com/blog/hex-rays-hacker-summer-camp-2026</link><guid isPermaLink="false">https://hex-rays.com/blog/hex-rays-hacker-summer-camp-2026</guid><pubDate>Sun, 18 Oct 2026 10:57:02 GMT</pubDate></item><item><title>Teams: Git-native Versioning &amp; Collaborative Reversing</title><description>&lt;span id=&quot;hs_cos_wrapper_post_body&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_rich_text&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;meta_field&quot; data-hs-cos-type=&quot;rich_text&quot;&gt;&lt;p&gt;&lt;span&gt;Teams is a collaboration add-on for IDA Pro recently revised to focus on two pillars: version control and team collaboration with features like Deep Links. It brings Git-based versioning and real-time sharing directly into IDA, so reverse engineering teams can work together on the same binaries without losing work, duplicating effort, or managing files manually. &lt;/span&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;span&gt;With the most recent version of IDA, Teams has been fully integrated inside IDA with a significantly improved interface. With the IDA 9.4 release, we brought a new set of collaboration and version control features — including Git integration and Deep Links.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Teams is designed for teams, but the version control features are equally useful for individual analysts who want a reliable history of their work. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;span&gt;Version Control with Git Integration&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Teams add-on for IDA Pro use Git as its version-control backbone. Teams works with any Git provider you already use — GitHub, GitLab, Bitbucket, or Gitea. No new server to deploy. No new credentials to issue. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Create or clone a repository.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Repositories are designed to hold multiple IDA databases, so when you’re working across a family of related binaries it keeps everything in one place. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Start a new repository from your existing working directory, or clone a shared repository from a remote server. The git-ida compression filter is configured automatically, keeping repository size small by storing only the differences between database versions. Git LFS is also supported for teams working with large IDB files.&lt;/span&gt;&lt;span&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_clone.png?width=1238&amp;amp;height=668&amp;amp;name=IDA_Teams_Git_clone.png&quot; width=&quot;1238&quot; height=&quot;668&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_clone&quot; style=&quot;height: auto; max-width: 100%; width: 1238px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_clone.png?width=619&amp;amp;height=334&amp;amp;name=IDA_Teams_Git_clone.png 619w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_clone.png?width=1238&amp;amp;height=668&amp;amp;name=IDA_Teams_Git_clone.png 1238w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_clone.png?width=1857&amp;amp;height=1002&amp;amp;name=IDA_Teams_Git_clone.png 1857w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_clone.png?width=2476&amp;amp;height=1336&amp;amp;name=IDA_Teams_Git_clone.png 2476w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_clone.png?width=3095&amp;amp;height=1670&amp;amp;name=IDA_Teams_Git_clone.png 3095w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_clone.png?width=3714&amp;amp;height=2004&amp;amp;name=IDA_Teams_Git_clone.png 3714w&quot; sizes=&quot;(max-width: 1238px) 100vw, 1238px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Commit.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Commit regenerates the packed database and records your changes locally with a message you create. Optionally, you can Commit and Push at the same time.&lt;/span&gt;&lt;span&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_commit.png?width=956&amp;amp;height=324&amp;amp;name=IDA_Teams_Git_commit.png&quot; width=&quot;956&quot; height=&quot;324&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_commit&quot; style=&quot;height: auto; max-width: 100%; width: 956px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_commit.png?width=478&amp;amp;height=162&amp;amp;name=IDA_Teams_Git_commit.png 478w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_commit.png?width=956&amp;amp;height=324&amp;amp;name=IDA_Teams_Git_commit.png 956w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_commit.png?width=1434&amp;amp;height=486&amp;amp;name=IDA_Teams_Git_commit.png 1434w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_commit.png?width=1912&amp;amp;height=648&amp;amp;name=IDA_Teams_Git_commit.png 1912w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_commit.png?width=2390&amp;amp;height=810&amp;amp;name=IDA_Teams_Git_commit.png 2390w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_commit.png?width=2868&amp;amp;height=972&amp;amp;name=IDA_Teams_Git_commit.png 2868w&quot; sizes=&quot;(max-width: 956px) 100vw, 956px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Push and Pull.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Push your commits to the remote when ready; pull to bring in your teammates&#39; latest work. If a pull produces conflicts, IDA opens a &lt;span style=&quot;font-weight: bold;&quot;&gt;three-way merge view&lt;/span&gt; so you can resolve them in context. (A fan favorite.)&lt;/span&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_resolving_conflicts.png?width=3452&amp;amp;height=1210&amp;amp;name=IDA_Teams_Git_resolving_conflicts.png&quot; width=&quot;3452&quot; height=&quot;1210&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_resolving_conflicts&quot; style=&quot;height: auto; max-width: 100%; width: 3452px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_resolving_conflicts.png?width=1726&amp;amp;height=605&amp;amp;name=IDA_Teams_Git_resolving_conflicts.png 1726w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_resolving_conflicts.png?width=3452&amp;amp;height=1210&amp;amp;name=IDA_Teams_Git_resolving_conflicts.png 3452w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_resolving_conflicts.png?width=5178&amp;amp;height=1815&amp;amp;name=IDA_Teams_Git_resolving_conflicts.png 5178w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_resolving_conflicts.png?width=6904&amp;amp;height=2420&amp;amp;name=IDA_Teams_Git_resolving_conflicts.png 6904w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_resolving_conflicts.png?width=8630&amp;amp;height=3025&amp;amp;name=IDA_Teams_Git_resolving_conflicts.png 8630w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_resolving_conflicts.png?width=10356&amp;amp;height=3630&amp;amp;name=IDA_Teams_Git_resolving_conflicts.png 10356w&quot; sizes=&quot;(max-width: 3452px) 100vw, 3452px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Full revision history.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; History shows the complete Git log for the open database. Compare any two revisions, step through what changed commit by commit, or compare a past revision against your current working copy.&lt;/span&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_history_for_idb.png?width=2474&amp;amp;height=402&amp;amp;name=IDA_Teams_Git_history_for_idb.png&quot; width=&quot;2474&quot; height=&quot;402&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_history_for_idb&quot; style=&quot;height: auto; max-width: 100%; width: 2474px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_history_for_idb.png?width=1237&amp;amp;height=201&amp;amp;name=IDA_Teams_Git_history_for_idb.png 1237w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_history_for_idb.png?width=2474&amp;amp;height=402&amp;amp;name=IDA_Teams_Git_history_for_idb.png 2474w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_history_for_idb.png?width=3711&amp;amp;height=603&amp;amp;name=IDA_Teams_Git_history_for_idb.png 3711w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_history_for_idb.png?width=4948&amp;amp;height=804&amp;amp;name=IDA_Teams_Git_history_for_idb.png 4948w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_history_for_idb.png?width=6185&amp;amp;height=1005&amp;amp;name=IDA_Teams_Git_history_for_idb.png 6185w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_history_for_idb.png?width=7422&amp;amp;height=1206&amp;amp;name=IDA_Teams_Git_history_for_idb.png 7422w&quot; sizes=&quot;(max-width: 2474px) 100vw, 2474px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_compare_revisions.png?width=2472&amp;amp;height=602&amp;amp;name=IDA_Teams_Git_compare_revisions.png&quot; width=&quot;2472&quot; height=&quot;602&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_compare_revisions&quot; style=&quot;height: auto; max-width: 100%; width: 2472px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_compare_revisions.png?width=1236&amp;amp;height=301&amp;amp;name=IDA_Teams_Git_compare_revisions.png 1236w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_compare_revisions.png?width=2472&amp;amp;height=602&amp;amp;name=IDA_Teams_Git_compare_revisions.png 2472w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_compare_revisions.png?width=3708&amp;amp;height=903&amp;amp;name=IDA_Teams_Git_compare_revisions.png 3708w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_compare_revisions.png?width=4944&amp;amp;height=1204&amp;amp;name=IDA_Teams_Git_compare_revisions.png 4944w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_compare_revisions.png?width=6180&amp;amp;height=1505&amp;amp;name=IDA_Teams_Git_compare_revisions.png 6180w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_compare_revisions.png?width=7416&amp;amp;height=1806&amp;amp;name=IDA_Teams_Git_compare_revisions.png 7416w&quot; sizes=&quot;(max-width: 2472px) 100vw, 2472px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Local Changes.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Before committing, Local Changes shows a semantic diff of everything you&#39;ve changed since the last commit — renamed functions, updated types, new comments — so you know exactly what you&#39;re about to record. Made changes you want to discard? Revert rolls everything back to the last commit cleanly and immediately.&lt;/span&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_local_changes.png?width=3450&amp;amp;height=1606&amp;amp;name=IDA_Teams_Git_local_changes.png&quot; width=&quot;3450&quot; height=&quot;1606&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_local_changes&quot; style=&quot;height: auto; max-width: 100%; width: 3450px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_local_changes.png?width=1725&amp;amp;height=803&amp;amp;name=IDA_Teams_Git_local_changes.png 1725w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_local_changes.png?width=3450&amp;amp;height=1606&amp;amp;name=IDA_Teams_Git_local_changes.png 3450w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_local_changes.png?width=5175&amp;amp;height=2409&amp;amp;name=IDA_Teams_Git_local_changes.png 5175w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_local_changes.png?width=6900&amp;amp;height=3212&amp;amp;name=IDA_Teams_Git_local_changes.png 6900w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_local_changes.png?width=8625&amp;amp;height=4015&amp;amp;name=IDA_Teams_Git_local_changes.png 8625w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_local_changes.png?width=10350&amp;amp;height=4818&amp;amp;name=IDA_Teams_Git_local_changes.png 10350w&quot; sizes=&quot;(max-width: 3450px) 100vw, 3450px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;strong&gt;&lt;span&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_revert_local_changes.png?width=1042&amp;amp;height=418&amp;amp;name=IDA_Teams_Git_revert_local_changes.png&quot; width=&quot;1042&quot; height=&quot;418&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_revert_local_changes&quot; style=&quot;height: auto; max-width: 100%; width: 1042px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_revert_local_changes.png?width=521&amp;amp;height=209&amp;amp;name=IDA_Teams_Git_revert_local_changes.png 521w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_revert_local_changes.png?width=1042&amp;amp;height=418&amp;amp;name=IDA_Teams_Git_revert_local_changes.png 1042w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_revert_local_changes.png?width=1563&amp;amp;height=627&amp;amp;name=IDA_Teams_Git_revert_local_changes.png 1563w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_revert_local_changes.png?width=2084&amp;amp;height=836&amp;amp;name=IDA_Teams_Git_revert_local_changes.png 2084w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_revert_local_changes.png?width=2605&amp;amp;height=1045&amp;amp;name=IDA_Teams_Git_revert_local_changes.png 2605w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_revert_local_changes.png?width=3126&amp;amp;height=1254&amp;amp;name=IDA_Teams_Git_revert_local_changes.png 3126w&quot; sizes=&quot;(max-width: 1042px) 100vw, 1042px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Semantic diffing.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Differences between database versions are presented as meaningful analysis changes — not raw binary deltas. See what actually changed in the analysis, not just what bytes shifted. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Flexible infrastructure.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Use your existing Git provider, or run Gitea in a single Docker container with as little as 1 GB of RAM for air-gapped or compliance-sensitive environments. The &lt;a href=&quot;https://docs.hex-rays.com/9.4/add-ons/teams&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Teams documentation&lt;/a&gt; includes a ready-to-go docker-compose.yml. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Vault migration included.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; A command-line migration utility (team-migrate) moves existing Vault-based databases to Git. For setup and migration instructions, refer to the &lt;/span&gt;&lt;a href=&quot;https://docs.hex-rays.com/9.4/add-ons/teams/admin&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;span&gt;Teams Server Administration Guide&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;span&gt;Collaboration for Teams, Featuring Deep Links&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Once your work is in version control, Teams will make sharing it with colleagues seamless. Multiple analysts can work on the same project simultaneously — each committing their own findings, pulling teammates&#39; changes, and resolving conflicts through IDA&#39;s built-in merge tools. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Work together on the same binary&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; - The binary one analyst opens is the same binary the whole team is improving. Changes sync through a shared Git repository, so there is no risk of conflicting versions going undetected. &lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Online or offline - &lt;/span&gt;&lt;/strong&gt;&lt;span&gt;Teams doesn&#39;t require a constant connection. Analyze on a airplane, in a SCIF, or off the grid. A connection is only needed when you publish. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Pull with smart auto-merge &lt;/span&gt;&lt;/strong&gt;&lt;span&gt;- Pull brings in teammates&#39; latest commits. Non-conflicting changes — comments on different lines, renames at different addresses, non-overlapping type changes — are resolved automatically in the background. Real conflicts open IDA&#39;s interactive &lt;/span&gt;three-way merge view&lt;span&gt;, side by side.&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Manage multiple repositories&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; - The Manage Repositories view lists every IDB repository on your machine. Pull and push across projects without needing to open a database first. &lt;/span&gt;&lt;span&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories-1.png?width=786&amp;amp;height=183&amp;amp;name=IDA_Teams_Git_manage_repositories-1.png&quot; width=&quot;786&quot; height=&quot;183&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_manage_repositories-1&quot; style=&quot;height: auto; max-width: 100%; width: 786px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories-1.png?width=393&amp;amp;height=92&amp;amp;name=IDA_Teams_Git_manage_repositories-1.png 393w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories-1.png?width=786&amp;amp;height=183&amp;amp;name=IDA_Teams_Git_manage_repositories-1.png 786w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories-1.png?width=1179&amp;amp;height=275&amp;amp;name=IDA_Teams_Git_manage_repositories-1.png 1179w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories-1.png?width=1572&amp;amp;height=366&amp;amp;name=IDA_Teams_Git_manage_repositories-1.png 1572w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories-1.png?width=1965&amp;amp;height=458&amp;amp;name=IDA_Teams_Git_manage_repositories-1.png 1965w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories-1.png?width=2358&amp;amp;height=549&amp;amp;name=IDA_Teams_Git_manage_repositories-1.png 2358w&quot; sizes=&quot;(max-width: 786px) 100vw, 786px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories_actions-1.png?width=786&amp;amp;height=266&amp;amp;name=IDA_Teams_Git_manage_repositories_actions-1.png&quot; width=&quot;786&quot; height=&quot;266&quot; loading=&quot;lazy&quot; alt=&quot;IDA_Teams_Git_manage_repositories_actions-1&quot; style=&quot;height: auto; max-width: 100%; width: 786px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories_actions-1.png?width=393&amp;amp;height=133&amp;amp;name=IDA_Teams_Git_manage_repositories_actions-1.png 393w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories_actions-1.png?width=786&amp;amp;height=266&amp;amp;name=IDA_Teams_Git_manage_repositories_actions-1.png 786w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories_actions-1.png?width=1179&amp;amp;height=399&amp;amp;name=IDA_Teams_Git_manage_repositories_actions-1.png 1179w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories_actions-1.png?width=1572&amp;amp;height=532&amp;amp;name=IDA_Teams_Git_manage_repositories_actions-1.png 1572w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories_actions-1.png?width=1965&amp;amp;height=665&amp;amp;name=IDA_Teams_Git_manage_repositories_actions-1.png 1965w, https://hex-rays.com/hs-fs/hubfs/IDA_Teams_Git_manage_repositories_actions-1.png?width=2358&amp;amp;height=798&amp;amp;name=IDA_Teams_Git_manage_repositories_actions-1.png 2358w&quot; sizes=&quot;(max-width: 786px) 100vw, 786px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Deep Links&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;, our latest update for 9.4, make it easy to point a teammate directly to something you&#39;ve found — a function, an address, a string, a type — without any back-and-forth about where to look.&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/copy-link-context-menu.png?width=2348&amp;amp;height=1604&amp;amp;name=copy-link-context-menu.png&quot; width=&quot;2348&quot; height=&quot;1604&quot; loading=&quot;lazy&quot; alt=&quot;copy-link-context-menu&quot; style=&quot;height: auto; max-width: 100%; width: 2348px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/copy-link-context-menu.png?width=1174&amp;amp;height=802&amp;amp;name=copy-link-context-menu.png 1174w, https://hex-rays.com/hs-fs/hubfs/copy-link-context-menu.png?width=2348&amp;amp;height=1604&amp;amp;name=copy-link-context-menu.png 2348w, https://hex-rays.com/hs-fs/hubfs/copy-link-context-menu.png?width=3522&amp;amp;height=2406&amp;amp;name=copy-link-context-menu.png 3522w, https://hex-rays.com/hs-fs/hubfs/copy-link-context-menu.png?width=4696&amp;amp;height=3208&amp;amp;name=copy-link-context-menu.png 4696w, https://hex-rays.com/hs-fs/hubfs/copy-link-context-menu.png?width=5870&amp;amp;height=4010&amp;amp;name=copy-link-context-menu.png 5870w, https://hex-rays.com/hs-fs/hubfs/copy-link-context-menu.png?width=7044&amp;amp;height=4812&amp;amp;name=copy-link-context-menu.png 7044w&quot; sizes=&quot;(max-width: 2348px) 100vw, 2348px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Share a location with a URL.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Right-click any item in IDA and choose Copy Link. This generates an &lt;/span&gt;&lt;span style=&quot;color: #188038;&quot;&gt;ida://&lt;/span&gt;&lt;span&gt; URL encoding the database, resource type, and exact location. Paste it into a chat, a ticket, a report, or an email.&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/jump-to-link-dialog.png?width=1876&amp;amp;height=278&amp;amp;name=jump-to-link-dialog.png&quot; width=&quot;1876&quot; height=&quot;278&quot; loading=&quot;lazy&quot; alt=&quot;jump-to-link-dialog&quot; style=&quot;height: auto; max-width: 100%; width: 1876px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/jump-to-link-dialog.png?width=938&amp;amp;height=139&amp;amp;name=jump-to-link-dialog.png 938w, https://hex-rays.com/hs-fs/hubfs/jump-to-link-dialog.png?width=1876&amp;amp;height=278&amp;amp;name=jump-to-link-dialog.png 1876w, https://hex-rays.com/hs-fs/hubfs/jump-to-link-dialog.png?width=2814&amp;amp;height=417&amp;amp;name=jump-to-link-dialog.png 2814w, https://hex-rays.com/hs-fs/hubfs/jump-to-link-dialog.png?width=3752&amp;amp;height=556&amp;amp;name=jump-to-link-dialog.png 3752w, https://hex-rays.com/hs-fs/hubfs/jump-to-link-dialog.png?width=4690&amp;amp;height=695&amp;amp;name=jump-to-link-dialog.png 4690w, https://hex-rays.com/hs-fs/hubfs/jump-to-link-dialog.png?width=5628&amp;amp;height=834&amp;amp;name=jump-to-link-dialog.png 5628w&quot; sizes=&quot;(max-width: 1876px) 100vw, 1876px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Navigate to link.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Navigation links take you directly to a specific location in IDA. A teammate can open the link in an existing IDA session, or use hcli, which will launch IDA if needed and automatically open the correct database and view.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Stable across reloads.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Links are based on relative virtual addresses (RVAs) rather than absolute addresses. If a database is rebased, links still resolve correctly.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Nine resource types.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Functions, addresses, strings, segments, names, imports, exports, types, and bookmarks can all be linked to directly.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Twelve view targets.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Links can open in disassembly, graph, pseudocode, hex view, or any of the dedicated IDA windows — whichever makes most sense for what you&#39;re sharing.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Python API.&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; Deep Links can also be opened programmatically via &lt;/span&gt;&lt;span style=&quot;color: #188038;&quot;&gt;ida_kernwin.open_ida_link()&lt;/span&gt;&lt;span&gt;, making them useful in scripts and automation workflows.&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;span&gt;Whether you&#39;re a solo analyst who wants a reliable history of your work, or part of a team tackling a complex binary together, Teams is built for the way reverse engineers actually work.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;
        </description><link>https://hex-rays.com/blog/teams-git-native-versioning-collaborative-reversing</link><guid isPermaLink="false">https://hex-rays.com/blog/teams-git-native-versioning-collaborative-reversing</guid><pubDate>Sun, 18 Oct 2026 10:57:02 GMT</pubDate></item><item><title>IDA 9.4 Release: A New Dyld Shared Cache, Swift Analysis, New Teams add-on, and more ...</title><description>&lt;span id=&quot;hs_cos_wrapper_post_body&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_rich_text&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;meta_field&quot; data-hs-cos-type=&quot;rich_text&quot;&gt;&lt;div class=&quot;hr-post&quot;&gt;
&lt;p&gt;After weeks of feedback and refinement from our beta testers, we are excited to introduce &lt;strong&gt;IDA 9.4&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Building on 9.3, this release reworks how IDA handles Apple&#39;s Dyld Shared Cache, teaches the decompiler to speak Swift, adds two brand-new processor modules, and reshapes everyday navigation with the new Pathfinder widget and a redesigned Xrefs Graph. There is also a change we are especially happy about for hobbyists: idalib, our headless automation library, now ships with IDA Home.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Below is an overview of the key features and improvements in IDA 9.4. For the complete technical details, be sure to check out the official &lt;a href=&quot;https://docs.hex-rays.com/release-notes/9_4&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Apple Dyld Shared Cache, Reimagined&lt;/h2&gt;
&lt;p&gt;IDA 9.4 completely overhauls how it loads and analyzes Apple&#39;s Dyld Shared Caches, the bundles that pack the system frameworks on modern macOS and iOS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dedicated widgets and specialized workflows make it far easier to work inside a shared cache, with seamless navigation between its components.&lt;/li&gt;
&lt;li&gt;Analysis is more accurate and more correct, and the loader keeps up with the latest formats, including the dyld shared caches introduced with iOS 27.&lt;/li&gt;
&lt;li&gt;Objective-C reversers benefit from recovered method prototypes and correct handling of the newer libobjcMsgSend selector stubs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apple-ecosystem reversers should have a much easier time with the new system. See the &lt;a href=&quot;https://docs.hex-rays.com/9.4/core/disassembler/concepts/dsc-workflow&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;DSC workflow documentation&lt;/a&gt; for the concepts and workflows.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/image.png?width=688&amp;amp;height=586&amp;amp;name=image.png&quot; width=&quot;688&quot; height=&quot;586&quot; loading=&quot;lazy&quot; alt=&quot;image&quot; style=&quot;height: auto; max-width: 100%; width: 688px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/image.png?width=344&amp;amp;height=293&amp;amp;name=image.png 344w, https://hex-rays.com/hs-fs/hubfs/image.png?width=688&amp;amp;height=586&amp;amp;name=image.png 688w, https://hex-rays.com/hs-fs/hubfs/image.png?width=1032&amp;amp;height=879&amp;amp;name=image.png 1032w, https://hex-rays.com/hs-fs/hubfs/image.png?width=1376&amp;amp;height=1172&amp;amp;name=image.png 1376w, https://hex-rays.com/hs-fs/hubfs/image.png?width=1720&amp;amp;height=1465&amp;amp;name=image.png 1720w, https://hex-rays.com/hs-fs/hubfs/image.png?width=2064&amp;amp;height=1758&amp;amp;name=image.png 2064w&quot; sizes=&quot;(max-width: 688px) 100vw, 688px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;Swift, Rust, and Go: Deeper High-Level Language Support&lt;/h2&gt;
&lt;p&gt;The decompiler continues to close the gap between stripped native binaries and the languages they were written in.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The decompiler and type system now understand the Swift calling convention. New keywords let you declare the self register (&lt;code&gt;__swiftself&lt;/code&gt;), the async context (&lt;code&gt;__swiftasync&lt;/code&gt;), and the error path (&lt;code&gt;__swiftthrows&lt;/code&gt;), so the pseudocode reads the way the original Swift did, with the confusing register plumbing rewritten as clear intrinsics. On stripped binaries, IDA can now also recover &lt;code&gt;__swiftcall&lt;/code&gt;, throwing calls, and spilled arguments on its own.&lt;/li&gt;
&lt;li&gt;Rust analysis gains detection of the rustc version and crate list (shown in the header), typed panic locations, and a dedicated Rust calling convention.&lt;/li&gt;
&lt;li&gt;Go analysis improves across the board, with better pclntab discovery for PIE binaries, buildinfo dependency parsing for Go 1.18 and later, cleaner struct types, and more reliable argument and return-type detection.&lt;/li&gt;
&lt;li&gt;Objective-C ARC helpers (the retain and release stubs) are now recognized and can be shown or hidden on demand.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Decompiler Improvements&lt;/h2&gt;
&lt;p&gt;Beyond the language work, the decompiler gains a batch of output-quality and workflow upgrades.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New interactive actions: edit a type straight from the pseudocode with &lt;code&gt;e&lt;/code&gt;, add a cast to an expression, collapse code blocks using the chevrons in the margin, and invert an if/else with a single command.&lt;/li&gt;
&lt;li&gt;Argument name hints render parameter names right at the call site, so you no longer have to open a prototype to remember what an argument means.&lt;/li&gt;
&lt;li&gt;Strings recovered during decompilation now appear automatically in the Strings list.&lt;/li&gt;
&lt;li&gt;Many readability refinements, including &lt;code&gt;memcpy&lt;/code&gt; calls folded into simple assignments where possible, if-then-else reconstructed from phi merges instead of gotos, &lt;code&gt;fabs&lt;/code&gt; and negation recognized from IEEE 754 bit manipulation, &lt;code&gt;true&lt;/code&gt;/&lt;code&gt;false&lt;/code&gt; and &lt;code&gt;nullptr&lt;/code&gt; used in the right contexts, and a long list of internal-error fixes across architectures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Expanded Processor and Platform Support&lt;/h2&gt;
&lt;p&gt;IDA 9.4 widens hardware coverage with two new processor modules and substantial work on existing ones.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A brand-new Qualcomm Hexagon (QDSP6) module brings Qualcomm DSP firmware into reach, paired with a Qualcomm MBN boot-image loader (SBL and XBL containers, multi-ELF, hash validation). See the &lt;a href=&quot;https://docs.hex-rays.com/9.4/core/disassembler/concepts/hexagon&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Hexagon reference&lt;/a&gt; for packet-based execution and ISA coverage.&lt;/li&gt;
&lt;li&gt;A new MCore (CSky V1) module adds stack-pointer tracking, automatic stack-variable creation, and higher-quality disassembly.&lt;/li&gt;
&lt;li&gt;ARM gains full SVE2 and SME disassembly, along with recognition of more switch constructs seen in modern console SDKs.&lt;/li&gt;
&lt;li&gt;TriCore receives full type-system support, a new register finder, better switch-table recognition, and relocation support. RISC-V adds RP2350 (hazard3) extensions, the compressed Zcmp, Zcmt, and Zclsd instructions, and Soteria support. V850 recognizes more switch patterns.&lt;/li&gt;
&lt;li&gt;IDA is now available as a native ARM64 build for Windows-on-ARM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/hexagon-example.png?width=897&amp;amp;height=607&amp;amp;name=hexagon-example.png&quot; width=&quot;897&quot; height=&quot;607&quot; loading=&quot;lazy&quot; alt=&quot;hexagon-example&quot; style=&quot;height: auto; max-width: 100%; width: 897px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/hexagon-example.png?width=449&amp;amp;height=304&amp;amp;name=hexagon-example.png 449w, https://hex-rays.com/hs-fs/hubfs/hexagon-example.png?width=897&amp;amp;height=607&amp;amp;name=hexagon-example.png 897w, https://hex-rays.com/hs-fs/hubfs/hexagon-example.png?width=1346&amp;amp;height=911&amp;amp;name=hexagon-example.png 1346w, https://hex-rays.com/hs-fs/hubfs/hexagon-example.png?width=1794&amp;amp;height=1214&amp;amp;name=hexagon-example.png 1794w, https://hex-rays.com/hs-fs/hubfs/hexagon-example.png?width=2243&amp;amp;height=1518&amp;amp;name=hexagon-example.png 2243w, https://hex-rays.com/hs-fs/hubfs/hexagon-example.png?width=2691&amp;amp;height=1821&amp;amp;name=hexagon-example.png 2691w&quot; sizes=&quot;(max-width: 897px) 100vw, 897px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Loaders and Program Structure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Functions can now be grouped in the Functions list by the compilation unit they came from, reconstructed from COFF, PSX, OMF, TDS, DWARF, PDB, and Go, mirroring the binary&#39;s original source-file layout.&lt;/li&gt;
&lt;li&gt;ELF loading adds compact relative relocations (&lt;code&gt;DT_RELR&lt;/code&gt;) and recognizes Linux kernel modules, adding modinfo to the listing header. Mach-O handling keeps entry-point segments visible when they have no sections and decrypts Apple-protected segments located past the header.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Navigation and UI: Pathfinder, Jump Anywhere, and a Redesigned Xrefs Graph&lt;/h2&gt;
&lt;p&gt;Navigating a large database gets meaningfully faster in 9.4.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The new &lt;strong&gt;Pathfinder&lt;/strong&gt; widget (View &amp;gt; Open subviews &amp;gt; Pathfinder, &lt;code&gt;Shift-F9&lt;/code&gt;) &lt;span&gt;gives an answer which every RE wants to know&lt;/span&gt;: how does execution get from here to there? It finds call paths between two or more waypoints. Add the function under your cursor with &lt;code&gt;Ctrl-Shift-F9&lt;/code&gt;, exclude known noise, tune the search, and view the result as a cross-references tree or a path-highlighted Xrefs Graph. Find out &lt;a href=&quot;https://docs.hex-rays.com/9.4/core/disassembler/concepts/pathfinder&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;what Pathfinder can answer&lt;/a&gt; about your binary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jump Anywhere&lt;/strong&gt; is now the default action for the &lt;code&gt;g&lt;/code&gt; shortcut, replacing the classic jump-to-address dialog with a unified, type-ahead navigator: names, expressions like &lt;code&gt;cpu.EIP&lt;/code&gt;, function comments, live disassembly, pseudocode, and hex previews, and a jump history.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Xrefs Graph&lt;/strong&gt; has been significantly redesigned, with a new graph manager, informative node headers (comments, bookmarks, breakpoints, and missing references), a cleaner layout, and reorganized settings. It can also display and highlight the paths found by Pathfinder.&lt;/li&gt;
&lt;li&gt;A unified &lt;strong&gt;Scripts&lt;/strong&gt; window replaces the old Execute script and Snippets dialogs, with tabs for IDB snippets, recent external scripts, the shipped IDAPython examples, and a search across all three.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDB deep links&lt;/strong&gt; let you share a pointer to an exact location in a database and open it in an already-running IDA, without shipping files around.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://hex-rays.com/hs-fs/hubfs/jumpanywhere_search.png?width=864&amp;amp;height=528&amp;amp;name=jumpanywhere_search.png&quot; width=&quot;864&quot; height=&quot;528&quot; loading=&quot;lazy&quot; alt=&quot;jumpanywhere_search&quot; style=&quot;height: auto; max-width: 100%; width: 864px;&quot; srcset=&quot;https://hex-rays.com/hs-fs/hubfs/jumpanywhere_search.png?width=432&amp;amp;height=264&amp;amp;name=jumpanywhere_search.png 432w, https://hex-rays.com/hs-fs/hubfs/jumpanywhere_search.png?width=864&amp;amp;height=528&amp;amp;name=jumpanywhere_search.png 864w, https://hex-rays.com/hs-fs/hubfs/jumpanywhere_search.png?width=1296&amp;amp;height=792&amp;amp;name=jumpanywhere_search.png 1296w, https://hex-rays.com/hs-fs/hubfs/jumpanywhere_search.png?width=1728&amp;amp;height=1056&amp;amp;name=jumpanywhere_search.png 1728w, https://hex-rays.com/hs-fs/hubfs/jumpanywhere_search.png?width=2160&amp;amp;height=1320&amp;amp;name=jumpanywhere_search.png 2160w, https://hex-rays.com/hs-fs/hubfs/jumpanywhere_search.png?width=2592&amp;amp;height=1584&amp;amp;name=jumpanywhere_search.png 2592w&quot; sizes=&quot;(max-width: 864px) 100vw, 864px&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Teams, Now on Git&lt;/h2&gt;
&lt;p&gt;The Teams add-on for IDA Pro can now run on top of a Git server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Share IDB files using the Git provider you already use, whether GitHub, GitLab, Bitbucket, or self-hosted, with no server to deploy and no new credentials to issue. Just clone, analyze, commit, and push.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git ida&lt;/code&gt; works in the terminal through an automatically managed global Git configuration, and migration guides are available for teams moving over from Vault. See the &lt;a href=&quot;https://docs.hex-rays.com/9.4/add-ons/teams/getting-started/getting-started-git&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Git getting-started guide&lt;/a&gt; to set things up.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Debugger Advancements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The GDB remote backend has been broadly modernized, with more reliable stepping, better handling of misbehaving stubs, library and module discovery on startup, and image-base detection from the TIB.&lt;/li&gt;
&lt;li&gt;RISC-V debugging is now supported through the GDB backend.&lt;/li&gt;
&lt;li&gt;Win32 and WinDbg fixes correct TEB segment labeling and add a PEB segment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Automation: idalib Comes to IDA Home&lt;/h2&gt;
&lt;p&gt;Headless automation is no longer a Pro-only capability.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;idalib&lt;/strong&gt;, the library that lets you drive IDA&#39;s full analysis engine from a standalone script with no GUI, now ships with &lt;strong&gt;IDA Home&lt;/strong&gt; and is activated automatically during installation. Home users also get analysis.idc bundled, which enables the &lt;code&gt;-B&lt;/code&gt; batch switch. You can see idalib in action &lt;a href=&quot;https://hex-rays.com/blog/4-powerful-applications-of-idalib-headless-ida-in-action&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; or check out our recent Plugin Contest winner using it &lt;a href=&quot;https://hex-rays.com/blog/announcing-the-2025-plugin-contest-winners&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A new release of the &lt;strong&gt;IDA Domain API&lt;/strong&gt; (v0.5.0) adds microcode and pseudocode access along with object store and retrieve APIs. See &lt;a href=&quot;https://hex-rays.com/blog/whats-new-in-the-ida-domain-api&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;What&#39;s new in the IDA Domain API&lt;/a&gt; for the details.&lt;/li&gt;
&lt;li&gt;IDAPython now detects Python environments managed by uv, Anaconda, and Homebrew, warns on version mismatches, and exposes the new database indexer that powers Jump Anywhere.&lt;/li&gt;
&lt;li&gt;The SDK gains a large set of new EA-based APIs (covered in the porting guide) and a new &lt;code&gt;dscu.h&lt;/code&gt; header for programmatic access to the new Dyld Shared Cache infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Performance&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Loading large DWARF files is faster and uses less memory.&lt;/li&gt;
&lt;li&gt;Files that add a large number of names, such as Dyld Shared Caches, load faster, and frame analysis has been sped up.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;And more ...&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;For the complete technical details, be sure to check out the official &lt;a href=&quot;https://docs.hex-rays.com/release-notes/9_4&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Keep us in the loop!&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If you see something, say something. You can report bugs here: &lt;a href=&quot;https://get.support.hex-rays.com/servicedesk/customer/portals&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;https://support.hex-rays.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Have ideas on how we can improve IDA? We want to know! Send your feedback directly to &lt;a href=&quot;mailto:product@hex-rays.com&quot;&gt;product@hex-rays.com&lt;/a&gt;, or post it on &lt;a href=&quot;https://community.hex-rays.com/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Discourse&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Getting IDA 9.4&lt;/h2&gt;
&lt;p&gt;If you have an active IDA&amp;nbsp;license, you will see IDA 9.4 in the &lt;strong&gt;Download Center&lt;/strong&gt; of the My Hex-Rays &lt;a href=&quot;https://my.hex-rays.com/login&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;customer portal&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/span&gt;
        </description><link>https://hex-rays.com/blog/ida-9.4-release-a-new-dyld-shared-cache-swift-analysis-new-teams-add-on-and-more-</link><guid isPermaLink="false">https://hex-rays.com/blog/ida-9.4-release-a-new-dyld-shared-cache-swift-analysis-new-teams-add-on-and-more-</guid><pubDate>Sun, 18 Oct 2026 10:57:02 GMT</pubDate></item><item><title>IDA 9.4: Improved analysis of compiled Swift binaries</title><description>&lt;span id=&quot;hs_cos_wrapper_post_body&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_rich_text&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;meta_field&quot; data-hs-cos-type=&quot;rich_text&quot;&gt;&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;IDA 9.4 constitutes the first step towards better handling of Swift binaries. Perhaps unsurprisingly, our focus is on &lt;a href=&quot;https://hex-rays.com/blog/ida-9.4-apple-dyld-shared-cache-workflow-improvements&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Swift for ARM64 Mach-O&lt;/a&gt; files, but we generally aim to improve Swift support also in the more unusual settings across different architectures &lt;span style=&quot;color: #1d1d1f;&quot;&gt;and file formats&lt;/span&gt; like x86-64 and ELF. For 9.4, we want to highlight two different improvements: proper modelling of the Swift ABI, and proper typing of Swift runtime functions.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Proper Modelling of the Swift ABI&lt;/h2&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;With IDA 9.4, we introduce three new keywords for function prototypes:&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftself&lt;/code&gt;,&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftthrows&lt;/code&gt;, and&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftasync&lt;/code&gt;.&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Those three keywords all are preconditioned on the function being declared as&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftcall&lt;/code&gt;.&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftcall&lt;/code&gt;&lt;span&gt; &lt;/span&gt;has existed for many IDA releases already, but it now acts as a strong discriminator for any Swift-related logic inside IDA. For Objective-C/Swift mixed binaries,&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftcall&lt;/code&gt;&lt;span&gt; &lt;/span&gt;is your way to tell IDA that a function should be handled by the Swift machinery.&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;&lt;span style=&quot;color: #1d1d1f;&quot;&gt;Let&#39;s go over the three new keywords one by one: since each of them is strongly linked to a Swift-specific ABI register, they are best presented by understanding the corresponding part of the Swift ABI.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #b30000; background-color: #ffffff; line-height: 1.5;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;The Self Register&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Probably the most relevant one, because it made Swift reversing terribly annoying. The following very small snippet of ARM64 assembly code highlights the problem rather clearly:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_4f9bbe14-7577-4384-951f-b9751a01ff58&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__shell,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__intro,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__heading,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__desc,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__frame,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__chrome,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__viewport,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__body,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__pre,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__code,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__gutter,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__label,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__files,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__file,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__arrow,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__dots,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__divider,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__gutter i,
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__shell { margin: 0 auto; }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .tok-func { color: var(--ba-tok-func); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .tok-type { color: var(--ba-tok-type); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .tok-number { color: var(--ba-tok-number); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__frame { animation: none; }
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--before,
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58 .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_4f9bbe14-7577-4384-951f-b9751a01ff58&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;Disassembly&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#5b6370&quot;&gt;__text:000000010000530C&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;ADD&lt;/span&gt;     &lt;span style=&quot;color:#56b6c2&quot;&gt;X20&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x70&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;stack_str&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; self&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100005310&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;MOV&lt;/span&gt;     &lt;span style=&quot;color:#56b6c2&quot;&gt;X0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X27&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; other&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100005314&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;MOV&lt;/span&gt;     &lt;span style=&quot;color:#56b6c2&quot;&gt;X1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X28&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; other&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100005318&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;BL&lt;/span&gt;      &lt;span style=&quot;color:#e5c07b&quot;&gt;_$sSS6appendyySSF&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; String.append(_:)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;The code just concatenates two Swift strings: the&lt;span&gt; &lt;/span&gt;&lt;em&gt;existing&lt;/em&gt;&lt;span&gt; &lt;/span&gt;string is a temporary placed on the stack (&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;#0x70+stack_str&lt;/code&gt;), and the string that is to be appended, the compiler stored in register pair&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X27&lt;/code&gt;&lt;span&gt; &lt;/span&gt;and&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X28&lt;/code&gt;. We&#39;ll get to the peculiarities of Swift string internals at a later point in time; the annoyance we are trying to solve here is&lt;span&gt; &lt;/span&gt;&lt;em&gt;how&lt;/em&gt;&lt;span&gt; &lt;/span&gt;the compiler passes both the existing and the to-be-appended strings to the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;String.append&lt;/code&gt;&lt;span&gt; &lt;/span&gt;function. We see that the to-be-appended string is passed by value in registers&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X0&lt;/code&gt;&lt;span&gt; &lt;/span&gt;and&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X1&lt;/code&gt;, but the&lt;span&gt; &lt;/span&gt;&lt;em&gt;existing&lt;/em&gt;&lt;span&gt; &lt;/span&gt;string is passed via a pointer in&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X20&lt;/code&gt;.&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X0&lt;/code&gt;&lt;span&gt; &lt;/span&gt;and&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X1&lt;/code&gt;&lt;span&gt; &lt;/span&gt;are standard argument registers under the regular ARM64 calling convention, but&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X20&lt;/code&gt;&lt;span&gt; &lt;/span&gt;is callee-saved under&lt;span&gt; &lt;/span&gt;&lt;a href=&quot;https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#general-purpose-registers&quot;&gt;standard AAPCS64&lt;/a&gt;. Pre-9.4 IDA knew that a&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;Swift::String&lt;/code&gt;&lt;span&gt; &lt;/span&gt;occupied two 8-byte registers, but it had no concept of the Swift ABI specialties, so the decompiler would (wrongly) render this as follows:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_c6b0f719-655c-4697-b8d1-14025e7553f8&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__shell,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__intro,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__heading,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__desc,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__frame,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__chrome,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__viewport,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__body,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__pre,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__code,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__gutter,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__label,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__files,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__file,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__arrow,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__dots,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__divider,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__gutter i,
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__shell { margin: 0 auto; }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .tok-func { color: var(--ba-tok-func); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .tok-type { color: var(--ba-tok-type); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .tok-number { color: var(--ba-tok-number); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__frame { animation: none; }
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--before,
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8 .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_c6b0f719-655c-4697-b8d1-14025e7553f8&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;Pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;i&gt;5&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::String&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v14&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// x0&lt;/span&gt;
&lt;span style=&quot;color:#7d8590&quot;&gt;// ---------------------------------------------------&lt;/span&gt;
&lt;span style=&quot;color:#e0e2e6&quot;&gt;v14&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;_countAndFlagsBits&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v11&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#e0e2e6&quot;&gt;v14&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;_object&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v13&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#56b6c2&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e5c07b&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v14&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;The attentive reverser will immediately spot that&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;String.append&lt;/code&gt;&lt;span&gt; &lt;/span&gt;wrongly receives just one argument: the string that is to be appended. Crucially, we have no clue about the&lt;span&gt; &lt;/span&gt;&lt;em&gt;target&lt;/em&gt;&lt;span&gt; &lt;/span&gt;of the string append operation. This might be recoverable/guessable from context in this isolated example, but since the Swift compiler actually relies&lt;span&gt; &lt;/span&gt;&lt;em&gt;a lot&lt;/em&gt;&lt;span&gt; &lt;/span&gt;on passing pointers to objects in&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X20&lt;/code&gt;, the overall decompiler output becomes almost unintelligible, because the relationship between entities is difficult to track.&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;For this purpose, IDA 9.4 introduces the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftself&lt;/code&gt;&lt;span&gt; &lt;/span&gt;annotation for arguments in function prototypes. With this new keyword, the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;String.append&lt;/code&gt;&lt;span&gt; &lt;/span&gt;function looks as follows:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_6f4fb681-f126-4b6a-8fc1-604861d7363e&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__shell,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__intro,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__heading,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__desc,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__frame,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__chrome,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__viewport,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__body,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__pre,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__code,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__gutter,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__label,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__files,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__file,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__arrow,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__dots,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__divider,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__gutter i,
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__shell { margin: 0 auto; }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .tok-func { color: var(--ba-tok-func); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .tok-type { color: var(--ba-tok-type); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .tok-number { color: var(--ba-tok-number); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__frame { animation: none; }
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--before,
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_6f4fb681-f126-4b6a-8fc1-604861d7363e&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;Pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;__swiftcall&lt;/span&gt; &lt;span style=&quot;color:#61afef&quot;&gt;String_append&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::String&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#c678dd&quot;&gt;__swiftself&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::String&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;other&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;);&lt;/span&gt;
                                              &lt;span style=&quot;color:#98c379&quot;&gt;^~~~~~~~~~~ new keyword&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;With the updated function signature, the call site in the decompiler renders exactly as we would expect, with an explicit pointer to the object being manipulated passed as the first argument.&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__shell,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__intro,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__heading,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__desc,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__frame,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__chrome,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__viewport,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__body,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__pre,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__code,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__gutter,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__label,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__files,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__file,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__arrow,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__dots,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__divider,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__gutter i,
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__shell { margin: 0 auto; }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .tok-func { color: var(--ba-tok-func); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .tok-type { color: var(--ba-tok-type); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .tok-number { color: var(--ba-tok-number); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__frame { animation: none; }
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--before,
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_3b5acc7a-78b0-4d79-903a-7624fb2c2fac&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;Pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;i&gt;5&lt;/i&gt;&lt;i&gt;6&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::String&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v14&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// x0&lt;/span&gt;
&lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::String&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;stack_str&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// [xsp+8h] [xbp-68h] BYREF&lt;/span&gt;
&lt;span style=&quot;color:#7d8590&quot;&gt;// ---------------------------------------------------&lt;/span&gt;
&lt;span style=&quot;color:#e0e2e6&quot;&gt;v14&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;_countAndFlagsBits&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v11&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#e0e2e6&quot;&gt;v14&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;_object&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v13&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#56b6c2&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e5c07b&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;self:&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;stack_str&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;other:&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v14&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;&lt;span style=&quot;color: #1d1d1f;&quot;&gt;Only functions carrying the &lt;/span&gt;&lt;span style=&quot;color: #1d1d1f; background-color: #f6f7f9;&quot;&gt;__swiftcall&lt;/span&gt;&lt;span style=&quot;color: #1d1d1f;&quot;&gt; keyword can contain exactly one &lt;/span&gt;&lt;span style=&quot;color: #1d1d1f; background-color: #f6f7f9;&quot;&gt;__swiftself&lt;/span&gt;&lt;span style=&quot;color: #1d1d1f;&quot;&gt;-tagged argument. On x86-64 Swift binaries, the same logic is applied to &lt;/span&gt;&lt;span style=&quot;color: #1d1d1f; background-color: #f6f7f9;&quot;&gt;r13&lt;/span&gt;&lt;span style=&quot;color: #1d1d1f;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #b30000; background-color: #ffffff; line-height: 1.5;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;The Async Context Register&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;A similar problem arises if we study the following snippet:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__shell,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__intro,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__heading,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__desc,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__frame,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__chrome,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__viewport,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__body,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__pre,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__code,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__gutter,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__label,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__files,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__file,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__arrow,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__dots,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__divider,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__gutter i,
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__shell { margin: 0 auto; }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .tok-func { color: var(--ba-tok-func); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .tok-type { color: var(--ba-tok-type); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .tok-number { color: var(--ba-tok-number); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__frame { animation: none; }
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--before,
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_e5b95cfc-dc2b-4673-bf93-d33b2700fc8b&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;Disassembly &lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;i&gt;5&lt;/i&gt;&lt;i&gt;6&lt;/i&gt;&lt;i&gt;7&lt;/i&gt;&lt;i&gt;8&lt;/i&gt;&lt;i&gt;9&lt;/i&gt;&lt;i&gt;10&lt;/i&gt;&lt;i&gt;11&lt;/i&gt;&lt;i&gt;12&lt;/i&gt;&lt;i&gt;13&lt;/i&gt;&lt;i&gt;14&lt;/i&gt;&lt;i&gt;15&lt;/i&gt;&lt;i&gt;16&lt;/i&gt;&lt;i&gt;17&lt;/i&gt;&lt;i&gt;18&lt;/i&gt;&lt;i&gt;19&lt;/i&gt;&lt;i&gt;20&lt;/i&gt;&lt;i&gt;21&lt;/i&gt;&lt;i&gt;22&lt;/i&gt;&lt;i&gt;23&lt;/i&gt;&lt;i&gt;24&lt;/i&gt;&lt;i&gt;25&lt;/i&gt;&lt;i&gt;26&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA4&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; void __swiftcall specialized thunk for @escaping @convention(thin) @async () -&amp;gt; ()()&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA4&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;_$sIetH_yts5Error_pIegHrzo_TR10async_MainTf3npf_n&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA4&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA4&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;var_20&lt;/span&gt;  &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;-0x20&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA4&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;var_18&lt;/span&gt;  &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;-0x18&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA4&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;var_10&lt;/span&gt;  &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;-0x10&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA4&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA4&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;PACIBSP&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EA8&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;ORR&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X29&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X29&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x1000000000000000&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EAC&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;SUB&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EB0&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;STP&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X29&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X30&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;var_10&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EB4&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;ADD&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X16&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;var_18&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EB8&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;MOVK&lt;/span&gt;        &lt;span style=&quot;color:#56b6c2&quot;&gt;X16&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0xC31A&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;LSL&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;48&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EBC&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;MOV&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X17&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X22&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EC0&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;PACDB&lt;/span&gt;       &lt;span style=&quot;color:#56b6c2&quot;&gt;X17&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X16&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EC4&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;STR&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X17&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;var_18&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EC8&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;ADD&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X29&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;var_10&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003ECC&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;MOV&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt;  &lt;span style=&quot;color:#7d8590&quot;&gt;; request&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003ED0&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;BL&lt;/span&gt;          &lt;span style=&quot;color:#e5c07b&quot;&gt;_$sScMMa&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; type metadata accessor for MainActor&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003ED4&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;STR&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;X22&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x10&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; (A)&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003ED8&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;MOV&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X20&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X0&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EDC&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;BL&lt;/span&gt;          &lt;span style=&quot;color:#e5c07b&quot;&gt;_$sScM6sharedScMvgZ&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; static MainActor.shared.getter&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EE0&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;STR&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;X0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;X22&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x18&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; (B)&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EE4&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;ADRL&lt;/span&gt;        &lt;span style=&quot;color:#56b6c2&quot;&gt;X8&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;_$s14sampler_arm64e3AppV4mainyyYaFZTf4d_nTu&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; async function pointer to specialized static App.main()&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100003EEC&lt;/span&gt;         &lt;span style=&quot;color:#c678dd&quot;&gt;LDP&lt;/span&gt;         &lt;span style=&quot;color:#56b6c2&quot;&gt;W9&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;W0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;X8&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; size&lt;/span&gt;
&lt;span style=&quot;color:#7d8590&quot;&gt;; ---------------------------- snip ---------------------------------&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Despite the PAC-aware prologue, what draws our attention here are the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X22&lt;/code&gt;-based memory accesses without an obvious preceding sequence that would make&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X22&lt;/code&gt;&lt;span&gt; &lt;/span&gt;point to anything sensible. Again, that would be fair confusion on compiler-generated AAPCS64 code, but the Swift compiler reserves&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X22&lt;/code&gt;&lt;span&gt; &lt;/span&gt;(and its x86-64 counterpart&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;r14&lt;/code&gt;) as the&lt;span&gt; &lt;/span&gt;&lt;em&gt;async context register&lt;/em&gt;.&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;The async context stores state needed to suspend and resume an&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;async&lt;/code&gt;&lt;span&gt; &lt;/span&gt;function, such as continuation/resume information, but most notably async frame data, which can often span entire Swift objects. Keeping it in a dedicated callee-saved register lets Swift async code access that state cheaply across calls without repeatedly passing it as a normal argument.&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;This deviation from the regular ABI used to confuse pre-9.4 IDAs once again. Here&#39;s the corresponding pseudocode in IDA 9.3 (ignore the terrible whitespacing induced by the Swift demangler for a second):&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__shell,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__intro,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__heading,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__desc,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__frame,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__chrome,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__viewport,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__body,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__pre,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__code,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__gutter,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__label,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__files,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__file,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__arrow,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__dots,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__divider,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__gutter i,
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__shell { margin: 0 auto; }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .tok-func { color: var(--ba-tok-func); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .tok-type { color: var(--ba-tok-type); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .tok-number { color: var(--ba-tok-number); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__frame { animation: none; }
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--before,
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9 .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_fa66c3d4-d642-47ba-9e2e-7038d575ebf9&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;i&gt;5&lt;/i&gt;&lt;i&gt;6&lt;/i&gt;&lt;i&gt;7&lt;/i&gt;&lt;i&gt;8&lt;/i&gt;&lt;i&gt;9&lt;/i&gt;&lt;i&gt;10&lt;/i&gt;&lt;i&gt;11&lt;/i&gt;&lt;i&gt;12&lt;/i&gt;&lt;i&gt;13&lt;/i&gt;&lt;i&gt;14&lt;/i&gt;&lt;i&gt;15&lt;/i&gt;&lt;i&gt;16&lt;/i&gt;&lt;i&gt;17&lt;/i&gt;&lt;i&gt;18&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;__swiftcall&lt;/span&gt; specialized thunk for @escaping @convention(thin) @async () -&amp;gt; ()()
&lt;span style=&quot;color:#7f8696&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color:#56b6c2&quot;&gt;_QWORD&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// x22&lt;/span&gt;
  &lt;span style=&quot;color:#56b6c2&quot;&gt;_QWORD&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// x0&lt;/span&gt;
  &lt;span style=&quot;color:#56b6c2&quot;&gt;__int64&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v2&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// [xsp+18h] [xbp-8h]&lt;/span&gt;

  &lt;span style=&quot;color:#e0e2e6&quot;&gt;v0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; type metadata accessor for &lt;span style=&quot;color:#56b6c2&quot;&gt;MainActor&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;value&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;v0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;MainActor&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;shared&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e5c07b&quot;&gt;getter&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;swift_task_alloc&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x160u&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;v0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; specialized thunk for @escaping @convention(thin) @async () -&amp;gt; ()&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#c678dd&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v2&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;^&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v2&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;))&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;0x4000000000000000LL&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;!=&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color:#e5c07b&quot;&gt;__break&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0xC471u&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  specialized &lt;span style=&quot;color:#c678dd&quot;&gt;static&lt;/span&gt; App&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e5c07b&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#7f8696&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color:#7d8590&quot;&gt;// 100003ED4: variable &#39;v0&#39; is possibly undefined&lt;/span&gt;
&lt;span style=&quot;color:#7d8590&quot;&gt;// 100003F4C: variable &#39;v2&#39; is possibly undefined&lt;/span&gt;
&lt;span style=&quot;color:#7d8590&quot;&gt;// 100006964: using guessed type __int64 __swiftcall static MainActor.shared.getter();&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;The key is the line saying&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;// 100003ED4: variable &#39;v0&#39; is possibly undefined&lt;/code&gt;: in GUI IDA,&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;v0&lt;/code&gt;&lt;span&gt; &lt;/span&gt;would render in red, indicating that the underlying register was read from before it was written to. (Such red markers serve as a great indicator that something is wrong with the current pseudocode.)&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;In IDA 9.4, we can mark this function as&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftasync&lt;/code&gt;&lt;span&gt; &lt;/span&gt;to tell the decompiler that&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X22&lt;/code&gt;&lt;span&gt; &lt;/span&gt;carries a pointer to a meaningful async context:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_2a3e3d26-b843-4655-a3d6-7ea99618707d&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__shell,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__intro,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__heading,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__desc,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__frame,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__chrome,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__viewport,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__body,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__pre,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__code,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__gutter,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__label,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__files,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__file,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__arrow,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__dots,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__divider,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__gutter i,
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__shell { margin: 0 auto; }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .tok-func { color: var(--ba-tok-func); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .tok-type { color: var(--ba-tok-type); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .tok-number { color: var(--ba-tok-number); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__frame { animation: none; }
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--before,
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_2a3e3d26-b843-4655-a3d6-7ea99618707d&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;i&gt;5&lt;/i&gt;&lt;i&gt;6&lt;/i&gt;&lt;i&gt;7&lt;/i&gt;&lt;i&gt;8&lt;/i&gt;&lt;i&gt;9&lt;/i&gt;&lt;i&gt;10&lt;/i&gt;&lt;i&gt;11&lt;/i&gt;&lt;i&gt;12&lt;/i&gt;&lt;i&gt;13&lt;/i&gt;&lt;i&gt;14&lt;/i&gt;&lt;i&gt;15&lt;/i&gt;&lt;i&gt;16&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;__swiftcall&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;__swiftasync&lt;/span&gt; specialized thunk for @escaping @convention(thin) @async () -&amp;gt; ()()
&lt;span style=&quot;color:#7f8696&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color:#56b6c2&quot;&gt;_QWORD&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;async_context&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// x22&lt;/span&gt;
  &lt;span style=&quot;color:#56b6c2&quot;&gt;_QWORD&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// x0&lt;/span&gt;
  &lt;span style=&quot;color:#56b6c2&quot;&gt;__int64&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v2&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// [xsp+18h] [xbp-8h]&lt;/span&gt;

  &lt;span style=&quot;color:#e0e2e6&quot;&gt;async_context&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;__swift_get_async_context&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;async_context&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; type metadata accessor for &lt;span style=&quot;color:#56b6c2&quot;&gt;MainActor&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;request:&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;value&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;async_context&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;MainActor&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;shared&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e5c07b&quot;&gt;getter&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;swift_task_alloc&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;size:&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;0x160u&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;async_context&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;async_context&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; specialized thunk for @escaping @convention(thin) @async () -&amp;gt; ()&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#c678dd&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v2&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;^&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v2&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;))&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;0x4000000000000000LL&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;!=&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color:#e5c07b&quot;&gt;__break&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0xC471u&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  specialized &lt;span style=&quot;color:#c678dd&quot;&gt;static&lt;/span&gt; App&lt;span style=&quot;color:#7f8696&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e5c07b&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#7f8696&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;As you&#39;ll notice, we decided against modelling the async context as an explicit parameter, and rather fall back to a custom intrinsic,&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swift_get_async_context&lt;/code&gt;. This intrinsic is internally marked as non-propagating, so that it always results in an explicit local variable that can be explicitly typed by the user. This way, we can define a new struct type&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;my_async_ctxt&lt;/code&gt;, then incrementally build up information about the currently executing async context and edit the underlying type as we go.&lt;/p&gt;
&lt;h3 style=&quot;color: #b30000; background-color: #ffffff; line-height: 1.5;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;The Error Return Register&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Which brings us to our last contender for the top spot in the bizarre ABI zoo: the error return register (ARM64&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;&lt;span&gt; &lt;/span&gt;/ x86-64&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;r12&lt;/code&gt;). Here is the third snippet for you to study:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__shell,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__intro,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__heading,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__desc,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__frame,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__chrome,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__viewport,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__body,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__pre,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__code,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__gutter,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__label,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__files,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__file,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__arrow,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__dots,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__divider,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__gutter i,
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__shell { margin: 0 auto; }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .tok-func { color: var(--ba-tok-func); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .tok-type { color: var(--ba-tok-type); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .tok-number { color: var(--ba-tok-number); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__frame { animation: none; }
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--before,
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_98d5d24a-ff3e-4e99-a9f5-852bb0581f1b&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;disassembly&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;i&gt;5&lt;/i&gt;&lt;i&gt;6&lt;/i&gt;&lt;i&gt;7&lt;/i&gt;&lt;i&gt;8&lt;/i&gt;&lt;i&gt;9&lt;/i&gt;&lt;i&gt;10&lt;/i&gt;&lt;i&gt;11&lt;/i&gt;&lt;i&gt;12&lt;/i&gt;&lt;i&gt;13&lt;/i&gt;&lt;i&gt;14&lt;/i&gt;&lt;i&gt;15&lt;/i&gt;&lt;i&gt;16&lt;/i&gt;&lt;i&gt;17&lt;/i&gt;&lt;i&gt;18&lt;/i&gt;&lt;i&gt;19&lt;/i&gt;&lt;i&gt;20&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC0&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; Swift::Int __swiftcall callTyped(_:)(Swift::Int)&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC0&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;_$s10swift_errs9callTypedyS2iF&lt;/span&gt;          &lt;span style=&quot;color:#7d8590&quot;&gt;; CODE XREF: _main+100↑p&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC0&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC0&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;var_10&lt;/span&gt;          &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;-0x10&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC0&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;var_s0&lt;/span&gt;          &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt;  &lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC0&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC0&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;SUB&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x30&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC4&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;STP&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;X22&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X21&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;var_10&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EC8&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;STP&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;X29&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X30&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;var_s0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000ECC&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;ADD&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;X29&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000ED0&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;MOV&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;X21&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000ED4&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;BL&lt;/span&gt;              &lt;span style=&quot;color:#e5c07b&quot;&gt;_$s10swift_errs11typedThrowsyS2iAA7MyErrorOYKF&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000ED8&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;CMP&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;X21&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EDC&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;MOV&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;X8&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0xFFFFFFFFFFFFFFFD&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EE0&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;CSEL&lt;/span&gt;            &lt;span style=&quot;color:#56b6c2&quot;&gt;X0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X8&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; EQ
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EE4&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;LDP&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;X29&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X30&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;var_s0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EE8&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;LDP&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;X22&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;X21&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;var_10&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;]&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EEC&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;ADD&lt;/span&gt;             &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#56b6c2&quot;&gt;SP&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;0x30&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; &#39;0&#39;&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EF0&lt;/span&gt;                 &lt;span style=&quot;color:#c678dd&quot;&gt;RET&lt;/span&gt;
&lt;span style=&quot;color:#5b6370&quot;&gt;__text:0000000100000EF0&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;; End of function callTyped(_:)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;The most interesting part is how this function treats&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;: the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;MOV&lt;/code&gt;&lt;span&gt; &lt;/span&gt;at&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;0x100000ED0&lt;/code&gt;&lt;span&gt; &lt;/span&gt;initializes it to zero, followed by a call at&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;0x100000ED4&lt;/code&gt;, which is in turn followed by a check for zero at&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;0x100000ED8&lt;/code&gt;.&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Maybe a bit surprisingly, pre-9.4 IDAs would decompile this function as follows:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_69f8e5de-193c-4489-84f0-1254d4e39221&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__shell,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__intro,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__heading,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__desc,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__frame,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__chrome,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__viewport,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__body,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__pre,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__code,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__gutter,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__label,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__files,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__file,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__arrow,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__dots,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__divider,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__gutter i,
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__shell { margin: 0 auto; }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .tok-func { color: var(--ba-tok-func); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .tok-type { color: var(--ba-tok-type); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .tok-number { color: var(--ba-tok-number); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__frame { animation: none; }
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--before,
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221 .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_69f8e5de-193c-4489-84f0-1254d4e39221&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;Pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::Int&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;__swiftcall&lt;/span&gt; &lt;span style=&quot;color:#61afef&quot;&gt;callTyped&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;_:&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)(&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::Int&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;a1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color:#7f8696&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color:#c678dd&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;_s10swift_errs11typedThrowsyS2iAA7MyErrorOYKF&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;a1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#7f8696&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Why? Again because of Swift-specific ABI trickery: in vanilla ARM64,&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;&lt;span&gt; &lt;/span&gt;is&lt;span&gt; &lt;/span&gt;&lt;em&gt;callee-saved&lt;/em&gt;. That means the decompiler sees the sequence &quot;initialize&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;; call something [that will preserve&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;, because it&#39;s callee-saved]; check if&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;&lt;span&gt; &lt;/span&gt;is still zero&quot;, and consequently concludes that the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;CMP&lt;/code&gt;&lt;span&gt; &lt;/span&gt;at&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;0x100000ED8&lt;/code&gt;&lt;span&gt; &lt;/span&gt;will always set the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;EQ&lt;/code&gt;&lt;span&gt; &lt;/span&gt;flag and hence the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;CSEL&lt;/code&gt;&lt;span&gt; &lt;/span&gt;will always take the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X0&lt;/code&gt;&lt;span&gt; &lt;/span&gt;input reg (which still holds the return value of the callee in standard AAPCS64) — it hence completely optimizes away the check, leading to the flawed pseudocode output.&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;In IDA 9.4, however, the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftthrows&lt;/code&gt;&lt;span&gt; &lt;/span&gt;function prototype annotation is here to save the day: unlike the other two new keywords presented in this blog post,&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftthrows&lt;/code&gt;&lt;span&gt; &lt;/span&gt;alters the behaviour of all callers, rather than the function that carries the annotation. In our example that means the sole callee of this function is typed&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__shell,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__intro,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__heading,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__desc,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__frame,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__chrome,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__viewport,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__body,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__pre,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__code,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__gutter,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__label,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__files,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__file,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__arrow,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__dots,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__divider,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__gutter i,
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__shell { margin: 0 auto; }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .tok-func { color: var(--ba-tok-func); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .tok-type { color: var(--ba-tok-type); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .tok-number { color: var(--ba-tok-number); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__frame { animation: none; }
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--before,
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63 .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_6802b58e-bb25-4804-89a0-b93dbb9d1f63&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;__int64&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;__swiftcall&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;__swiftthrows&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;_s10swift_errs11typedThrowsyS2iAA7MyErrorOYKF&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;__int64&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
                    &lt;span style=&quot;color:#98c379&quot;&gt;^~~~~~~~~~~~~ new keyword&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;and hence signals to the caller that&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;&lt;span&gt; &lt;/span&gt;is precisely&lt;span&gt; &lt;/span&gt;&lt;em&gt;not&lt;/em&gt;&lt;span&gt; &lt;/span&gt;callee-saved, but rather carries the &quot;exception state&quot; (~zero = no exception, ~non-zero = exception; we&#39;ll spare you an explanation of Swift&#39;s typed exceptions today). As a consequence, the decompiler surfaces any subsequent&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;&lt;span&gt; &lt;/span&gt;accesses in terms of the new&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swift_get_error()&lt;/code&gt;&lt;span&gt; &lt;/span&gt;custom intrinsic, and we get the desired result:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__shell,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__intro,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__heading,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__desc,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__frame,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__chrome,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__viewport,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__body,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__pre,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__code,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__gutter,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__label,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__files,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__file,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__arrow,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__dots,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__divider,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__gutter i,
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__shell { margin: 0 auto; }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .tok-func { color: var(--ba-tok-func); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .tok-type { color: var(--ba-tok-type); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .tok-number { color: var(--ba-tok-number); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__frame { animation: none; }
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--before,
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29 .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_ed67f692-8f4b-4f3c-9f5a-9847bad72f29&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;i&gt;4&lt;/i&gt;&lt;i&gt;5&lt;/i&gt;&lt;i&gt;6&lt;/i&gt;&lt;i&gt;7&lt;/i&gt;&lt;i&gt;8&lt;/i&gt;&lt;i&gt;9&lt;/i&gt;&lt;i&gt;10&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::Int&lt;/span&gt; &lt;span style=&quot;color:#c678dd&quot;&gt;__swiftcall&lt;/span&gt; &lt;span style=&quot;color:#61afef&quot;&gt;callTyped&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;_:&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)(&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::Int&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;a1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color:#7f8696&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color:#56b6c2&quot;&gt;Swift::Int&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// x0&lt;/span&gt;
  &lt;span style=&quot;color:#56b6c2&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color:#7d8590&quot;&gt;// x21&lt;/span&gt;

  &lt;span style=&quot;color:#e0e2e6&quot;&gt;result&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;_s10swift_errs11typedThrowsyS2iAA7MyErrorOYKF&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;result:&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;a1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#e0e2e6&quot;&gt;error&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#e5c07b&quot;&gt;__swift_get_error&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#c678dd&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;error&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;!=&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;nullptr&lt;/span&gt; &lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color:#c678dd&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;-3&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color:#c678dd&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#7f8696&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;This is tremendously helpful for analyzing complex control flow. The&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftthrows&lt;/code&gt;&lt;span&gt; &lt;/span&gt;keyword is either deduced from the demangled function prototype (if available) or inferred from the callee&#39;s structure for unsymbolicated but known-Swift callees. We had to make this auto-detection check rather strict to prevent false positives because, sure enough, in other parts of the code — in non-excepting contexts — the Swift compiler uses&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;X21&lt;/code&gt;&lt;span&gt; &lt;/span&gt;as a perfectly fine callee-saved local scratch register. This new keyword and mechanic in the caller supersedes the old way of handling the Swift error return register, where IDA would work with spoils lists when it detected a thrower via the prototype (resulting in incantations like&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;Swift::Int __swiftcall __spoils&amp;lt;CF,ZF,NF,VF,X0,X1,...,X17,X21,Q0,...,Q31&amp;gt; Thrower(Swift::Int x, Swift::Int y, Swift::Int z);&lt;/code&gt;).&lt;/p&gt;
&lt;h2 style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Runtime Symbol Typing&lt;/h2&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;Modelling the ABI fixes how Swift functions&lt;span&gt; &lt;/span&gt;&lt;em&gt;talk to each other&lt;/em&gt;. The other half of the readability problem is the functions a Swift binary&lt;span&gt; &lt;/span&gt;&lt;em&gt;talks to&lt;/em&gt;: the runtime and standard library. A typical app calls hundreds of&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;swift_*&lt;/code&gt;&lt;span&gt; &lt;/span&gt;entry points, and historically IDA had nothing to say about any of them. They are not described by the&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swift5&lt;/code&gt;&lt;span&gt; &lt;/span&gt;metadata IDA walks (that metadata describes the types the binary&lt;span&gt; &lt;/span&gt;&lt;em&gt;defines&lt;/em&gt;, not the runtime it&lt;span&gt; &lt;/span&gt;&lt;em&gt;links against&lt;/em&gt;), so the best IDA could do was the usual&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__int64 __fastcall foo(_QWORD, _QWORD, ...)&lt;/code&gt;&lt;span&gt; &lt;/span&gt;guess. Multiply that by every call site, and a Swift pseudocode listing turns into a sea of untyped quadwords.&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;IDA 9.4 ships a curated set of prototypes for the runtime surface and applies them by name, so these functions arrive fully typed: with&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftcall&lt;/code&gt;, the right argument types, and meaningful enums. Take&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;swift_beginAccess&lt;/code&gt;, the exclusivity-checking primitive the compiler emits around&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;inout&lt;/code&gt;&lt;span&gt; &lt;/span&gt;and stored-property access. Before:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_c884d6a9-844d-4192-83e5-d4c119dce11d&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__shell,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__intro,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__heading,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__desc,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__frame,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__chrome,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__viewport,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__body,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__pre,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__code,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__gutter,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__label,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__files,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__file,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__arrow,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__dots,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__divider,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__gutter i,
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__shell { margin: 0 auto; }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .tok-func { color: var(--ba-tok-func); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .tok-type { color: var(--ba-tok-type); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .tok-number { color: var(--ba-tok-number); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__frame { animation: none; }
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--before,
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_c884d6a9-844d-4192-83e5-d4c119dce11d&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#7d8590&quot;&gt;// __int64 __fastcall swift_beginAccess(_QWORD, _QWORD, _QWORD, _QWORD); weak&lt;/span&gt;
&lt;span style=&quot;color:#e5c07b&quot;&gt;swift_beginAccess&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v1&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;a1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;33&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#e5c07b&quot;&gt;swift_beginAccess&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v0&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;v3&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;and after:&lt;/p&gt;
&lt;div id=&quot;hs_cos_wrapper_widget_57569de8-e694-4037-947f-a0de9e9957db&quot; class=&quot;hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module&quot; style=&quot;&quot; data-hs-cos-general-type=&quot;widget&quot; data-hs-cos-type=&quot;module&quot;&gt;











&lt;style&gt;
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db {
  --ba-module-bg: rgba(255, 255, 255, 0.0);
  --ba-before-bg: rgba(26, 27, 33, 1.0);
  --ba-after-bg: rgba(16, 17, 22, 1.0);
  --ba-chrome-bg: rgba(29, 30, 37, 1.0);
  --ba-before-text: rgba(206, 209, 217, 1.0);
  --ba-after-text: rgba(206, 209, 217, 1.0);
  --ba-border: rgba(255, 255, 255, 0.1);
  --ba-label-bg: rgba(255, 255, 255, 0.06);
  --ba-label-text: rgba(147, 150, 161, 1.0);
  --ba-linenum: rgba(255, 255, 255, 0.22);
  --ba-tok-keyword: rgba(122, 162, 247, 1.0);
  --ba-tok-func: rgba(224, 175, 104, 1.0);
  --ba-tok-type: rgba(125, 207, 255, 1.0);
  --ba-tok-number: rgba(255, 158, 100, 1.0);
  --ba-tok-comment: rgba(86, 95, 137, 1.0);
  --ba-tok-mark: rgba(122, 162, 247, 0.2);
  --ba-divider: rgba(255, 255, 255, 0.16);
  --ba-grip-bg: rgba(244, 244, 245, 1.0);
  --ba-grip-icon: rgba(27, 27, 31, 1.0);
  --ba-divider-w: 2px;
  --ba-grip-size: 42px;
  --ba-radius: 14px;
  --ba-border-w: 1px;
  --ba-pad: 24px;
  --ba-min-h: 200px;
  --ba-code-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace;
  --ba-code-size: 15px;
  --ba-label-font: &#39;JetBrains Mono&#39;, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --ba-label-size: 11px;
  --ba-lh: 1.7;
  display: block;
  background: var(--ba-module-bg);
}

/* ---- hard reset: every selector is (1,1,0)+, beating the theme&#39;s (1,0,1)
       #hs_cos_wrapper_post_body div/pre/code rules without !important ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__shell,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__intro,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__heading,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__desc,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__frame,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__chrome,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__viewport,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__body,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__pre,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__code,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__gutter,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__label,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__files,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__file,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__arrow,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__dots,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__divider,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__handle {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
  min-width: 0;
  overflow: visible;
  font-family: inherit;
  color: inherit;
  text-transform: none;
  letter-spacing: normal;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__gutter i,
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__dots i {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font-style: normal;
}

/* ---- shell ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__shell { margin: 0 auto; }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__intro {
  max-width: 640px;
  margin: 0 auto 18px;
  text-align: center;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__heading {
  color: var(--ba-after-text);
  font-size: clamp(1.3rem, 1rem + 1.2vw, 1.85rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__desc {
  margin-top: 7px;
  color: var(--ba-after-text);
  opacity: 0.6;
  font-size: 1rem;
  line-height: 1.55;
}

/* ---- frame: the code box ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__frame {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  width: 100%;
  
  margin-inline: auto;
  border: var(--ba-border-w) solid var(--ba-border);
  border-radius: var(--ba-radius);
  background: var(--ba-after-bg);
  box-shadow: 0 26px 64px -34px rgba(0, 0, 0, 0.75);
  animation: ba-rise-bac-widget_57569de8-e694-4037-947f-a0de9e9957db 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* ---- window chrome ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__chrome {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 16px;
  min-height: 44px;
  background: var(--ba-chrome-bg);
  border-bottom: 1px solid var(--ba-border);
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__dots { display: inline-flex; gap: 7px; flex: none; }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__dots i {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--ba-border);
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__files {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  letter-spacing: 0.03em;
  white-space: nowrap;
  overflow: hidden;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__file { color: var(--ba-linenum); overflow: hidden; text-overflow: ellipsis; }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__file--after { color: var(--ba-label-text); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__arrow { flex: none; color: var(--ba-linenum); }

/* ---- panels ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__viewport {
  position: relative;
  display: flex;
  align-items: stretch;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel {
  position: relative;
  min-width: 0;
  min-height: var(--ba-min-h);
  overflow: hidden;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--before {
  flex: 0 0 var(--ba-split, 50%);
  background-color: var(--ba-before-bg);
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--after {
  flex: 1 1 0;
  background-color: var(--ba-after-bg);
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--single { flex: 1 1 auto; }

/* ---- resize divider + handle (split mode only) ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__divider {
  position: relative;
  flex: 0 0 var(--ba-divider-w);
  background: var(--ba-divider);
  z-index: 4;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--ba-grip-size);
  height: var(--ba-grip-size);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--ba-grip-bg);
  color: var(--ba-grip-icon);
  cursor: ew-resize;
  touch-action: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 5px rgba(255, 255, 255, 0.06);
  transition: transform 0.14s ease;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__handle:hover { transform: translate(-50%, -50%) scale(1.08); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__handle:focus-visible {
  outline: none;
  box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--ba-after-bg), 0 0 0 5px var(--ba-divider);
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__chev { display: block; pointer-events: none; }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db.is-dragging { user-select: none; -webkit-user-select: none; }

/* ---- code body ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__body {
  display: flex;
  align-items: flex-start;
  /* no left padding: the sticky gutter (or the pre) owns the left inset so code
     can&#39;t scroll into a dead strip to the left of the line numbers */
  padding: var(--ba-pad) var(--ba-pad) var(--ba-pad) 0;
  overflow-x: auto;
  overflow-y: hidden;
  /* only capture horizontal pans; let vertical swipes scroll the page (mobile) */
  touch-action: pan-x;
  scrollbar-width: thin;
  scrollbar-color: var(--ba-border) transparent;
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  -webkit-font-smoothing: antialiased;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__body::-webkit-scrollbar { height: 9px; }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__body::-webkit-scrollbar-thumb {
  background: var(--ba-border);
  border-radius: 9px;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 28px); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__gutter {
  position: sticky;
  left: 0;
  display: flex;
  flex-direction: column;
  flex: none;
  margin-right: 16px;
  padding-left: var(--ba-pad);
  padding-right: 16px;
  border-right: 1px solid var(--ba-border);
  text-align: right;
  color: var(--ba-linenum);
  font-variant-numeric: tabular-nums;
  user-select: none;
  z-index: 1;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--before .ba-code__gutter { background: var(--ba-before-bg); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--after .ba-code__gutter { background: var(--ba-after-bg); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__gutter i { display: block; line-height: var(--ba-lh); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__pre {
  font-family: var(--ba-code-font);
  font-size: var(--ba-code-size);
  line-height: var(--ba-lh);
  white-space: pre;
  font-variant-ligatures: none;
  tab-size: 4;
  -moz-tab-size: 4;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--before .ba-code__pre { color: var(--ba-before-text); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--after .ba-code__pre { color: var(--ba-after-text); }
/* when line numbers are hidden, the pre is first child and owns the left inset */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__body &gt; .ba-code__pre:first-child { padding-left: var(--ba-pad); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__code { font-family: var(--ba-code-font); font-size: var(--ba-code-size); }

/* ---- before / after badges ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__label {
  position: absolute;
  top: var(--ba-pad);
  z-index: 3;
  display: inline-flex;
  padding: 5px 11px;
  border-radius: 6px;
  background: var(--ba-label-bg);
  color: var(--ba-label-text);
  font-family: var(--ba-label-font);
  font-size: var(--ba-label-size);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1;
}
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__label--before { left: var(--ba-pad); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__label--after { right: var(--ba-pad); }

/* ---- syntax helper classes (used inside the pasted code) ---- */
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .tok-keyword { color: var(--ba-tok-keyword); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .tok-func { color: var(--ba-tok-func); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .tok-type { color: var(--ba-tok-type); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .tok-number { color: var(--ba-tok-number); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .tok-comment { color: var(--ba-tok-comment); }
#bac-widget_57569de8-e694-4037-947f-a0de9e9957db .tok-mark {
  background: var(--ba-tok-mark);
  border-radius: 4px;
  padding: 0.05em 0.32em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

@keyframes ba-rise-bac-widget_57569de8-e694-4037-947f-a0de9e9957db {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__frame { animation: none; }
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__handle { transition: none; }
}

/* ---- stack on small screens ---- */
@media (max-width: 720px) {
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__viewport { flex-direction: column; }
  /* when stacked, each panel sizes to its OWN content: no forced min-height
     (which left a big empty void on short panels) and no equal-height collapse
     (which clipped the taller panel&#39;s extra lines) */
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel { min-height: 0; overflow: visible; }
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--before,
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__panel--after { flex: 0 0 auto; }
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__divider { flex: 0 0 var(--ba-divider-w); }
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__handle { display: none; }
  /* panels are full-width when stacked: keep both badges left-aligned so the
     &quot;after&quot; label doesn&#39;t float off to the right edge */
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__label--after { right: auto; left: var(--ba-pad); }
}

/* ---- scale the code down on phones so more fits + line numbers hug the edge ---- */
@media (max-width: 600px) {
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db {
    --ba-code-size: 12.5px;
    --ba-label-size: 9.5px;
    --ba-pad: 12px;
    --ba-lh: 1.55;
  }
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__gutter { margin-right: 10px; padding-right: 10px; }
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__chrome { gap: 10px; padding: 0 12px; min-height: 40px; }
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db.ba-has-labels .ba-code__body { padding-top: calc(var(--ba-pad) + 24px); }
  #bac-widget_57569de8-e694-4037-947f-a0de9e9957db .ba-code__label { padding: 4px 9px; letter-spacing: 0.08em; }
}
&lt;/style&gt;



&lt;div id=&quot;bac-widget_57569de8-e694-4037-947f-a0de9e9957db&quot; class=&quot;ba-code ba-has-labels&quot;&gt;
  &lt;div class=&quot;ba-code__shell&quot;&gt;

    

    &lt;div class=&quot;ba-code__frame&quot;&gt;

      
      &lt;div class=&quot;ba-code__chrome&quot;&gt;
        &lt;span class=&quot;ba-code__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
        &lt;span class=&quot;ba-code__files&quot;&gt;
          
            
            &lt;span class=&quot;ba-code__file ba-code__file--after&quot;&gt;&lt;/span&gt;
            
          
        &lt;/span&gt;
      &lt;/div&gt;
      

      
      &lt;div class=&quot;ba-code__viewport&quot;&gt;
        
        
&lt;div class=&quot;ba-code__panel ba-code__panel--before ba-code__panel--single&quot;&gt;
  &lt;span class=&quot;ba-code__label ba-code__label--before&quot;&gt;pseudocode&lt;/span&gt;
  &lt;div class=&quot;ba-code__body&quot;&gt;
    &lt;span class=&quot;ba-code__gutter&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;1&lt;/i&gt;&lt;i&gt;2&lt;/i&gt;&lt;i&gt;3&lt;/i&gt;&lt;/span&gt;
    &lt;pre class=&quot;ba-code__pre&quot;&gt;&lt;code class=&quot;ba-code__code&quot;&gt;&lt;span style=&quot;color:#7d8590&quot;&gt;// void __swiftcall swift_beginAccess(void *pointer, void *buffer, Swift::ExclusivityFlags flags, void *pc);&lt;/span&gt;
&lt;span style=&quot;color:#e5c07b&quot;&gt;swift_beginAccess&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)(&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;self&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;buffer&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;Tracking&lt;/span&gt;&lt;span style=&quot;color:#abb2bf&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#d19a66&quot;&gt;Modify&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;nullptr&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color:#e5c07b&quot;&gt;swift_beginAccess&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#56b6c2&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color:#abb2bf&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)(&lt;/span&gt;&lt;span style=&quot;color:#e0e2e6&quot;&gt;v0&lt;/span&gt;  &lt;span style=&quot;color:#abb2bf&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#e0e2e6&quot;&gt;buffer&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color:#d19a66&quot;&gt;Modify&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;,&lt;/span&gt;          &lt;span style=&quot;color:#d19a66&quot;&gt;nullptr&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#7f8696&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

        
      &lt;/div&gt;
      

    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;The prototype is now the actual one —&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;__swiftcall&lt;/code&gt;, with typed arguments rather than a guess. Notice how the flags argument is typed as&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;Swift::ExclusivityFlags&lt;/code&gt;, so&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;33&lt;/code&gt;&lt;span&gt; &lt;/span&gt;prints as&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;Tracking|Modify&lt;/code&gt;&lt;span&gt; &lt;/span&gt;(&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;0x20|0x1&lt;/code&gt;) and&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;1&lt;/code&gt;&lt;span&gt; &lt;/span&gt;as&lt;span&gt; &lt;/span&gt;&lt;code style=&quot;background-color: #f6f7f9;&quot;&gt;Modify&lt;/code&gt;.&lt;/p&gt;
&lt;h2 style=&quot;line-height: 1.5; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #1d1d1f;&quot;&gt;The Future&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;span&gt;Those of you closely following IDA’s progress over the last releases already know that what was presented above is just the beginning. Upcoming IDA versions will address many more shortcomings (Strings, Metadata, Typing, Mangling, …) of current analysis and continue closing the gap between Swift binaries and the analysis they deserve.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #1d1d1f; background-color: #ffffff; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;
        </description><link>https://hex-rays.com/blog/ida-9.4-improved-analysis-of-compiled-swift-binaries</link><guid isPermaLink="false">https://hex-rays.com/blog/ida-9.4-improved-analysis-of-compiled-swift-binaries</guid><pubDate>Sun, 18 Oct 2026 10:57:02 GMT</pubDate></item></channel></rss>