Repository: compiler-explorer/compiler-explorer
Pull request #7393 (2025-02-14 00:39:33)

Bump vitest and @vitest/coverage-v8
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) and [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8). These dependencies needed to be updated together.
Updates `vitest` from 2.1.4 to 2.1.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/vitest-dev/vitest/releases">vitest's releases</a>.</em></p>
<blockquote>
<h2>v2.1.9</h2>
<p>This release includes security patches for:</p>
<ul>
<li><a href="https://github.com/vitest-dev/vitest/security/advisories/GHSA-8gvc-j273-4wm5">Browser mode serves arbitrary files | CVE-2025-24963</a></li>
<li><a href="https://github.com/vitest-dev/vitest/security/advisories/GHSA-9crc-q9x8-hgqq">Remote Code Execution when accessing a malicious website while Vitest API server is listening | CVE-2025-24964</a></li>
</ul>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li>backport <a href="https://redirect.github.com/vitest-dev/vitest/issues/7317">vitest-dev/vitest#7317</a> to v2 - by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/pull/7318">vitest-dev/vitest#7318</a></li>
<li>(backport <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/7340">#7340</a> to v2) restrict served files from <code>/__screenshot-error</code> - by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/pull/7343">vitest-dev/vitest#7343</a></li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.8...v2.1.9">View changes on GitHub</a></h5>
<h2>v2.1.8</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li>Support Node 21  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> <a href="https://github.com/vitest-dev/vitest/commit/92f7a2ad"><!-- raw HTML omitted -->(92f7a)<!-- raw HTML omitted --></a></li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.7...v2.1.8">View changes on GitHub</a></h5>
<h2>v2.1.7</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li>Revert support for Vite 6  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> <a href="https://github.com/vitest-dev/vitest/commit/fbe5c39d"><!-- raw HTML omitted -->(fbe5c)<!-- raw HTML omitted --></a>
<ul>
<li>This introduced some breaking changes (<a href="https://redirect.github.com/vitest-dev/vitest/issues/6992">vitest-dev/vitest#6992</a>). We will enable support for it later. In the meantime, you can still use <code>pnpm.overrides</code> or yarn resolutions to override the <code>vite</code> version in the <code>vitest</code> package - the APIs are compatible.</li>
</ul>
</li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.6...v2.1.7">View changes on GitHub</a></h5>
<h2>v2.1.6</h2>
<h2>🚀 Features</h2>
<ul>
<li>Support Vite 6</li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.5...v2.1.6">View changes on GitHub</a></h5>
<h2>v2.1.5</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li><code>dangerouslyIgnoreUnhandledErrors</code> without base reporter  -  by <a href="https://github.com/AriPerkkio"><code>@​AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6808">vitest-dev/vitest#6808</a> <a href="https://github.com/vitest-dev/vitest/commit/0bf0ab00"><!-- raw HTML omitted -->(0bf0a)<!-- raw HTML omitted --></a></li>
<li>Capture <code>unhandledRejection</code> even when base reporter is not used  -  by <a href="https://github.com/AriPerkkio"><code>@​AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6812">vitest-dev/vitest#6812</a> <a href="https://github.com/vitest-dev/vitest/commit/8878b04d"><!-- raw HTML omitted -->(8878b)<!-- raw HTML omitted --></a></li>
<li>Don't change the working directory when loading workspace projects  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6811">vitest-dev/vitest#6811</a> <a href="https://github.com/vitest-dev/vitest/commit/f0aeaca8"><!-- raw HTML omitted -->(f0aea)<!-- raw HTML omitted --></a></li>
<li>Remove <code>sequence.concurrent</code> from the <code>RuntimeConfig</code> type  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6880">vitest-dev/vitest#6880</a> <a href="https://github.com/vitest-dev/vitest/commit/6af73d93"><!-- raw HTML omitted -->(6af73)<!-- raw HTML omitted --></a></li>
<li>Stop the runner before restarting, restart on workspace config change  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6859">vitest-dev/vitest#6859</a> <a href="https://github.com/vitest-dev/vitest/commit/b01df47d"><!-- raw HTML omitted -->(b01df)<!-- raw HTML omitted --></a></li>
<li>Don't rerun on Esc or Ctrl-C during watch filter  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6895">vitest-dev/vitest#6895</a> <a href="https://github.com/vitest-dev/vitest/commit/98f76ea7"><!-- raw HTML omitted -->(98f76)<!-- raw HTML omitted --></a></li>
<li>Print ssrTransform error  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6885">vitest-dev/vitest#6885</a> <a href="https://github.com/vitest-dev/vitest/commit/4c96cce7"><!-- raw HTML omitted -->(4c96c)<!-- raw HTML omitted --></a></li>
<li>Throw an error and a warning if <code>.poll</code>, <code>.element</code>, <code>.rejects</code>/<code>.resolves</code>, and <code>locator.*</code> weren't awaited  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6877">vitest-dev/vitest#6877</a> <a href="https://github.com/vitest-dev/vitest/commit/93b67c24"><!-- raw HTML omitted -->(93b67)<!-- raw HTML omitted --></a></li>
<li><strong>browser</strong>:
<ul>
<li>Don't process the default css styles  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6861">vitest-dev/vitest#6861</a> <a href="https://github.com/vitest-dev/vitest/commit/0d67f04b"><!-- raw HTML omitted -->(0d67f)<!-- raw HTML omitted --></a></li>
<li>Support non US key input  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6873">vitest-dev/vitest#6873</a> <a href="https://github.com/vitest-dev/vitest/commit/5969d8da"><!-- raw HTML omitted -->(5969d)<!-- raw HTML omitted --></a></li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/vitest-dev/vitest/commit/c9e59a089d94642eea29a43f2ee1986a5afb99c6"><code>c9e59a0</code></a> chore: release v2.1.9</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/e0fe1d81e2d4bcddb1c6ca3c5c3970d8ba697383"><code>e0fe1d8</code></a> fix: backport <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/7317">#7317</a> to v2 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/7318">#7318</a>)</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/d69cc75698dd6dbeaed5c237ebb46ccd41bfb438"><code>d69cc75</code></a> bump: 2.1.8</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/92f7a2ad18453343bfef1333af4b4c8191f72ec4"><code>92f7a2a</code></a> fix: support Node 21</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/81ed45b3a46759ac5b8aaa3a5fad80767316c4ae"><code>81ed45b</code></a> chore: release v2.1.7</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/fbe5c39d8891abcd91dc6b03720ee2b6c7678197"><code>fbe5c39</code></a> fix: revert support for Vite 6</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/b936702debce5a9deca637b25950afa485ad3639"><code>b936702</code></a> bump: 2.1.6</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/32f23b98b4b1a3708360debc03b6719f5226db87"><code>32f23b9</code></a> chore: release v2.1.5</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/417bdb423d7a33d9c8be5b2d0d7027a2c38ded43"><code>417bdb4</code></a> fix(browser): init browsers eagerly when tests are running (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/6876">#6876</a>)</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/93b67c24b1e8297f230d54d953a5c537aa7b9f75"><code>93b67c2</code></a> fix: throw an error and a warning if <code>.poll</code>, <code>.element</code>, <code>.rejects</code>/`.resolv...</li>
<li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v2.1.9/packages/vitest">compare view</a></li>
</ul>
</details>
<br />

Updates `@vitest/coverage-v8` from 2.1.4 to 2.1.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/vitest-dev/vitest/releases"><code>@​vitest/coverage-v8</code>'s releases</a>.</em></p>
<blockquote>
<h2>v2.1.9</h2>
<p>This release includes security patches for:</p>
<ul>
<li><a href="https://github.com/vitest-dev/vitest/security/advisories/GHSA-8gvc-j273-4wm5">Browser mode serves arbitrary files | CVE-2025-24963</a></li>
<li><a href="https://github.com/vitest-dev/vitest/security/advisories/GHSA-9crc-q9x8-hgqq">Remote Code Execution when accessing a malicious website while Vitest API server is listening | CVE-2025-24964</a></li>
</ul>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li>backport <a href="https://redirect.github.com/vitest-dev/vitest/issues/7317">vitest-dev/vitest#7317</a> to v2 - by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/pull/7318">vitest-dev/vitest#7318</a></li>
<li>(backport <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8/issues/7340">#7340</a> to v2) restrict served files from <code>/__screenshot-error</code> - by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/pull/7343">vitest-dev/vitest#7343</a></li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.8...v2.1.9">View changes on GitHub</a></h5>
<h2>v2.1.8</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li>Support Node 21  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> <a href="https://github.com/vitest-dev/vitest/commit/92f7a2ad"><!-- raw HTML omitted -->(92f7a)<!-- raw HTML omitted --></a></li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.7...v2.1.8">View changes on GitHub</a></h5>
<h2>v2.1.7</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li>Revert support for Vite 6  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> <a href="https://github.com/vitest-dev/vitest/commit/fbe5c39d"><!-- raw HTML omitted -->(fbe5c)<!-- raw HTML omitted --></a>
<ul>
<li>This introduced some breaking changes (<a href="https://redirect.github.com/vitest-dev/vitest/issues/6992">vitest-dev/vitest#6992</a>). We will enable support for it later. In the meantime, you can still use <code>pnpm.overrides</code> or yarn resolutions to override the <code>vite</code> version in the <code>vitest</code> package - the APIs are compatible.</li>
</ul>
</li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.6...v2.1.7">View changes on GitHub</a></h5>
<h2>v2.1.6</h2>
<h2>🚀 Features</h2>
<ul>
<li>Support Vite 6</li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.5...v2.1.6">View changes on GitHub</a></h5>
<h2>v2.1.5</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li><code>dangerouslyIgnoreUnhandledErrors</code> without base reporter  -  by <a href="https://github.com/AriPerkkio"><code>@​AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6808">vitest-dev/vitest#6808</a> <a href="https://github.com/vitest-dev/vitest/commit/0bf0ab00"><!-- raw HTML omitted -->(0bf0a)<!-- raw HTML omitted --></a></li>
<li>Capture <code>unhandledRejection</code> even when base reporter is not used  -  by <a href="https://github.com/AriPerkkio"><code>@​AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6812">vitest-dev/vitest#6812</a> <a href="https://github.com/vitest-dev/vitest/commit/8878b04d"><!-- raw HTML omitted -->(8878b)<!-- raw HTML omitted --></a></li>
<li>Don't change the working directory when loading workspace projects  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6811">vitest-dev/vitest#6811</a> <a href="https://github.com/vitest-dev/vitest/commit/f0aeaca8"><!-- raw HTML omitted -->(f0aea)<!-- raw HTML omitted --></a></li>
<li>Remove <code>sequence.concurrent</code> from the <code>RuntimeConfig</code> type  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6880">vitest-dev/vitest#6880</a> <a href="https://github.com/vitest-dev/vitest/commit/6af73d93"><!-- raw HTML omitted -->(6af73)<!-- raw HTML omitted --></a></li>
<li>Stop the runner before restarting, restart on workspace config change  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6859">vitest-dev/vitest#6859</a> <a href="https://github.com/vitest-dev/vitest/commit/b01df47d"><!-- raw HTML omitted -->(b01df)<!-- raw HTML omitted --></a></li>
<li>Don't rerun on Esc or Ctrl-C during watch filter  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6895">vitest-dev/vitest#6895</a> <a href="https://github.com/vitest-dev/vitest/commit/98f76ea7"><!-- raw HTML omitted -->(98f76)<!-- raw HTML omitted --></a></li>
<li>Print ssrTransform error  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6885">vitest-dev/vitest#6885</a> <a href="https://github.com/vitest-dev/vitest/commit/4c96cce7"><!-- raw HTML omitted -->(4c96c)<!-- raw HTML omitted --></a></li>
<li>Throw an error and a warning if <code>.poll</code>, <code>.element</code>, <code>.rejects</code>/<code>.resolves</code>, and <code>locator.*</code> weren't awaited  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6877">vitest-dev/vitest#6877</a> <a href="https://github.com/vitest-dev/vitest/commit/93b67c24"><!-- raw HTML omitted -->(93b67)<!-- raw HTML omitted --></a></li>
<li><strong>browser</strong>:
<ul>
<li>Don't process the default css styles  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6861">vitest-dev/vitest#6861</a> <a href="https://github.com/vitest-dev/vitest/commit/0d67f04b"><!-- raw HTML omitted -->(0d67f)<!-- raw HTML omitted --></a></li>
<li>Support non US key input  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6873">vitest-dev/vitest#6873</a> <a href="https://github.com/vitest-dev/vitest/commit/5969d8da"><!-- raw HTML omitted -->(5969d)<!-- raw HTML omitted --></a></li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/vitest-dev/vitest/commit/c9e59a089d94642eea29a43f2ee1986a5afb99c6"><code>c9e59a0</code></a> chore: release v2.1.9</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/d69cc75698dd6dbeaed5c237ebb46ccd41bfb438"><code>d69cc75</code></a> bump: 2.1.8</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/81ed45b3a46759ac5b8aaa3a5fad80767316c4ae"><code>81ed45b</code></a> chore: release v2.1.7</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/b936702debce5a9deca637b25950afa485ad3639"><code>b936702</code></a> bump: 2.1.6</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/32f23b98b4b1a3708360debc03b6719f5226db87"><code>32f23b9</code></a> chore: release v2.1.5</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/0ad2cdcaae0cd6e48b7a30d29bf6e89104187319"><code>0ad2cdc</code></a> chore(deps): update all non-major dependencies (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8/issues/6890">#6890</a>)</li>
<li>See full diff in <a href="https://github.com/vitest-dev/vitest/commits/v2.1.9/packages/coverage-v8">compare view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/compiler-explorer/compiler-explorer/network/alerts).

</details>


Patch:
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index b45b4e925..db8e13501 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -152,3 +152,5 @@ From oldest to newest contributor, we would like to thank:
 - [Pierre Bayerl](https://github.com/goto40)
 - [James Touton](https://github.com/Bekenn)
 - [Waqar Ahmed](https://github.com/waqar144)
+- [Niles Salter](https://github.com/Validark)
+- [Stephen Heumann](https://github.com/sheumann)
diff --git a/compiler-args-app.ts b/compiler-args-app.ts
index d866b0db9..e7a621215 100644
--- a/compiler-args-app.ts
+++ b/compiler-args-app.ts
@@ -61,6 +61,7 @@ const compilerParsers = {
     ghc: Parsers.GHCParser,
     tendra: Parsers.TendraParser,
     golang: Parsers.GolangParser,
+    zig: Parsers.ZigParser,
 };
 
 class CompilerArgsApp {
@@ -119,6 +120,8 @@ class CompilerArgsApp {
             console.log('supportsTargetIs');
         } else if (parser.hasSupportStartsWith(options, '--target ')) {
             console.log('supportsTarget');
+        } else if (parser.hasSupportStartsWith(options, '-target ')) {
+            console.log('supportsHyphenTarget');
         } else if (parser.hasSupportStartsWith(options, '--march=')) {
             console.log('supportsMarch');
         } else {
diff --git a/docs/AddingACompiler.md b/docs/AddingACompiler.md
index d604fcb18..661bb049a 100644
--- a/docs/AddingACompiler.md
+++ b/docs/AddingACompiler.md
@@ -99,6 +99,7 @@ once the site runs on the Amazon environment, the `&clang` group **will not** ha
 | versionRe            | RegExp     | A regular expression used to capture the version from the version output                                                                                           |
 | compilerType         | String     | The name of the class handling this compiler                                                                                                                       |
 | interpreted          | Boolean    | Whether this is an interpreted language, and so the "compiler" is really an interpreter                                                                            |
+| emulated             | Boolean    | Whether the compiler's output is run via an emulator (specified by `executionWrapper`) rather than natively                                                        |
 | executionWrapper     | Path       | Path to script that can execute the compiler's output (e.g. could run under `qemu` or `mpi_run` or similar)                                                        |
 | executionWrapperArgs | String     | List of arguments passed to the execution wrapper (separated by `\|` character)                                                                                    |
 | demangler            | String     | Path to the demangler tool                                                                                                                                         |
diff --git a/etc/config/c.amazon.properties b/etc/config/c.amazon.properties
index 06149ba66..c0b978af6 100644
--- a/etc/config/c.amazon.properties
+++ b/etc/config/c.amazon.properties
@@ -1,4 +1,4 @@
-compilers=&cgcc86:&cclang:&nvc_x86:&armcclang32:&armcclang64:&cmosclang-trunk:&rvcclang:&wasmcclang:&ppci:&cicc:&cicx:&ccl:&ccross:&cgcc-classic:&cc65:&sdcc:&ctendra:&tinycc:&zigcc:&cproc86:&chibicc:&z88dk:&compcert:godbolt.org@443/winprod:&movfuscator:&lc3:&upmem-clang:&cvast
+compilers=&cgcc86:&cclang:&nvc_x86:&armcclang32:&armcclang64:&cmosclang-trunk:&rvcclang:&wasmcclang:&ppci:&cicc:&cicx:&ccl:&ccross:&cgcc-classic:&cc65:&sdcc:&ctendra:&tinycc:&zigcc:&cproc86:&chibicc:&z88dk:&compcert:godbolt.org@443/winprod:&movfuscator:&lc3:&upmem-clang:&cvast:&orcac
 defaultCompiler=cg142
 # We use the llvm-trunk demangler for all c/c++ compilers, as c++filt tends to lag behind 
 demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
@@ -3515,6 +3515,31 @@ compiler.cvast-trunk.exe=/opt/compiler-explorer/vast-trunk/bin/vast-front
 compiler.cvast-trunk.isNightly=true
 compiler.cvast-trunk.options=-resource-dir /opt/compiler-explorer/clang-17.0.1/lib/clang/17/ --gcc-toolchain=/opt/compiler-explorer/gcc-13.2.0
 
+################################
+# ORCA/C (run via Golden Gate emulator)
+group.orcac.groupName=ORCA/C
+group.orcac.compilers=orcac221:orcac220:orcac210
+group.orcac.isSemVer=true
+group.orcac.baseName=ORCA/C
+group.orcac.executionWrapper=/opt/compiler-explorer/goldengate-2.0.9/bin/iix
+group.orcac.compilerType=orca
+group.orcac.objdumper=/opt/compiler-explorer/goldengate-2.0.9/bin/dumpobj
+group.orcac.objdumperType=goldengate
+group.orcac.emulated=true
+group.orcac.instructionSet=wdc65c816
+group.orcac.includeFlag=cc=-I
+group.orcac.versionFlag=compile|dummy.c
+group.orcac.exe=/opt/compiler-explorer/goldengate-2.0.9/bin/iix
+# Disable check for same compiler exe, because these are all run using the
+# same emulator.
+# Disabled: orcac210 orcac220 orcac221
+compiler.orcac210.goldenGate=/opt/compiler-explorer/orca-c-2.1.0
+compiler.orcac210.semver=2.1.0
+compiler.orcac220.goldenGate=/opt/compiler-explorer/orca-c-2.2.0
+compiler.orcac220.semver=2.2.0
+compiler.orcac221.goldenGate=/opt/compiler-explorer/orca-c-2.2.1
+compiler.orcac221.semver=2.2.1
+
 #################################
 #################################
 # Libraries
diff --git a/etc/config/execution.amazonwin.properties b/etc/config/execution.amazonwin.properties
index cfb6cc2ed..e498da3c2 100644
--- a/etc/config/execution.amazonwin.properties
+++ b/etc/config/execution.amazonwin.properties
@@ -1,3 +1,4 @@
 sandboxType=cewrapper
 executionType=cewrapper
 cewrapper=C:/cewrapper/cewrapper.exe
+unbufferStdoutExe=
diff --git a/etc/config/execution.defaults.properties b/etc/config/execution.defaults.properties
index 6352ef5f6..4e4261715 100644
--- a/etc/config/execution.defaults.properties
+++ b/etc/config/execution.defaults.properties
@@ -14,3 +14,8 @@ firejail.profile.wine=etc/firejail/wine.profile
 cewrapper=
 cewrapper.config.sandbox=etc/cewrapper/user-execution.json
 cewrapper.config.execute=etc/cewrapper/compilers-and-tools.json
+
+# Prefix execution with `stdbuf -o0` to have stdout output also for crashing executions.
+# Discussed further in https://github.com/compiler-explorer/compiler-explorer/issues/7239
+unbufferStdoutExe=stdbuf
+unbufferStdoutArgs=-o0
diff --git a/etc/config/sponsors.yaml b/etc/config/sponsors.yaml
index 678c58743..8c7a55429 100644
--- a/etc/config/sponsors.yaml
+++ b/etc/config/sponsors.yaml
@@ -517,3 +517,5 @@ levels:
       - woobwoobwoob
       - Drew Dormann
       - Ryan Lee
+      - elliot
+      - Cemalettin Dervis
diff --git a/etc/scripts/docenizers/Makefile b/etc/scripts/docenizers/Makefile
index 6ae8d0bf3..735af4759 100644
--- a/etc/scripts/docenizers/Makefile
+++ b/etc/scripts/docenizers/Makefile
@@ -1,6 +1,7 @@
 GEN_DIR := ../../../lib/asm-docs/generated
 all: \
  $(GEN_DIR)/asm-docs-6502.ts \
+ $(GEN_DIR)/asm-docs-65c816.ts \
  $(GEN_DIR)/asm-docs-amd64.ts \
  $(GEN_DIR)/asm-docs-arm32.ts \
  $(GEN_DIR)/asm-docs-aarch64.ts \
@@ -14,7 +15,9 @@ all: \
  $(GEN_DIR)/asm-docs-python.ts
 
 $(GEN_DIR)/asm-docs-6502.ts: docenizer-6502.py
-	python3 $<
+	python3 $< -o $@ -c 6502 -m 65c02
+$(GEN_DIR)/asm-docs-65c816.ts: docenizer-6502.py
+	python3 $< -o $@ -c 65c816 -m 65c816
 $(GEN_DIR)/asm-docs-amd64.ts: docenizer-amd64.py
 	python3 $< -o $@
 $(GEN_DIR)/asm-docs-arm32.ts: docenizer-arm.py arm32.json
@@ -36,4 +39,4 @@ $(GEN_DIR)/asm-docs-sass.ts: docenizer-ptx-sass.py
 $(GEN_DIR)/asm-docs-python.ts: docenizer-python.py
 	python3 $< -o $@
 $(GEN_DIR)/asm-docs-riscv64.ts: docenizer-riscv64.py
-	python3 $< -o $@
\ No newline at end of file
+	python3 $< -o $@
diff --git a/etc/scripts/docenizers/docenizer-6502.py b/etc/scripts/docenizers/docenizer-6502.py
index a038f535e..a8182fa07 100755
--- a/etc/scripts/docenizers/docenizer-6502.py
+++ b/etc/scripts/docenizers/docenizer-6502.py
@@ -6,11 +6,19 @@ import os.path
 import re
 import urllib.request
 
-
-DOC_URL_BASE = "https://raw.githubusercontent.com/mist64/c64ref/4274bd8782c5d3b18c68e6b9479b0ec751eb96b1/Source/6502/"
+parser = argparse.ArgumentParser(description='Docenizes 6502 family CPU documentation')
+parser.add_argument('-o', '--outputpath', type=str, help='Final path of the .ts file. Default is ./asm-docs-6502.ts',
+                    default='./asm-docs-6502.ts')
+parser.add_argument('-c', '--cpu', type=str, help='CPU to generate documentation for. Default is 6502',
+                    default="6502")
+parser.add_argument('-m', '--maxcpu', type=str, help='Maximum CPU to include in documentation. Default is 65c02',
+                    default="65c02")
+
+DOC_URL_BASE = "https://raw.githubusercontent.com/mist64/c64ref/f5792f46cfa9e05d006e5dd4f24199fed9091100/src/6502/"
 doc_files = {f"{DOC_URL_BASE}{filename}":cpu_type for filename, cpu_type in {
     "cpu_6502.txt" : "6502",
     "cpu_65c02.txt" : "65c02",
+    "cpu_65c816.txt" : "65c816",
     }.items()
 }
 mode_change_regex = re.compile(r"\[(?P<mode_name>.*)\]")
@@ -33,9 +41,10 @@ class Instruction:
         self.name = ""
         self.long_name = ""
         self.description = []
+        self.undocumented = False
 
     def html_description(self):
-        if self.description:
+        if self.description and self.cpu_type != "65c816":
             return "".join(
                 f"<p>{escape_quotes(desc_line)}</p>"
                 for desc_line in self.description
@@ -48,11 +57,16 @@ class Instruction:
             return f"<p>{self.mnemonic}</p>"
 
 
-def get_instructions():
+def get_instructions(cpu, maxcpu):
     """Gathers all instruction data and returns it in a dictionary."""
     instructions = {}
+    extra_cpu = False
     for f, t in doc_files.items():
-        instructions_from_file(f, t, instructions)
+        instructions_from_file(f, cpu if not extra_cpu else t, instructions)
+        if t == maxcpu:
+            break
+        if t == cpu:
+            extra_cpu = True
     return instructions
 
 
@@ -70,7 +84,7 @@ def instructions_from_file(filename, cpu_type, instructions):
                 continue
             regex_match = mode_change_regex.match(line)
             if regex_match:
-                parse_mode = mode_change(regex_match.group("mode_name"))
+                parse_mode = mode_change(regex_match.group("mode_name"), cpu_type)
                 continue
             if parse_mode == ParseMode.IGNORE:
                 continue
@@ -96,7 +110,7 @@ def remove_comments(line):
         return line
 
 
-def mode_change(mode_name):
+def mode_change(mode_name, cpu_type):
     if mode_name == "mnemos":
         return ParseMode.MNEMONICS
     elif mode_name == "documentation-mnemos":
@@ -132,6 +146,8 @@ def parse_descriptions(line, line_num, cpu_type, instructions):
         mnemonic = parse_descriptions.last_mnemonic
         description = continue_match.group("description")
         instructions[mnemonic].description.append(description)
+        if re.search("undocumented", description):
+            instructions[mnemonic].undocumented = True
 
 
 def write_script(filename, instructions):
@@ -141,6 +157,8 @@ def write_script(filename, instructions):
               "    if (!opcode) return;",
               "    switch (opcode.toUpperCase()) {"]
     for inst in instructions.values():
+        if inst.undocumented and inst.cpu_type != "6502":
+            continue
         script.append(f"        case \"{inst.mnemonic}\":")
         script.append("            return {")
         html = f"{16 * ' '}\"html\": \""
@@ -155,7 +173,6 @@ def write_script(filename, instructions):
             script.append(f"{16 * ' '}\"tooltip\": \"{safe_n}\",")
         else:
             script.append(f"{16 * ' '}\"tooltip\": \"{inst.mnemonic}\",")
-        # Will need to be replaced when other 65xx CPUs are added
         s = "https://www.pagetable.com/c64ref/6502/?cpu="
         e = "&tab=2#"
         t = inst.cpu_type
@@ -175,23 +192,12 @@ def escape_quotes(string):
     return string.replace("\"", "\\\"")
 
 
-def get_arguments():
-    parser = argparse.ArgumentParser()
-    help_text = "the location to which the script will be written"
-    relative_path = "../../../../lib/asm-docs/generated/asm-docs-6502.ts"
-    script_path = os.path.realpath(__file__)
-    script_dir = os.path.dirname(script_path)
-    default_path = os.path.normpath(script_dir + relative_path)
-    parser.add_argument("-o", "--output", help=help_text, default=default_path)
-    return parser.parse_args()
-
-
 def main():
-    args = get_arguments()
-    instructions = get_instructions()
+    args = parser.parse_args()
+    instructions = get_instructions(args.cpu, args.maxcpu)
     #for inst in instructions.values():
         #print(inst.__dict__)
-    write_script(args.output, instructions)
+    write_script(args.outputpath, instructions)
 
 
 if __name__ == "__main__":
diff --git a/lib/asm-docs/_all.ts b/lib/asm-docs/_all.ts
index 4197f0409..7ba601de4 100644
--- a/lib/asm-docs/_all.ts
+++ b/lib/asm-docs/_all.ts
@@ -34,3 +34,4 @@ export {PowerDocumentationProvider} from './power.js';
 export {PythonDocumentationProvider} from './python.js';
 export {Riscv64DocumentationProvider} from './riscv64.js';
 export {SASSDocumentationProvider} from './sass.js';
+export {WDC65c816DocumentationProvider} from './wdc65c816.js';
diff --git a/lib/asm-docs/generated/asm-docs-6502.ts b/lib/asm-docs/generated/asm-docs-6502.ts
index 18a106c6c..0775e999b 100644
--- a/lib/asm-docs/generated/asm-docs-6502.ts
+++ b/lib/asm-docs/generated/asm-docs-6502.ts
@@ -19,7 +19,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "ASL":
             return {
-                "html": "<p>The shift left instruction shifts either the accumulator or the address memory location 1 bit to the left, with the bit 0 always being set to 0 and the the input bit 7 being stored in the carry flag. ASL either shifts the accumulator left 1 bit or is a read/modify/write instruction that affects only memory.</p><p>The instruction does not affect the overflow bit, sets N equal to the result bit 7 (bit 6 in the input), sets Z flag if the result is equal to 0, otherwise resets Z and stores the input bit 7 in the carry flag.</p>",
+                "html": "<p>The shift left instruction shifts either the accumulator or the address memory location 1 bit to the left, with the bit 0 always being set to 0 and the input bit 7 being stored in the carry flag. ASL either shifts the accumulator left 1 bit or is a read/modify/write instruction that affects only memory.</p><p>The instruction does not affect the overflow bit, sets N equal to the result bit 7 (bit 6 in the input), sets Z flag if the result is equal to 0, otherwise resets Z and stores the input bit 7 in the carry flag.</p>",
                 "tooltip": "Arithmetic Shift Left",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#ASL",
             };
@@ -40,7 +40,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "BEQ":
             return {
-                "html": "<p>This instruction could also be called \"Branch on Equal.\"</p><p>It takes a conditional branch whenever the Z flag is on or the previ ous result is equal to 0.</p><p>BEQ does not affect any of the flags or registers other than the program counter and only then when the Z flag is set.</p>",
+                "html": "<p>This instruction could also be called \"Branch on Equal.\"</p><p>It takes a conditional branch whenever the Z flag is on or the previous result is equal to 0.</p><p>BEQ does not affect any of the flags or registers other than the program counter and only then when the Z flag is set.</p>",
                 "tooltip": "Branch on Result Zero",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#BEQ",
             };
@@ -75,7 +75,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "BRK":
             return {
-                "html": "<p>The break command causes the microprocessor to go through an inter rupt sequence under program control. This means that the program counter of the second byte after the BRK. is automatically stored on the stack along with the processor status at the beginning of the break instruction. The microprocessor then transfers control to the interrupt vector.</p><p>Other than changing the program counter, the break instruction changes no values in either the registers or the flags.</p>",
+                "html": "<p>The break command causes the microprocessor to go through an interrupt sequence under program control. This means that the program counter of the second byte after the BRK. is automatically stored on the stack along with the processor status at the beginning of the break instruction. The microprocessor then transfers control to the interrupt vector.</p><p>Other than changing the program counter, the break instruction changes no values in either the registers or the flags.</p>",
                 "tooltip": "Break Command",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#BRK",
             };
@@ -96,7 +96,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "CLC":
             return {
-                "html": "<p>This instruction initializes the carry flag to a 0. This op eration should normally precede an ADC loop. It is also useful when used with a R0L instruction to clear a bit in memory.</p><p>This instruction affects no registers in the microprocessor and no flags other than the carry flag which is reset.</p>",
+                "html": "<p>This instruction initializes the carry flag to a 0. This operation should normally precede an ADC loop. It is also useful when used with a R0L instruction to clear a bit in memory.</p><p>This instruction affects no registers in the microprocessor and no flags other than the carry flag which is reset.</p>",
                 "tooltip": "Clear Carry Flag",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#CLC",
             };
@@ -117,7 +117,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "CLV":
             return {
-                "html": "<p>This instruction clears the overflow flag to a 0. This com mand is used in conjunction with the set overflow pin which can change the state of the overflow flag with an external signal.</p><p>CLV affects no registers in the microprocessor and no flags other than the overflow flag which is set to a 0.</p>",
+                "html": "<p>This instruction clears the overflow flag to a 0. This command is used in conjunction with the set overflow pin which can change the state of the overflow flag with an external signal.</p><p>CLV affects no registers in the microprocessor and no flags other than the overflow flag which is set to a 0.</p>",
                 "tooltip": "Clear Overflow Flag",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#CLV",
             };
@@ -138,7 +138,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "CPY":
             return {
-                "html": "<p>This instruction performs a two's complement subtraction between the index register Y and the specified memory location. The results of the subtraction are not stored anywhere. The instruction is strictly used to set the flags.</p><p>CPY affects no registers in the microprocessor and also does not affect the overflow flag. If the value in the index register Y is equal to or greater than the value in the memory, the carry flag will be set, otherwise it will be cleared. If the results of the subtract- tion contain bit 7 on the N bit will be set, otherwise it will be cleared. If the value in the index register Y and the value in the memory are equal, the zero flag will be set, otherwise it will be cleared.</p>",
+                "html": "<p>This instruction performs a two's complement subtraction between the index register Y and the specified memory location. The results of the subtraction are not stored anywhere. The instruction is strictly used to set the flags.</p><p>CPY affects no registers in the microprocessor and also does not affect the overflow flag. If the value in the index register Y is equal to or greater than the value in the memory, the carry flag will be set, otherwise it will be cleared. If the results of the subtraction contain bit 7 on the N bit will be set, otherwise it will be cleared. If the value in the index register Y and the value in the memory are equal, the zero flag will be set, otherwise it will be cleared.</p>",
                 "tooltip": "Compare Index Register Y To Memory",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#CPY",
             };
@@ -159,7 +159,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "DEY":
             return {
-                "html": "<p>This instruction subtracts one from the current value in the in dex register Y and stores the result into the index register Y. The result does not affect or consider carry so that the value in the index register Y is decremented to 0 and then through 0 to FF.</p><p>Decrement Y does not affect the carry or overflow flags; if the Y register contains bit 7 on as a result of the decrement the N flag is set, otherwise the N flag is reset. If the Y register is 0 as a result of the decrement, the Z flag is set otherwise the Z flag is reset. This instruction only affects the index register Y.</p>",
+                "html": "<p>This instruction subtracts one from the current value in the index register Y and stores the result into the index register Y. The result does not affect or consider carry so that the value in the index register Y is decremented to 0 and then through 0 to FF.</p><p>Decrement Y does not affect the carry or overflow flags; if the Y register contains bit 7 on as a result of the decrement the N flag is set, otherwise the N flag is reset. If the Y register is 0 as a result of the decrement, the Z flag is set otherwise the Z flag is reset. This instruction only affects the index register Y.</p>",
                 "tooltip": "Decrement Index Register Y By One",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#DEY",
             };
@@ -194,14 +194,14 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "JMP":
             return {
-                "html": "<p>In this instruction, the data from the memory location located in the program sequence after the OP CODE is loaded into the low order byte of the program counter (PCL) and the data from the next memory location after that is loaded into the high order byte of the program counter (PCH).</p><p>This instruction establishes a new valne for the program counter.</p><p>It affects only the program counter in the microprocessor and affects no flags in the status register.</p>",
+                "html": "<p>In this instruction, the data from the memory location located in the program sequence after the OP CODE is loaded into the low order byte of the program counter (PCL) and the data from the next memory location after that is loaded into the high order byte of the program counter (PCH).</p><p>This instruction establishes a new value for the program counter.</p><p>It affects only the program counter in the microprocessor and affects no flags in the status register.</p>",
                 "tooltip": "JMP Indirect",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#JMP",
             };
 
         case "JSR":
             return {
-                "html": "<p>This instruction transfers control of the program counter to a subroutine location but leaves a return pointer on the stack to allow the user to return to perform the next instruction in the main program after the subroutine is complete. To accomplish this, JSR instruction stores the program counter address which points to the last byte of the jump instruc tion onto the stack using the stack pointer. The stack byte contains the program count high first, followed by program count low. The JSR then transfers the addresses following the jump instruction to the program counter low and the program counter high, thereby directing the program to begin at that new address.</p><p>The JSR instruction affects no flags, causes the stack pointer to be decremented by 2 and substitutes new values into the program counter low and the program counter high.</p>",
+                "html": "<p>This instruction transfers control of the program counter to a subroutine location but leaves a return pointer on the stack to allow the user to return to perform the next instruction in the main program after the subroutine is complete. To accomplish this, JSR instruction stores the program counter address which points to the last byte of the jump instruction onto the stack using the stack pointer. The stack byte contains the program count high first, followed by program count low. The JSR then transfers the addresses following the jump instruction to the program counter low and the program counter high, thereby directing the program to begin at that new address.</p><p>The JSR instruction affects no flags, causes the stack pointer to be decremented by 2 and substitutes new values into the program counter low and the program counter high.</p>",
                 "tooltip": "Jump To Subroutine",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#JSR",
             };
@@ -257,7 +257,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "PHP":
             return {
-                "html": "<p>This instruction transfers the contents of the processor status reg ister unchanged to the stack, as governed by the stack pointer.</p><p>The PHP instruction affects no registers or flags in the microprocessor.</p>",
+                "html": "<p>This instruction transfers the contents of the processor status register unchanged to the stack, as governed by the stack pointer.</p><p>The PHP instruction affects no registers or flags in the microprocessor.</p>",
                 "tooltip": "Push Processor Status On Stack",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#PHP",
             };
@@ -271,28 +271,28 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "PLP":
             return {
-                "html": "<p>This instruction transfers the next value on the stack to the Proces sor Status register, thereby changing all of the flags and setting the mode switches to the values from the stack.</p><p>The PLP instruction affects no registers in the processor other than the status register. This instruction could affect all flags in the status register.</p>",
+                "html": "<p>This instruction transfers the next value on the stack to the Processor Status register, thereby changing all of the flags and setting the mode switches to the values from the stack.</p><p>The PLP instruction affects no registers in the processor other than the status register. This instruction could affect all flags in the status register.</p>",
                 "tooltip": "Pull Processor Status From Stack",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#PLP",
             };
 
         case "ROL":
             return {
-                "html": "<p>The rotate left instruction shifts either the accumulator or addressed memory left 1 bit, with the input carry being stored in bit 0 and with the input bit 7 being stored in the carry flags.</p><p>The ROL instruction either shifts the accumulator left 1 bit and stores the carry in accumulator bit 0 or does not affect the internal registers at all. The ROL instruction sets carry equal to the input bit 7, sets N equal to the input bit 6 , sets the Z flag if the result of the ro tate is 0, otherwise it resets Z and does not affect the overflow flag at all.</p>",
+                "html": "<p>The rotate left instruction shifts either the accumulator or addressed memory left 1 bit, with the input carry being stored in bit 0 and with the input bit 7 being stored in the carry flags.</p><p>The ROL instruction either shifts the accumulator left 1 bit and stores the carry in accumulator bit 0 or does not affect the internal registers at all. The ROL instruction sets carry equal to the input bit 7, sets N equal to the input bit 6 , sets the Z flag if the result of the rotate is 0, otherwise it resets Z and does not affect the overflow flag at all.</p>",
                 "tooltip": "Rotate Left",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#ROL",
             };
 
         case "ROR":
             return {
-                "html": "<p>The rotate right instruction shifts either the accumulator or addressed memory right 1 bit with bit 0 shifted into the carry and carry shifted into bit 7.</p><p>The ROR instruction either shifts the accumulator right 1 bit and stores the carry in accumulator bit 7 or does not affect the internal regis ters at all. The ROR instruction sets carry equal to input bit 0, sets N equal to the input carry and sets the Z flag if the result of the rotate is 0; otherwise it resets Z and does not affect the overflow flag at all.</p><p>(Available on Microprocessors after June, 1976)</p>",
+                "html": "<p>The rotate right instruction shifts either the accumulator or addressed memory right 1 bit with bit 0 shifted into the carry and carry shifted into bit 7.</p><p>The ROR instruction either shifts the accumulator right 1 bit and stores the carry in accumulator bit 7 or does not affect the internal registers at all. The ROR instruction sets carry equal to input bit 0, sets N equal to the input carry and sets the Z flag if the result of the rotate is 0; otherwise it resets Z and does not affect the overflow flag at all.</p><p>(Available on Microprocessors after June, 1976)</p>",
                 "tooltip": "Rotate Right",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#ROR",
             };
 
         case "RTI":
             return {
-                "html": "<p>This instruction transfers from the stack into the microprocessor the processor status and the program counter location for the instruction which was interrupted. By virtue of the interrupt having stored this data before executing the instruction and thei fact that the RTI reinitializes the microprocessor to the same state as when it was interrupted, the combination of interrupt plus RTI allows truly reentrant coding.</p><p>The RTI instruction reinitializes all flags to the position to the point they were at the time the interrupt was taken and sets the program counter back to its pre-interrupt state. It affects no other registers in the microprocessor.</p>",
+                "html": "<p>This instruction transfers from the stack into the microprocessor the processor status and the program counter location for the instruction which was interrupted. By virtue of the interrupt having stored this data before executing the instruction and the fact that the RTI reinitializes the microprocessor to the same state as when it was interrupted, the combination of interrupt plus RTI allows truly reentrant coding.</p><p>The RTI instruction reinitializes all flags to the position to the point they were at the time the interrupt was taken and sets the program counter back to its pre-interrupt state. It affects no other registers in the microprocessor.</p>",
                 "tooltip": "Return From Interrupt",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#RTI",
             };
@@ -300,7 +300,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
         case "RTS":
             return {
                 "html": "<p>This instruction loads the program count low and program count high from the stack into the program counter and increments the program counter so that it points to the instruction following the JSR. The stack pointer is adjusted by incrementing it twice.</p><p>The RTS instruction does not affect any flags and affects only PCL and PCH.</p>",
-                "tooltip": "Return From Subroutme",
+                "tooltip": "Return From Subroutine",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#RTS",
             };
 
@@ -313,7 +313,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "SEC":
             return {
-                "html": "<p>This instruction initializes the carry flag to a 1. This op eration should normally precede a SBC loop. It is also useful when used with a ROL instruction to initialize a bit in memory to a 1.</p><p>This instruction affects no registers in the microprocessor and no flags other than the carry flag which is set.</p>",
+                "html": "<p>This instruction initializes the carry flag to a 1. This operation should normally precede a SBC loop. It is also useful when used with a ROL instruction to initialize a bit in memory to a 1.</p><p>This instruction affects no registers in the microprocessor and no flags other than the carry flag which is set.</p>",
                 "tooltip": "Set Carry Flag",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#SEC",
             };
@@ -355,7 +355,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "TAX":
             return {
-                "html": "<p>This instruction takes the value from accumulator A and trans fers or loads it into the index register X without disturbing the content of the accumulator A.</p><p>TAX only affects the index register X, does not affect the carry or overflow flags. The N flag is set if the resultant value in the index register X has bit 7 on, otherwise N is reset. The Z bit is set if the content of the register X is 0 as aresult of theopera tion, otherwise it is reset.</p>",
+                "html": "<p>This instruction takes the value from accumulator A and trans fers or loads it into the index register X without disturbing the content of the accumulator A.</p><p>TAX only affects the index register X, does not affect the carry or overflow flags. The N flag is set if the resultant value in the index register X has bit 7 on, otherwise N is reset. The Z bit is set if the content of the register X is 0 as a result of the operation, otherwise it is reset.</p>",
                 "tooltip": "Transfer Accumulator To Index X",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#TAX",
             };
@@ -363,7 +363,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
         case "TAY":
             return {
                 "html": "<p>This instruction moves the value of the accumulator into index register Y without affecting the accumulator.</p><p>TAY instruction only affects the Y register and does not affect either the carry or overflow flags. If the index register Y has bit 7 on, then N is set, otherwise it is reset. If the content of the index register Y equals 0 as a result of the operation, Z is set on, otherwise it is reset.</p>",
-                "tooltip": "Transfer Accumula Tor To Index Y",
+                "tooltip": "Transfer Accumulator To Index Y",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#TAY",
             };
 
@@ -390,7 +390,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "TYA":
             return {
-                "html": "<p>This instruction moves the value that is in the index register Y to accumulator A without disturbing the content of the register Y.</p><p>TYA does not affect any other register other than the accumula tor and does not affect the carry or overflow flag. If the result in the accumulator A has bit 7 on, the N flag is set, otherwise it is reset. If the resultant value in the accumulator A is 0, then the Z flag is set, otherwise it is reset.</p>",
+                "html": "<p>This instruction moves the value that is in the index register Y to accumulator A without disturbing the content of the register Y.</p><p>TYA does not affect any other register other than the accumulator and does not affect the carry or overflow flag. If the result in the accumulator A has bit 7 on, the N flag is set, otherwise it is reset. If the resultant value in the accumulator A is 0, then the Z flag is set, otherwise it is reset.</p>",
                 "tooltip": "Transfer Index Y To Accumulator",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#TYA",
             };
@@ -404,7 +404,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "SHA":
             return {
-                "html": "<p>The undocumented SHA instruction performs a bit-by-bit AND operation of the following three operands: The first two are the accumulator and the index register X.</p><p>The third operand depends on the addressing mode. In the zero page indirect Y-indexed case, the third operand is the data in memory at the given zero page address (ignoring the the addressing mode's Y offset) plus 1. In the Y-indexed absolute case, it is the upper 8 bits of the given address (ignoring the the addressing mode's Y offset), plus 1.</p><p>It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
+                "html": "<p>The undocumented SHA instruction performs a bit-by-bit AND operation of the following three operands: The first two are the accumulator and the index register X.</p><p>The third operand depends on the addressing mode. In the zero page indirect Y-indexed case, the third operand is the data in memory at the given zero page address (ignoring the addressing mode's Y offset) plus 1. In the Y-indexed absolute case, it is the upper 8 bits of the given address (ignoring the addressing mode's Y offset), plus 1.</p><p>It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
                 "tooltip": "Store Accumulator \"AND\" Index Register X \"AND\" Value",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#SHA",
             };
@@ -488,14 +488,14 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "SHX":
             return {
-                "html": "<p>The undocumented SHX instruction performs a bit-by-bit AND operation of the index register X and the upper 8 bits of the given address (ignoring the the addressing mode's Y offset), plus 1. It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
+                "html": "<p>The undocumented SHX instruction performs a bit-by-bit AND operation of the index register X and the upper 8 bits of the given address (ignoring the addressing mode's Y offset), plus 1. It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
                 "tooltip": "Store Index Register X \"AND\" Value",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#SHX",
             };
 
         case "SHY":
             return {
-                "html": "<p>The undocumented SHY instruction performs a bit-by-bit AND operation of the index register Y and the upper 8 bits of the given address (ignoring the the addressing mode's X offset), plus 1. It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
+                "html": "<p>The undocumented SHY instruction performs a bit-by-bit AND operation of the index register Y and the upper 8 bits of the given address (ignoring the addressing mode's X offset), plus 1. It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
                 "tooltip": "Store Index Register Y \"AND\" Value",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#SHY",
             };
diff --git a/lib/asm-docs/generated/asm-docs-65c816.ts b/lib/asm-docs/generated/asm-docs-65c816.ts
new file mode 100644
index 000000000..94fdb35da
--- /dev/null
+++ b/lib/asm-docs/generated/asm-docs-65c816.ts
@@ -0,0 +1,644 @@
+import {AssemblyInstructionInfo} from '../base.js';
+
+export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInfo | undefined {
+    if (!opcode) return;
+    switch (opcode.toUpperCase()) {
+        case "ADC":
+            return {
+                "html": "<p>Add Memory to Accumulator with Carry</p>",
+                "tooltip": "Add Memory to Accumulator with Carry",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ADC",
+            };
+
+        case "AND":
+            return {
+                "html": "<p>\"AND\" Memory with Accumulator</p>",
+                "tooltip": "\"AND\" Memory with Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#AND",
+            };
+
+        case "ASL":
+            return {
+                "html": "<p>Arithmetic Shift Left</p>",
+                "tooltip": "Arithmetic Shift Left",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ASL",
+            };
+
+        case "BCC":
+            return {
+                "html": "<p>Branch on Carry Clear</p>",
+                "tooltip": "Branch on Carry Clear",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BCC",
+            };
+
+        case "BCS":
+            return {
+                "html": "<p>Branch on Carry Set</p>",
+                "tooltip": "Branch on Carry Set",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BCS",
+            };
+
+        case "BEQ":
+            return {
+                "html": "<p>Branch on Result Zero</p>",
+                "tooltip": "Branch on Result Zero",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BEQ",
+            };
+
+        case "BIT":
+            return {
+                "html": "<p>Test Bits in Memory with Accumulator</p>",
+                "tooltip": "Test Bits in Memory with Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BIT",
+            };
+
+        case "BMI":
+            return {
+                "html": "<p>Branch on Result Minus</p>",
+                "tooltip": "Branch on Result Minus",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BMI",
+            };
+
+        case "BNE":
+            return {
+                "html": "<p>Branch on Result Not Zero</p>",
+                "tooltip": "Branch on Result Not Zero",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BNE",
+            };
+
+        case "BPL":
+            return {
+                "html": "<p>Branch on Result Plus</p>",
+                "tooltip": "Branch on Result Plus",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BPL",
+            };
+
+        case "BRK":
+            return {
+                "html": "<p>Break Command</p>",
+                "tooltip": "Break Command",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BRK",
+            };
+
+        case "BVC":
+            return {
+                "html": "<p>Branch on Overflow Clear</p>",
+                "tooltip": "Branch on Overflow Clear",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BVC",
+            };
+
+        case "BVS":
+            return {
+                "html": "<p>Branch on Overflow Set</p>",
+                "tooltip": "Branch on Overflow Set",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BVS",
+            };
+
+        case "CLC":
+            return {
+                "html": "<p>Clear Carry Flag</p>",
+                "tooltip": "Clear Carry Flag",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CLC",
+            };
+
+        case "CLD":
+            return {
+                "html": "<p>Clear Decimal Mode</p>",
+                "tooltip": "Clear Decimal Mode",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CLD",
+            };
+
+        case "CLI":
+            return {
+                "html": "<p>Clear Interrupt Disable</p>",
+                "tooltip": "Clear Interrupt Disable",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CLI",
+            };
+
+        case "CLV":
+            return {
+                "html": "<p>Clear Overflow Flag</p>",
+                "tooltip": "Clear Overflow Flag",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CLV",
+            };
+
+        case "CMP":
+            return {
+                "html": "<p>Compare Memory and Accumulator</p>",
+                "tooltip": "Compare Memory and Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CMP",
+            };
+
+        case "CPX":
+            return {
+                "html": "<p>Compare Index Register X To Memory</p>",
+                "tooltip": "Compare Index Register X To Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CPX",
+            };
+
+        case "CPY":
+            return {
+                "html": "<p>Compare Index Register Y To Memory</p>",
+                "tooltip": "Compare Index Register Y To Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CPY",
+            };
+
+        case "DEC":
+            return {
+                "html": "<p>Decrement Memory By One</p>",
+                "tooltip": "Decrement Memory By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#DEC",
+            };
+
+        case "DEX":
+            return {
+                "html": "<p>Decrement Index Register X By One</p>",
+                "tooltip": "Decrement Index Register X By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#DEX",
+            };
+
+        case "DEY":
+            return {
+                "html": "<p>Decrement Index Register Y By One</p>",
+                "tooltip": "Decrement Index Register Y By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#DEY",
+            };
+
+        case "EOR":
+            return {
+                "html": "<p>\"Exclusive OR\" Memory with Accumulator</p>",
+                "tooltip": "\"Exclusive OR\" Memory with Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#EOR",
+            };
+
+        case "INC":
+            return {
+                "html": "<p>Increment Memory By One</p>",
+                "tooltip": "Increment Memory By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#INC",
+            };
+
+        case "INX":
+            return {
+                "html": "<p>Increment Index Register X By One</p>",
+                "tooltip": "Increment Index Register X By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#INX",
+            };
+
+        case "INY":
+            return {
+                "html": "<p>Increment Index Register Y By One</p>",
+                "tooltip": "Increment Index Register Y By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#INY",
+            };
+
+        case "JMP":
+            return {
+                "html": "<p>JMP Indirect</p>",
+                "tooltip": "JMP Indirect",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#JMP",
+            };
+
+        case "JSR":
+            return {
+                "html": "<p>Jump To Subroutine</p>",
+                "tooltip": "Jump To Subroutine",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#JSR",
+            };
+
+        case "LDA":
+            return {
+                "html": "<p>Load Accumulator with Memory</p>",
+                "tooltip": "Load Accumulator with Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#LDA",
+            };
+
+        case "LDX":
+            return {
+                "html": "<p>Load Index Register X From Memory</p>",
+                "tooltip": "Load Index Register X From Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#LDX",
+            };
+
+        case "LDY":
+            return {
+                "html": "<p>Load Index Register Y From Memory</p>",
+                "tooltip": "Load Index Register Y From Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#LDY",
+            };
+
+        case "LSR":
+            return {
+                "html": "<p>Logical Shift Right</p>",
+                "tooltip": "Logical Shift Right",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#LSR",
+            };
+
+        case "NOP":
+            return {
+                "html": "<p>No Operation</p>",
+                "tooltip": "No Operation",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#NOP",
+            };
+
+        case "ORA":
+            return {
+                "html": "<p>\"OR\" Memory with Accumulator</p>",
+                "tooltip": "\"OR\" Memory with Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ORA",
+            };
+
+        case "PHA":
+            return {
+                "html": "<p>Push Accumulator On Stack</p>",
+                "tooltip": "Push Accumulator On Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHA",
+            };
+
+        case "PHP":
+            return {
+                "html": "<p>Push Processor Status On Stack</p>",
+                "tooltip": "Push Processor Status On Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHP",
+            };
+
+        case "PLA":
+            return {
+                "html": "<p>Pull Accumulator From Stack</p>",
+                "tooltip": "Pull Accumulator From Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLA",
+            };
+
+        case "PLP":
+            return {
+                "html": "<p>Pull Processor Status From Stack</p>",
+                "tooltip": "Pull Processor Status From Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLP",
+            };
+
+        case "ROL":
+            return {
+                "html": "<p>Rotate Left</p>",
+                "tooltip": "Rotate Left",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ROL",
+            };
+
+        case "ROR":
+            return {
+                "html": "<p>Rotate Right</p>",
+                "tooltip": "Rotate Right",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ROR",
+            };
+
+        case "RTI":
+            return {
+                "html": "<p>Return From Interrupt</p>",
+                "tooltip": "Return From Interrupt",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#RTI",
+            };
+
+        case "RTS":
+            return {
+                "html": "<p>Return From Subroutine</p>",
+                "tooltip": "Return From Subroutine",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#RTS",
+            };
+
+        case "SBC":
+            return {
+                "html": "<p>Subtract Memory from Accumulator with Borrow</p>",
+                "tooltip": "Subtract Memory from Accumulator with Borrow",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SBC",
+            };
+
+        case "SEC":
+            return {
+                "html": "<p>Set Carry Flag</p>",
+                "tooltip": "Set Carry Flag",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SEC",
+            };
+
+        case "SED":
+            return {
+                "html": "<p>Set Decimal Mode</p>",
+                "tooltip": "Set Decimal Mode",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SED",
+            };
+
+        case "SEI":
+            return {
+                "html": "<p>Set Interrupt Disable</p>",
+                "tooltip": "Set Interrupt Disable",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SEI",
+            };
+
+        case "STA":
+            return {
+                "html": "<p>Store Accumulator in Memory</p>",
+                "tooltip": "Store Accumulator in Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STA",
+            };
+
+        case "STX":
+            return {
+                "html": "<p>Store Index Register X In Memory</p>",
+                "tooltip": "Store Index Register X In Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STX",
+            };
+
+        case "STY":
+            return {
+                "html": "<p>Store Index Register Y In Memory</p>",
+                "tooltip": "Store Index Register Y In Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STY",
+            };
+
+        case "TAX":
+            return {
+                "html": "<p>Transfer Accumulator To Index X</p>",
+                "tooltip": "Transfer Accumulator To Index X",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TAX",
+            };
+
+        case "TAY":
+            return {
+                "html": "<p>Transfer Accumulator To Index Y</p>",
+                "tooltip": "Transfer Accumulator To Index Y",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TAY",
+            };
+
+        case "TSX":
+            return {
+                "html": "<p>Transfer Stack Pointer To Index X</p>",
+                "tooltip": "Transfer Stack Pointer To Index X",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TSX",
+            };
+
+        case "TXA":
+            return {
+                "html": "<p>Transfer Index X To Accumulator</p>",
+                "tooltip": "Transfer Index X To Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TXA",
+            };
+
+        case "TXS":
+            return {
+                "html": "<p>Transfer Index X To Stack Pointer</p>",
+                "tooltip": "Transfer Index X To Stack Pointer",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TXS",
+            };
+
+        case "TYA":
+            return {
+                "html": "<p>Transfer Index Y To Accumulator</p>",
+                "tooltip": "Transfer Index Y To Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TYA",
+            };
+
+        case "BRA":
+            return {
+                "html": "<p>Branch Always</p>",
+                "tooltip": "Branch Always",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BRA",
+            };
+
+        case "PHX":
+            return {
+                "html": "<p>Push Index Register X On Stack</p>",
+                "tooltip": "Push Index Register X On Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHX",
+            };
+
+        case "PHY":
+            return {
+                "html": "<p>Push Index Register Y On Stack</p>",
+                "tooltip": "Push Index Register Y On Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHY",
+            };
+
+        case "PLX":
+            return {
+                "html": "<p>Pull Index Register X From Stack</p>",
+                "tooltip": "Pull Index Register X From Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLX",
+            };
+
+        case "PLY":
+            return {
+                "html": "<p>Pull Index Register Y From Stack</p>",
+                "tooltip": "Pull Index Register Y From Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLY",
+            };
+
+        case "STZ":
+            return {
+                "html": "<p>Store Zero In Memory</p>",
+                "tooltip": "Store Zero In Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STZ",
+            };
+
+        case "TRB":
+            return {
+                "html": "<p>Test And Reset Memory Bits With Accumulator</p>",
+                "tooltip": "Test And Reset Memory Bits With Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TRB",
+            };
+
+        case "TSB":
+            return {
+                "html": "<p>Test And Set Memory Bits With Accumulator</p>",
+                "tooltip": "Test And Set Memory Bits With Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TSB",
+            };
+
+        case "BRL":
+            return {
+                "html": "<p>Branch Long</p>",
+                "tooltip": "Branch Long",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BRL",
+            };
+
+        case "COP":
+            return {
+                "html": "<p>Coprocessor</p>",
+                "tooltip": "Coprocessor",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#COP",
+            };
+
+        case "JSL":
+            return {
+                "html": "<p>Jump to Subroutine Long</p>",
+                "tooltip": "Jump to Subroutine Long",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#JSL",
+            };
+
+        case "MVN":
+            return {
+                "html": "<p>Move Memory Negative</p>",
+                "tooltip": "Move Memory Negative",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#MVN",
+            };
+
+        case "MVP":
+            return {
+                "html": "<p>Move Memory Positive</p>",
+                "tooltip": "Move Memory Positive",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#MVP",
+            };
+
+        case "PEA":
+            return {
+                "html": "<p>Push Effective Address</p>",
+                "tooltip": "Push Effective Address",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PEA",
+            };
+
+        case "PEI":
+            return {
+                "html": "<p>Push Effective Indirect Address</p>",
+                "tooltip": "Push Effective Indirect Address",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PEI",
+            };
+
+        case "PER":
+            return {
+                "html": "<p>Push Effective Relative Address</p>",
+                "tooltip": "Push Effective Relative Address",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PER",
+            };
+
+        case "PHB":
+            return {
+                "html": "<p>Push Data Bank Register</p>",
+                "tooltip": "Push Data Bank Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHB",
+            };
+
+        case "PHD":
+            return {
+                "html": "<p>Push Direct Register</p>",
+                "tooltip": "Push Direct Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHD",
+            };
+
+        case "PHK":
+            return {
+                "html": "<p>Push K Register</p>",
+                "tooltip": "Push K Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHK",
+            };
+
+        case "PLB":
+            return {
+                "html": "<p>Pull Data Bank Register</p>",
+                "tooltip": "Pull Data Bank Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLB",
+            };
+
+        case "PLD":
+            return {
+                "html": "<p>Pull Direct Register</p>",
+                "tooltip": "Pull Direct Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLD",
+            };
+
+        case "REP":
+            return {
+                "html": "<p>Reset Processor Status Bits</p>",
+                "tooltip": "Reset Processor Status Bits",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#REP",
+            };
+
+        case "RTL":
+            return {
+                "html": "<p>Return From Subroutine Long</p>",
+                "tooltip": "Return From Subroutine Long",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#RTL",
+            };
+
+        case "SEP":
+            return {
+                "html": "<p>Set Processor Status Bits</p>",
+                "tooltip": "Set Processor Status Bits",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SEP",
+            };
+
+        case "STP":
+            return {
+                "html": "<p>Stop the Clock</p>",
+                "tooltip": "Stop the Clock",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STP",
+            };
+
+        case "TCD":
+            return {
+                "html": "<p>Transfer C Accumulator to Direct Register</p>",
+                "tooltip": "Transfer C Accumulator to Direct Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TCD",
+            };
+
+        case "TCS":
+            return {
+                "html": "<p>Transfer C Accumulator to Stack Pointer</p>",
+                "tooltip": "Transfer C Accumulator to Stack Pointer",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TCS",
+            };
+
+        case "TDC":
+            return {
+                "html": "<p>Transfer Direct Register to C Accumulator</p>",
+                "tooltip": "Transfer Direct Register to C Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TDC",
+            };
+
+        case "TSC":
+            return {
+                "html": "<p>Transfer Stack Pointer to C Accumulator</p>",
+                "tooltip": "Transfer Stack Pointer to C Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TSC",
+            };
+
+        case "TXY":
+            return {
+                "html": "<p>Transfer X to Y</p>",
+                "tooltip": "Transfer X to Y",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TXY",
+            };
+
+        case "TYX":
+            return {
+                "html": "<p>Transfer Y to X</p>",
+                "tooltip": "Transfer Y to X",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TYX",
+            };
+
+        case "WAI":
+            return {
+                "html": "<p>Wait for Interrupt</p>",
+                "tooltip": "Wait for Interrupt",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#WAI",
+            };
+
+        case "WDM":
+            return {
+                "html": "<p>William D. Mensch, Jr.</p>",
+                "tooltip": "William D. Mensch, Jr.",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#WDM",
+            };
+
+        case "XBA":
+            return {
+                "html": "<p>Exchange B and A Accumulator</p>",
+                "tooltip": "Exchange B and A Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#XBA",
+            };
+
+        case "XCE":
+            return {
+                "html": "<p>Exchange Carry and Emulation Flags</p>",
+                "tooltip": "Exchange Carry and Emulation Flags",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#XCE",
+            };
+
+    }
+}
\ No newline at end of file
diff --git a/lib/asm-docs/wdc65c816.ts b/lib/asm-docs/wdc65c816.ts
new file mode 100644
index 000000000..9bfeed303
--- /dev/null
+++ b/lib/asm-docs/wdc65c816.ts
@@ -0,0 +1,35 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import {AssemblyInstructionInfo, BaseAssemblyDocumentationProvider} from './base.js';
+import {getAsmOpcode} from './generated/asm-docs-65c816.js';
+
+export class WDC65c816DocumentationProvider extends BaseAssemblyDocumentationProvider {
+    public static get key() {
+        return 'wdc65c816';
+    }
+    public override getInstructionInformation(instruction: string): AssemblyInstructionInfo | null {
+        return getAsmOpcode(instruction) || null;
+    }
+}
diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts
index 07c96d948..63b8a826a 100644
--- a/lib/base-compiler.ts
+++ b/lib/base-compiler.ts
@@ -2150,7 +2150,7 @@ export class BaseCompiler {
         }
 
         const execTriple = await RemoteExecutionQuery.guessExecutionTripleForBuildresult(buildResult);
-        if (!matchesCurrentHost(execTriple)) {
+        if (!this.compiler.emulated && !matchesCurrentHost(execTriple)) {
             if (await RemoteExecutionQuery.isPossible(execTriple)) {
                 const result = await this.runExecutableRemotely(executablePackageHash, executeParameters, execTriple);
                 return moveArtifactsIntoResult(buildResult, {
@@ -3667,7 +3667,7 @@ but nothing was dumped. Possible causes are:
         if (this.compiler.supportsMarch) return [`-march=${c_value_placeholder}`];
         if (this.compiler.supportsTargetIs) return [`--target=${c_value_placeholder}`];
         if (this.compiler.supportsTarget) return ['--target', c_value_placeholder];
-
+        if (this.compiler.supportsHyphenTarget) return ['-target', c_value_placeholder];
         return [];
     }
 
@@ -3676,7 +3676,7 @@ but nothing was dumped. Possible causes are:
         if (this.compiler.supportsMarch) all.push([`-march=${c_value_placeholder}`]);
         if (this.compiler.supportsTargetIs) all.push([`--target=${c_value_placeholder}`]);
         if (this.compiler.supportsTarget) all.push(['--target', c_value_placeholder]);
-
+        if (this.compiler.supportsHyphenTarget) all.push(['-target', c_value_placeholder]);
         return all;
     }
 
diff --git a/lib/compiler-finder.ts b/lib/compiler-finder.ts
index d40fcafaa..477f7a512 100644
--- a/lib/compiler-finder.ts
+++ b/lib/compiler-finder.ts
@@ -203,6 +203,7 @@ export class CompilerFinder {
 
         const supportsBinary = !!props('supportsBinary', true);
         const supportsBinaryObject = !!props('supportsBinaryObject', false);
+        const emulated = !!props('emulated', false);
         const interpreted = !!props('interpreted', false);
         const supportsExecute = (interpreted || supportsBinary) && !!props('supportsExecute', true);
         const executionWrapper = props('executionWrapper', '');
@@ -278,6 +279,7 @@ export class CompilerFinder {
             supportsDemangle: !!demangler,
             supportsBinary,
             supportsBinaryObject,
+            emulated,
             interpreted,
             supportsExecute,
             executionWrapper,
diff --git a/lib/compilers/_all.ts b/lib/compilers/_all.ts
index 5131a27e4..230f87529 100644
--- a/lib/compilers/_all.ts
+++ b/lib/compilers/_all.ts
@@ -109,6 +109,7 @@ export {NvccCompiler} from './nvcc.js';
 export {NvcppCompiler} from './nvcpp.js';
 export {NvrtcCompiler} from './nvrtc.js';
 export {OCamlCompiler} from './ocaml.js';
+export {ORCACompiler} from './orca.js';
 export {OSACATool} from './osaca.js';
 export {OdinCompiler} from './odin.js';
 export {OptCompiler} from './opt.js';
diff --git a/lib/compilers/argument-parsers.ts b/lib/compilers/argument-parsers.ts
index a919bdced..2e1600a44 100644
--- a/lib/compilers/argument-parsers.ts
+++ b/lib/compilers/argument-parsers.ts
@@ -1061,6 +1061,16 @@ export class WasmtimeParser extends BaseParser {
     }
 }
 
+export class ZigParser extends GCCParser {
+    static override async parse(compiler: BaseCompiler) {
+        const results = await Promise.all([ZigParser.getOptions(compiler, 'build-obj --help')]);
+        const options = Object.assign({}, ...results);
+        await GCCParser.setCompilerSettingsFromOptions(compiler, options);
+        if (GCCParser.hasSupportStartsWith(options, '-target ')) compiler.compiler.supportsHyphenTarget = true;
+        return compiler;
+    }
+}
+
 export class ZigCxxParser extends ClangParser {
     static override getMainHelpOptions(): string[] {
         return ['c++', '--help'];
diff --git a/lib/compilers/orca.ts b/lib/compilers/orca.ts
new file mode 100644
index 000000000..88698f6bc
--- /dev/null
+++ b/lib/compilers/orca.ts
@@ -0,0 +1,91 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import path from 'node:path';
+
+import {BypassCache, CacheKey, CompilationResult} from '../../types/compilation/compilation.interfaces.js';
+import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
+import {ExecutableExecutionOptions} from '../../types/execution/execution.interfaces.js';
+import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
+import {BaseCompiler} from '../base-compiler.js';
+import {CompilationEnvironment} from '../compilation-env.js';
+import {ORCAAsmParser} from '../parsers/asm-parser-orca.js';
+import * as utils from '../utils.js';
+
+export class ORCACompiler extends BaseCompiler {
+    static get key() {
+        return 'orca';
+    }
+
+    goldenGate: string;
+
+    constructor(compilerInfo: PreliminaryCompilerInfo, env: CompilationEnvironment) {
+        super(compilerInfo, env);
+        this.goldenGate = this.compilerProps<string>(`compiler.${this.compiler.id}.goldenGate`);
+        this.asm = new ORCAAsmParser(this.compilerProps);
+        this.compiler.demangler = '';
+        this.demanglerClass = null;
+    }
+
+    override getDefaultExecOptions() {
+        const execOptions = super.getDefaultExecOptions();
+        if (this.goldenGate) {
+            execOptions.env.GOLDEN_GATE = this.goldenGate;
+        }
+
+        return execOptions;
+    }
+
+    override getOutputFilename(dirPath: string, outputFilebase: string) {
+        return path.join(dirPath, `${outputFilebase}.a`);
+    }
+
+    override getSharedLibraryPathsAsArguments() {
+        return [];
+    }
+
+    override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string, userOptions?: string[]) {
+        let options: string[];
+
+        if (filters.binary) {
+            options = ['cmpl', 'keep=' + this.filename(outputFilename)];
+        } else {
+            filters.binaryObject = true;
+            options = ['compile', 'keep=' + this.filename(utils.changeExtension(outputFilename, ''))];
+        }
+
+        return options;
+    }
+
+    override async handleExecution(
+        key: CacheKey,
+        executeParameters: ExecutableExecutionOptions,
+        bypassCache: BypassCache,
+    ): Promise<CompilationResult> {
+        if (this.goldenGate) {
+            executeParameters.env.GOLDEN_GATE = this.goldenGate;
+        }
+        return super.handleExecution(key, executeParameters, bypassCache);
+    }
+}
diff --git a/lib/compilers/zig.ts b/lib/compilers/zig.ts
index ce8a04303..4370fff2f 100644
--- a/lib/compilers/zig.ts
+++ b/lib/compilers/zig.ts
@@ -33,6 +33,7 @@ import type {SelectedLibraryVersion} from '../../types/libraries/libraries.inter
 import {BaseCompiler} from '../base-compiler.js';
 import {CompilationEnvironment} from '../compilation-env.js';
 import {asSafeVer} from '../utils.js';
+import {ZigParser} from './argument-parsers.js';
 
 export class ZigCompiler extends BaseCompiler {
     private readonly self_hosted_cli: boolean;
@@ -180,6 +181,10 @@ export class ZigCompiler extends BaseCompiler {
         return userOptions.filter(option => !forbiddenOptions.test(option));
     }
 
+    protected override getArgumentParserClass() {
+        return ZigParser;
+    }
+
     override isCfgCompiler(): boolean {
         return true;
     }
diff --git a/lib/exec.ts b/lib/exec.ts
index 1afd2584e..e104c7008 100644
--- a/lib/exec.ts
+++ b/lib/exec.ts
@@ -26,6 +26,9 @@ import buffer from 'buffer';
 import child_process from 'node:child_process';
 import os from 'node:os';
 import path from 'node:path';
+// @ts-ignore
+import which from 'which';
+
 import {Stream} from 'node:stream';
 
 import fs from 'fs-extra';
@@ -35,6 +38,7 @@ import _ from 'underscore';
 import type {ExecutionOptions} from '../types/compilation/compilation.interfaces.js';
 import type {FilenameTransformFunc, UnprocessedExecResult} from '../types/execution/execution.interfaces.js';
 
+import {splitArguments} from '../shared/common-utils.js';
 import {assert, unwrap, unwrapString} from './assert.js';
 import {logger} from './logger.js';
 import {Graceful} from './node-graceful.js';
@@ -49,6 +53,8 @@ type NsJailOptions = {
 
 const execProps = propsFor('execution');
 
+let stdbufPath = null;
+
 function checkExecOptions(options: ExecutionOptions) {
     if (options.env) {
         for (const key of Object.keys(options.env)) {
@@ -68,7 +74,7 @@ function setupOnError(stream: Stream, name: string) {
     });
 }
 
-export function executeDirect(
+export async function executeDirect(
     command: string,
     args: string[],
     options: ExecutionOptions,
@@ -91,6 +97,20 @@ export function executeDirect(
         if (command.startsWith('./')) command = path.join(process.cwd(), command);
     }
 
+    if (stdbufPath == null) {
+        const unbufferStdoutExe = execProps<string>('unbufferStdoutExe', undefined); // by default 'stdout'
+        if (unbufferStdoutExe) {
+            stdbufPath = await which(unbufferStdoutExe);
+            if (!stdbufPath) logger.error(`Could not find ${unbufferStdoutExe} in PATH`);
+        }
+    }
+
+    if (stdbufPath) {
+        const stdbufArgs = splitArguments(execProps<string>('unbufferStdoutArgs', undefined)); // by default ['-o0']
+        args.unshift(...stdbufArgs, command);
+        command = stdbufPath;
+    }
+
     let okToCache = true;
     let timedOut = false;
     // In WSL; run Windows-volume executables in a temp directory.
diff --git a/lib/instructionsets.ts b/lib/instructionsets.ts
index 19e576f51..117ad6c47 100644
--- a/lib/instructionsets.ts
+++ b/lib/instructionsets.ts
@@ -131,6 +131,10 @@ export class InstructionSets {
                 target: [],
                 path: [],
             },
+            wdc65c816: {
+                target: [],
+                path: [],
+            },
             core: {
                 target: [],
                 path: [],
diff --git a/lib/objdumper/_all.ts b/lib/objdumper/_all.ts
index 347831e35..ae8681792 100644
--- a/lib/objdumper/_all.ts
+++ b/lib/objdumper/_all.ts
@@ -27,3 +27,4 @@ export {DefaultObjdumper} from './default.js';
 export {ElfToolChainObjdumper} from './elftoolchain.js';
 export {LlvmObjdumper} from './llvm.js';
 export {Da65Objdumper} from './da65.js';
+export {GoldenGateObjdumper} from './goldengate.js';
diff --git a/lib/objdumper/goldengate.ts b/lib/objdumper/goldengate.ts
new file mode 100644
index 000000000..a97664897
--- /dev/null
+++ b/lib/objdumper/goldengate.ts
@@ -0,0 +1,39 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import {BaseObjdumper} from './base.js';
+
+export class GoldenGateObjdumper extends BaseObjdumper {
+    constructor() {
+        super([], []);
+    }
+
+    override getDefaultArgs(outputFilename: string) {
+        return [outputFilename];
+    }
+
+    static override get key() {
+        return 'goldengate';
+    }
+}
diff --git a/lib/parsers/asm-parser-orca.ts b/lib/parsers/asm-parser-orca.ts
new file mode 100644
index 000000000..40e3cf708
--- /dev/null
+++ b/lib/parsers/asm-parser-orca.ts
@@ -0,0 +1,149 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import {AsmResultLabel, ParsedAsmResultLine} from '../../types/asmresult/asmresult.interfaces.js';
+import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
+import {PropertyGetter} from '../properties.interfaces.js';
+
+import {AsmParser} from './asm-parser.js';
+
+export class ORCAAsmParser extends AsmParser {
+    labelDefinitionRe: RegExp;
+    operandRe: RegExp;
+    labelInOperandRe: RegExp;
+    directiveRe: RegExp;
+    linePreCommentRe: RegExp;
+    labelOpcodeOperandRe: RegExp;
+    buggyLabelRe: RegExp;
+
+    constructor(compilerProps: PropertyGetter) {
+        super(compilerProps);
+
+        this.commentRe = /^[!*;]\s.*/;
+        this.labelDefinitionRe = /^([A-Z_a-z~][\w~]*)/;
+        this.operandRe = /^((?:[A-Z_a-z~][\w~]*)?\s+[A-Za-z]{3}\s+)([^;]+)/;
+        this.labelInOperandRe = /^[#(>|]*([A-Z_a-z~][\w~]*)/;
+        this.directiveRe =
+            /^\s+(?:align|anop|case|codechk|datachk|dynchk|eject|err|expand|ieee|instime|keep|kind|list|longa|longi|mem|merr|msb|numsex|objcase|printer|setcom|symbol|title|65c02|65816)\s+/;
+        this.linePreCommentRe = /^(.{80}[^;]*);/;
+        this.labelOpcodeOperandRe = /^((?:[A-Z_a-z~][\w~]*)?)\s+([\w~]+)\s*(.*)/;
+        this.buggyLabelRe = /^([\w~]{20,})(start|entry)$/;
+    }
+
+    extractLabels(line: string): AsmResultLabel[] | undefined {
+        let match = line.match(this.operandRe);
+        if (match) {
+            const preOperandLength = match[1].length;
+            const operand = match[2];
+
+            if (operand === 'a' || operand === 'A') {
+                return undefined;
+            }
+
+            match = operand.match(this.labelInOperandRe);
+            if (match) {
+                const labelsInLine: AsmResultLabel[] = [];
+
+                const label = match[1];
+
+                const startCol = preOperandLength + operand.indexOf(label) + 1;
+                labelsInLine.push({
+                    name: label,
+                    range: {
+                        startCol: startCol,
+                        endCol: startCol + label.length,
+                    },
+                });
+
+                return labelsInLine;
+            }
+        }
+
+        return undefined;
+    }
+
+    override processBinaryAsm(asm: string, filters: ParseFiltersAndOutputOptions) {
+        const result: ParsedAsmResultLine[] = [];
+        const asmLines = asm.split('\n');
+
+        const labelDefinitions: Record<string, number> = {};
+
+        for (let line of asmLines) {
+            let match = line.match(this.commentRe);
+            if (match) {
+                if (!filters.commentOnly) {
+                    result.push({
+                        text: line,
+                    });
+                }
+                continue;
+            }
+
+            // Insert missing spaces after long labels.
+            // These may be omitted due to a bug in Golden Gate's dumpobj.
+            match = line.match(this.buggyLabelRe);
+            if (match) {
+                line = match[1] + ' ' + match[2];
+            }
+
+            match = line.match(this.labelDefinitionRe);
+            if (match) {
+                labelDefinitions[match[1]] = result.length + 1;
+            }
+
+            if (filters.commentOnly || filters.trim) {
+                match = line.match(this.linePreCommentRe);
+                if (match) {
+                    line = match[1];
+                }
+            }
+
+            if (filters.directives) {
+                match = line.toLowerCase().match(this.directiveRe);
+                if (match) continue;
+            }
+
+            if (filters.trim) {
+                match = line.match(this.labelOpcodeOperandRe);
+                if (match) {
+                    line = match[1] + (match[1].length === 0 ? '  ' : ' ') + match[2] + ' ' + match[3];
+                }
+            }
+
+            if (result.length === 0 || (filters.trim && result[result.length - 1].text.trim() !== 'end')) {
+                if (line.trim() === '') continue;
+            }
+
+            result.push({
+                text: line.trimEnd(),
+                labels: this.extractLabels(line),
+            });
+        }
+
+        return {
+            asm: result,
+            labelDefinitions: labelDefinitions,
+        };
+    }
+}
diff --git a/package-lock.json b/package-lock.json
index c47411d21..5bb8ed481 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -100,7 +100,7 @@
         "@types/url-join": "^4.0.3",
         "@types/webpack-env": "^1.18.5",
         "@types/ws": "^8.5.13",
-        "@vitest/coverage-v8": "^2.1.4",
+        "@vitest/coverage-v8": "^2.1.9",
         "aws-sdk-client-mock": "^4.1.0",
         "cheerio": "^1.0.0",
         "css-loader": "^7.1.2",
@@ -120,7 +120,7 @@
         "terser-webpack-plugin": "^5.3.10",
         "ts-loader": "^9.5.1",
         "typescript": "~5.5",
-        "vitest": "^2.1.1",
+        "vitest": "^2.1.9",
         "webpack": "^5.96.1",
         "webpack-cli": "^5.1.4",
         "webpack-dev-middleware": "^7.4.2",
@@ -1719,6 +1719,7 @@
         "ppc64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "aix"
@@ -1735,6 +1736,7 @@
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -1751,6 +1753,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -1767,6 +1770,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -1783,6 +1787,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -1799,6 +1804,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -1815,6 +1821,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
@@ -1831,6 +1838,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
@@ -1847,6 +1855,7 @@
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1863,6 +1872,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1879,6 +1889,7 @@
         "ia32"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1895,6 +1906,7 @@
         "loong64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1911,6 +1923,7 @@
         "mips64el"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1927,6 +1940,7 @@
         "ppc64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1943,6 +1957,7 @@
         "riscv64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1959,6 +1974,7 @@
         "s390x"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1975,6 +1991,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1991,6 +2008,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "netbsd"
@@ -2022,6 +2040,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "openbsd"
@@ -2038,6 +2057,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "sunos"
@@ -2054,6 +2074,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -2070,6 +2091,7 @@
         "ia32"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -2086,6 +2108,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -2971,229 +2994,261 @@
       "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz",
-      "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz",
+      "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz",
-      "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz",
+      "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz",
-      "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz",
+      "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==",
       "cpu": [
         "arm64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz",
-      "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz",
+      "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==",
       "cpu": [
         "x64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz",
-      "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz",
+      "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz",
-      "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz",
+      "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz",
-      "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz",
+      "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz",
-      "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz",
+      "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz",
-      "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz",
+      "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz",
-      "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz",
+      "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz",
+      "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz",
-      "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz",
+      "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==",
       "cpu": [
         "ppc64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz",
-      "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz",
+      "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==",
       "cpu": [
         "riscv64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz",
-      "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz",
+      "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==",
       "cpu": [
         "s390x"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz",
-      "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz",
+      "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==",
       "cpu": [
         "x64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz",
-      "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz",
+      "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==",
       "cpu": [
         "x64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz",
-      "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz",
+      "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz",
-      "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz",
+      "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==",
       "cpu": [
         "ia32"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz",
-      "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz",
+      "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==",
       "cpu": [
         "x64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -4531,10 +4586,11 @@
       }
     },
     "node_modules/@vitest/coverage-v8": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.4.tgz",
-      "integrity": "sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz",
+      "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.3.0",
         "@bcoe/v8-coverage": "^0.2.3",
@@ -4545,7 +4601,7 @@
         "istanbul-reports": "^3.1.7",
         "magic-string": "^0.30.12",
         "magicast": "^0.3.5",
-        "std-env": "^3.7.0",
+        "std-env": "^3.8.0",
         "test-exclude": "^7.0.1",
         "tinyrainbow": "^1.2.0"
       },
@@ -4553,8 +4609,8 @@
         "url": "https://opencollective.com/vitest"
       },
       "peerDependencies": {
-        "@vitest/browser": "2.1.4",
-        "vitest": "2.1.4"
+        "@vitest/browser": "2.1.9",
+        "vitest": "2.1.9"
       },
       "peerDependenciesMeta": {
         "@vitest/browser": {
@@ -4563,13 +4619,14 @@
       }
     },
     "node_modules/@vitest/expect": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz",
-      "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz",
+      "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "2.1.4",
-        "@vitest/utils": "2.1.4",
+        "@vitest/spy": "2.1.9",
+        "@vitest/utils": "2.1.9",
         "chai": "^5.1.2",
         "tinyrainbow": "^1.2.0"
       },
@@ -4578,12 +4635,13 @@
       }
     },
     "node_modules/@vitest/mocker": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz",
-      "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz",
+      "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "2.1.4",
+        "@vitest/spy": "2.1.9",
         "estree-walker": "^3.0.3",
         "magic-string": "^0.30.12"
       },
@@ -4604,10 +4662,11 @@
       }
     },
     "node_modules/@vitest/pretty-format": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz",
-      "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz",
+      "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "tinyrainbow": "^1.2.0"
       },
@@ -4616,12 +4675,13 @@
       }
     },
     "node_modules/@vitest/runner": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz",
-      "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz",
+      "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/utils": "2.1.4",
+        "@vitest/utils": "2.1.9",
         "pathe": "^1.1.2"
       },
       "funding": {
@@ -4629,12 +4689,13 @@
       }
     },
     "node_modules/@vitest/snapshot": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz",
-      "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz",
+      "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "2.1.4",
+        "@vitest/pretty-format": "2.1.9",
         "magic-string": "^0.30.12",
         "pathe": "^1.1.2"
       },
@@ -4643,10 +4704,11 @@
       }
     },
     "node_modules/@vitest/spy": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz",
-      "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz",
+      "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "tinyspy": "^3.0.2"
       },
@@ -4655,12 +4717,13 @@
       }
     },
     "node_modules/@vitest/utils": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz",
-      "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz",
+      "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "2.1.4",
+        "@vitest/pretty-format": "2.1.9",
         "loupe": "^3.1.2",
         "tinyrainbow": "^1.2.0"
       },
@@ -5091,6 +5154,7 @@
       "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
       "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       }
@@ -5465,6 +5529,7 @@
       "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
       "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -5538,6 +5603,7 @@
       "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
       "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "assertion-error": "^2.0.1",
         "check-error": "^2.1.1",
@@ -5601,6 +5667,7 @@
       "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
       "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 16"
       }
@@ -6478,6 +6545,7 @@
       "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
       "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -6802,6 +6870,7 @@
       "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
       "dev": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "bin": {
         "esbuild": "bin/esbuild"
       },
@@ -6871,6 +6940,7 @@
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
       "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/estree": "^1.0.0"
       }
@@ -6950,6 +7020,7 @@
       "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
       "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": ">=12.0.0"
       }
@@ -9054,10 +9125,11 @@
       "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
     },
     "node_modules/loupe": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
-      "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
-      "dev": true
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+      "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lru-cache": {
       "version": "11.0.2",
@@ -9076,10 +9148,11 @@
       }
     },
     "node_modules/magic-string": {
-      "version": "0.30.12",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
-      "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+      "version": "0.30.17",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.5.0"
       }
@@ -9803,13 +9876,15 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
       "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/pathval": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
       "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 14.16"
       }
@@ -11013,10 +11088,11 @@
       "dev": true
     },
     "node_modules/rollup": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.4.tgz",
-      "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz",
+      "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/estree": "1.0.6"
       },
@@ -11028,24 +11104,25 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.24.4",
-        "@rollup/rollup-android-arm64": "4.24.4",
-        "@rollup/rollup-darwin-arm64": "4.24.4",
-        "@rollup/rollup-darwin-x64": "4.24.4",
-        "@rollup/rollup-freebsd-arm64": "4.24.4",
-        "@rollup/rollup-freebsd-x64": "4.24.4",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.24.4",
-        "@rollup/rollup-linux-arm-musleabihf": "4.24.4",
-        "@rollup/rollup-linux-arm64-gnu": "4.24.4",
-        "@rollup/rollup-linux-arm64-musl": "4.24.4",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4",
-        "@rollup/rollup-linux-riscv64-gnu": "4.24.4",
-        "@rollup/rollup-linux-s390x-gnu": "4.24.4",
-        "@rollup/rollup-linux-x64-gnu": "4.24.4",
-        "@rollup/rollup-linux-x64-musl": "4.24.4",
-        "@rollup/rollup-win32-arm64-msvc": "4.24.4",
-        "@rollup/rollup-win32-ia32-msvc": "4.24.4",
-        "@rollup/rollup-win32-x64-msvc": "4.24.4",
+        "@rollup/rollup-android-arm-eabi": "4.34.6",
+        "@rollup/rollup-android-arm64": "4.34.6",
+        "@rollup/rollup-darwin-arm64": "4.34.6",
+        "@rollup/rollup-darwin-x64": "4.34.6",
+        "@rollup/rollup-freebsd-arm64": "4.34.6",
+        "@rollup/rollup-freebsd-x64": "4.34.6",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.34.6",
+        "@rollup/rollup-linux-arm-musleabihf": "4.34.6",
+        "@rollup/rollup-linux-arm64-gnu": "4.34.6",
+        "@rollup/rollup-linux-arm64-musl": "4.34.6",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.34.6",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6",
+        "@rollup/rollup-linux-riscv64-gnu": "4.34.6",
+        "@rollup/rollup-linux-s390x-gnu": "4.34.6",
+        "@rollup/rollup-linux-x64-gnu": "4.34.6",
+        "@rollup/rollup-linux-x64-musl": "4.34.6",
+        "@rollup/rollup-win32-arm64-msvc": "4.34.6",
+        "@rollup/rollup-win32-ia32-msvc": "4.34.6",
+        "@rollup/rollup-win32-x64-msvc": "4.34.6",
         "fsevents": "~2.3.2"
       }
     },
@@ -11422,7 +11499,8 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
       "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/signal-exit": {
       "version": "3.0.7",
@@ -11615,7 +11693,8 @@
       "version": "0.0.2",
       "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
       "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/statuses": {
       "version": "2.0.1",
@@ -11626,10 +11705,11 @@
       }
     },
     "node_modules/std-env": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
-      "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==",
-      "dev": true
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
+      "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/streamx": {
       "version": "2.20.1",
@@ -12125,19 +12205,22 @@
       "version": "2.9.0",
       "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
       "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/tinyexec": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz",
-      "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==",
-      "dev": true
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+      "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/tinypool": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz",
-      "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
+      "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^18.0.0 || >=20.0.0"
       }
@@ -12147,6 +12230,7 @@
       "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
       "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=14.0.0"
       }
@@ -12156,6 +12240,7 @@
       "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
       "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=14.0.0"
       }
@@ -12992,13 +13077,15 @@
       }
     },
     "node_modules/vite-node": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz",
-      "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz",
+      "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cac": "^6.7.14",
         "debug": "^4.3.7",
+        "es-module-lexer": "^1.5.4",
         "pathe": "^1.1.2",
         "vite": "^5.0.0"
       },
@@ -13013,30 +13100,31 @@
       }
     },
     "node_modules/vitest": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz",
-      "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz",
+      "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/expect": "2.1.4",
-        "@vitest/mocker": "2.1.4",
-        "@vitest/pretty-format": "^2.1.4",
-        "@vitest/runner": "2.1.4",
-        "@vitest/snapshot": "2.1.4",
-        "@vitest/spy": "2.1.4",
-        "@vitest/utils": "2.1.4",
+        "@vitest/expect": "2.1.9",
+        "@vitest/mocker": "2.1.9",
+        "@vitest/pretty-format": "^2.1.9",
+        "@vitest/runner": "2.1.9",
+        "@vitest/snapshot": "2.1.9",
+        "@vitest/spy": "2.1.9",
+        "@vitest/utils": "2.1.9",
         "chai": "^5.1.2",
         "debug": "^4.3.7",
         "expect-type": "^1.1.0",
         "magic-string": "^0.30.12",
         "pathe": "^1.1.2",
-        "std-env": "^3.7.0",
+        "std-env": "^3.8.0",
         "tinybench": "^2.9.0",
         "tinyexec": "^0.3.1",
         "tinypool": "^1.0.1",
         "tinyrainbow": "^1.2.0",
         "vite": "^5.0.0",
-        "vite-node": "2.1.4",
+        "vite-node": "2.1.9",
         "why-is-node-running": "^2.3.0"
       },
       "bin": {
@@ -13051,8 +13139,8 @@
       "peerDependencies": {
         "@edge-runtime/vm": "*",
         "@types/node": "^18.0.0 || >=20.0.0",
-        "@vitest/browser": "2.1.4",
-        "@vitest/ui": "2.1.4",
+        "@vitest/browser": "2.1.9",
+        "@vitest/ui": "2.1.9",
         "happy-dom": "*",
         "jsdom": "*"
       },
@@ -13370,6 +13458,7 @@
       "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
       "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "siginfo": "^2.0.0",
         "stackback": "0.0.2"
diff --git a/package.json b/package.json
index 55c47ad88..206940f75 100644
--- a/package.json
+++ b/package.json
@@ -109,7 +109,7 @@
     "@types/url-join": "^4.0.3",
     "@types/webpack-env": "^1.18.5",
     "@types/ws": "^8.5.13",
-    "@vitest/coverage-v8": "^2.1.4",
+    "@vitest/coverage-v8": "^2.1.9",
     "aws-sdk-client-mock": "^4.1.0",
     "cheerio": "^1.0.0",
     "css-loader": "^7.1.2",
@@ -129,7 +129,7 @@
     "terser-webpack-plugin": "^5.3.10",
     "ts-loader": "^9.5.1",
     "typescript": "~5.5",
-    "vitest": "^2.1.1",
+    "vitest": "^2.1.9",
     "webpack": "^5.96.1",
     "webpack-cli": "^5.1.4",
     "webpack-dev-middleware": "^7.4.2",
diff --git a/static/styles/colours.scss b/static/styles/colours.scss
index 3101f8952..8dea4e5ee 100644
--- a/static/styles/colours.scss
+++ b/static/styles/colours.scss
@@ -271,21 +271,21 @@
     }
 }*/
 .pink-0 {
-    background: transparentize(#f9d8f9, 0.35);
+    background: adjust-color(#f9d8f9, $alpha: -0.35);
 }
 
 .pink-1 {
-    background: transparentize(#f7d0f7, 0.35);
+    background: adjust-color(#f7d0f7, $alpha: -0.35);
 }
 
 .pink-2 {
-    background: transparentize(#f6c7f6, 0.35);
+    background: adjust-color(#f6c7f6, $alpha: -0.35);
 }
 
 .pink-3 {
-    background: transparentize(#f4bef4, 0.35);
+    background: adjust-color(#f4bef4, $alpha: -0.35);
 }
 
 .pink-4 {
-    background: transparentize(#f3b5f3, 0.35);
+    background: adjust-color(#f3b5f3, $alpha: -0.35);
 }
diff --git a/types/compiler.interfaces.ts b/types/compiler.interfaces.ts
index 99c90189f..a5331c876 100644
--- a/types/compiler.interfaces.ts
+++ b/types/compiler.interfaces.ts
@@ -70,6 +70,7 @@ export type CompilerInfo = {
     supportsBinary?: boolean;
     supportsBinaryObject?: boolean;
     supportsIntel?: boolean;
+    emulated?: boolean;
     interpreted?: boolean;
     // (interpreted || supportsBinary) && supportsExecute
     supportsExecute?: boolean;
@@ -94,6 +95,7 @@ export type CompilerInfo = {
     supportsMarch?: boolean;
     supportsTarget?: boolean;
     supportsTargetIs?: boolean;
+    supportsHyphenTarget?: boolean;
     executionWrapper: string;
     executionWrapperArgs: string[];
     postProcess: string[];
diff --git a/types/instructionsets.ts b/types/instructionsets.ts
index 733e82671..f116a5d9e 100644
--- a/types/instructionsets.ts
+++ b/types/instructionsets.ts
@@ -59,6 +59,7 @@ export const InstructionSetsList = [
     'vax',
     'wasm32',
     'wasm64',
+    'wdc65c816',
     'xtensa',
     'z80',
 ] as const;


Test patch:
diff --git a/test/handlers/asm-docs-tests.ts b/test/handlers/asm-docs-tests.ts
index 274ae73c9..7d9318eb0 100644
--- a/test/handlers/asm-docs-tests.ts
+++ b/test/handlers/asm-docs-tests.ts
@@ -104,6 +104,14 @@ const TEST_MATRIX: Record<PropertyKey, [string, string, string, string][]> = {
         ],
     ],
     sass: [['FADD', 'FP32 Add', 'FP32 Add', 'https://docs.nvidia.com/cuda/cuda-binary-utilities/index.html#id14']],
+    wdc65c816: [
+        [
+            'jsl',
+            'Jump to Subroutine Long',
+            '<p>Jump to Subroutine Long</p>',
+            'https://www.pagetable.com/c64ref/6502/?cpu=65c816',
+        ],
+    ],
 };
 
 describe('Assembly Documentation API', () => {