Repository: felixrieseberg/windows95 Branch: master Commit: a6d57c6538da Files: 77 Total size: 476.6 KB Directory structure: gitextract_9xzxgyl3/ ├── .gitattributes ├── .github/ │ └── workflows/ │ └── build.yml ├── .gitignore ├── CREDITS.md ├── Dockerfile ├── HELP.md ├── LICENSE.md ├── README.md ├── assets/ │ ├── entitlements.plist │ └── icon.icns ├── bios/ │ └── COPYING.LESSER ├── docs/ │ ├── docker-instructions.md │ ├── docker-kubernetes-gitpod.md │ └── qemu.md ├── forge.config.js ├── issue_template.md ├── package.json ├── patches/ │ └── @electron+packager+18.3.6.patch ├── src/ │ ├── cache.ts │ ├── constants.ts │ ├── less/ │ │ ├── emulator.less │ │ ├── info.less │ │ ├── root.less │ │ ├── settings.less │ │ ├── start.less │ │ ├── status.less │ │ └── vendor/ │ │ ├── 95css.css │ │ └── LICENSE │ ├── main/ │ │ ├── about-panel.ts │ │ ├── fileserver/ │ │ │ ├── encoding.ts │ │ │ ├── fileserver.ts │ │ │ ├── hide-files.ts │ │ │ ├── page-directory-listing.ts │ │ │ └── page-error.ts │ │ ├── ipc.ts │ │ ├── logging.ts │ │ ├── main.ts │ │ ├── menu.ts │ │ ├── session.ts │ │ ├── settings.ts │ │ ├── squirrel.ts │ │ ├── update.ts │ │ └── windows.ts │ ├── renderer/ │ │ ├── app.tsx │ │ ├── card-settings.tsx │ │ ├── card-start.tsx │ │ ├── emulator-info.tsx │ │ ├── emulator.tsx │ │ ├── global.d.ts │ │ ├── lib/ │ │ │ ├── LICENSE.md │ │ │ ├── build/ │ │ │ │ └── v86.wasm │ │ │ └── libv86.js │ │ ├── start-menu.tsx │ │ ├── status.tsx │ │ └── utils/ │ │ ├── get-state-path.ts │ │ └── reset-state.ts │ └── utils/ │ ├── devmode.ts │ └── disk-image-size.ts ├── static/ │ ├── entitlements.plist │ ├── index.html │ └── www/ │ ├── apps.htm │ ├── credits.htm │ ├── help.htm │ ├── home.htm │ ├── index.htm │ └── navigation.htm ├── tools/ │ ├── add-macos-cert.sh │ ├── check-links.js │ ├── download-disk.ps1 │ ├── download-disk.sh │ ├── generateAssets.js │ ├── parcel-build.js │ ├── parcel-watch.js │ ├── resedit.js │ ├── run-bin.js │ └── tsc.js └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ text eol=lf ================================================ FILE: .github/workflows/build.yml ================================================ name: Build & Release on: push: branches: - master tags: - v* pull_request: jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v1 with: node-version: 18.x - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" - uses: actions/cache@v1 id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - name: Install run: yarn --frozen-lockfile - name: lint run: yarn lint build: needs: lint name: Build (${{ matrix.os }} - ${{ matrix.arch }}) runs-on: ${{ matrix.os }} strategy: matrix: # Build for supported platforms # https://github.com/electron/electron-packager/blob/ebcbd439ff3e0f6f92fa880ff28a8670a9bcf2ab/src/targets.js#L9 # 32-bit Linux unsupported as of 2019: https://www.electronjs.org/blog/linux-32bit-support os: [ macOS-latest, ubuntu-latest, windows-latest ] arch: [ x64, arm64 ] include: - os: windows-latest arch: ia32 - os: ubuntu-latest arch: armv7l # Publishing artifacts for multiple Windows architectures has # a bug which can cause the wrong architecture to be downloaded # for an update, so until that is fixed, only build Windows x64 exclude: - os: windows-latest arch: arm64 steps: - uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v1 with: node-version: 18.x - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" - uses: actions/cache@v1 if: matrix.os != 'macOS-latest' id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - name: Set MacOS signing certs if: matrix.os == 'macOS-latest' run: chmod +x tools/add-macos-cert.sh && ./tools/add-macos-cert.sh env: MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }} MACOS_CERT_PASSWORD: ${{ secrets.MACOS_CERT_PASSWORD }} - name: Set Windows signing certificate if: matrix.os == 'windows-latest' continue-on-error: true id: write_file uses: timheuer/base64-to-file@v1 with: fileName: 'win-certificate.pfx' encodedString: ${{ secrets.WINDOWS_CODESIGN_P12 }} - name: Download disk image (ps1) run: tools/download-disk.ps1 if: matrix.os == 'windows-latest' && startsWith(github.ref, 'refs/tags/') env: DISK_URL: ${{ secrets.DISK_URL }} - name: Download disk image (sh) run: chmod +x tools/download-disk.sh && ./tools/download-disk.sh if: matrix.os != 'windows-latest' && startsWith(github.ref, 'refs/tags/') env: DISK_URL: ${{ secrets.DISK_URL }} - name: Install run: yarn - name: Make if: startsWith(github.ref, 'refs/tags/') run: yarn make --arch=${{ matrix.arch }} env: APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} WINDOWS_CODESIGN_FILE: ${{ steps.write_file.outputs.filePath }} WINDOWS_CODESIGN_PASSWORD: ${{ secrets.WINDOWS_CODESIGN_PASSWORD }} - name: Release uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: draft: true files: | out/**/*.deb out/**/*.dmg out/**/*setup*.exe out/**/*.rpm out/**/*.zip ================================================ FILE: .gitignore ================================================ node_modules out .DS_Store /images*/ /helper-images/ dist !.github/images *.code-workspace *.pfx Microsoft.Trusted.Signing.Client* trusted-signing-metadata.json .env electron-windows-sign.log ================================================ FILE: CREDITS.md ================================================ # windows95 Credits This app was made possible by three major engineering efforts: * [v86 by Fabian Hemmer](https://github.com/copy/v86) * [Electron by the Electron Maintainers](https://electronjs.org) * Windows 95 by Microsoft # v86 License and Copyright Notice Copyright (c) 2012-2018, Fabian Hemmer All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. # Electron License and Copyright Notice Copyright (c) 2013-2018 GitHub Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: Dockerfile ================================================ # DESCRIPTION: Run Windows 95 in a container # AUTHOR: Paul DeCarlo # # Made possible through prior art by: # copy (v86 - x86 virtualization in JavaScript) # felixrieseberg (Windows95 running in electron) # Microsoft (Windows 95) # # ***Docker Run Command*** # # docker run -it \ # -v /tmp/.X11-unix:/tmp/.X11-unix \ # mount the X11 socket # -e DISPLAY=unix$DISPLAY \ # pass the display # --device /dev/snd \ # sound # --name windows95 \ # toolboc/windows95 # # ***TroubleShooting*** # If you receive Gtk-WARNING **: cannot open display: unix:0 # Run: # xhost + # FROM node:10.9-stretch LABEL maintainer "Paul DeCarlo " RUN apt update && apt install -y \ libgtk-3-0 \ libcanberra-gtk3-module \ libx11-xcb-dev \ libgconf2-dev \ libnss3 \ libasound2 \ libxtst-dev \ libxss1 \ git \ --no-install-recommends && \ rm -rf /var/lib/apt/lists/* COPY . . RUN npm install ENTRYPOINT [ "npm", "start"] ================================================ FILE: HELP.md ================================================ # Help & Commonly Asked Questions ## MS-DOS seems to mess up the screen Hit `Alt + Enter` to make the command screen "Full Screen" (as far as Windows 95 is concerned). This should restore the display from the garbled mess you see and allow you to access the Command Prompt. Press Alt-Enter again to leave Full Screen and go back to Window Mode. (Thanks to @DisplacedGamers for that wisdom) ## Windows 95 is stuck in a bad state On the app's home screen, select "Settings" in the lower menu. Then, delete your machine's state before starting it again - this time hopefully without issues. ================================================ FILE: LICENSE.md ================================================ Copyright 2019 Felix Rieseberg Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ____ v86 Source Code Copyright (c) 2012-2018, Fabian Hemmer All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. ================================================ FILE: README.md ================================================ # windows95 This is Windows 95, running in an [Electron](https://electronjs.org/) app. Yes, it's the full thing. I'm sorry. ## Downloads

Windows
32-bit 💿 Installer | 📦 Standalone Zip
64-bit 💿 Installer | 📦 Standalone Zip
ARM64 💿 Installer | 📦 Standalone Zip
❓ Don't know what kind of chip you have? It's probably `x64`. To confirm, on your computer, hit Start, enter "processor" for info.

macOS
Apple Silicon Processor 📦 Standalone Zip
Intel Processor 📦 Standalone Zip ❓ Don't know what kind of chip you have? If you bought your computer after 2020, select "Apple Silicon". Learn more at apple.com.

Linux
64-bit 💿 rpm | 💿 deb

Screenshot showing Windows 95 Screenshot showing Windows 95
## Does it work? Yes! Quite well, actually - on macOS, Windows, and Linux. Bear in mind that this is written entirely in JavaScript, so please adjust your expectations. ## Should this have been a native app? Absolutely. ## Does it run Doom (or my other favorite game)? You'll likely be better off with an actual virtualization app, but the short answer is yes. In fact, a few games are already preinstalled - and more can be found on the Internet, for instance at [archive.org](https://www.archive.org). [Thanks to @DisplacedGamers](https://youtu.be/xDXqmdFxofM) I can recommend that you switch to a resolution of 640x480 @ 256 colors before starting DOS games - just like in the good ol' days. ## Credits 99% of the work was done over at [v86](https://github.com/copy/v86/) by Copy aka Fabian Hemmer and his contributors. ## Contributing Before you can run this from source, you'll need the disk image. It's not part of the repository, but you can grab it using the `Show Disk Image` button from the packaged release, which does include the disk image. You can find that button in the `Modify C: Drive` section. Unpack the `images` folder into the `src` folder, creating this layout: ``` - /images/windows95.img - /images/default-state.bin - /assets/... - /bios/... - /docs/... ``` Once you've done so, run `npm install` and `npm start` to run your local build. If you want to tinker with the image or make a new one, check out the [QEMU docs](./docs/qemu.md). ## Other Questions * [MS-DOS seems to brick the screen](./HELP.md#ms-dos-seems-to-brick-the-screen) * [Windows 95 is stuck in a bad state](./HELP.md#windows-95-is-stuck-in-a-bad-state) * [I want to install additional apps or games](./HELP.md#i-want-to-install-additional-apps-or-games) * [Running in Docker](./docs/docker-instructions.md) * [Running in an online VM with Kubernetes and Gitpod](./docs/docker-kubernetes-gitpod.md) ## License This project is provided for educational purposes only. It is not affiliated with and has not been approved by Microsoft. ================================================ FILE: assets/entitlements.plist ================================================ com.apple.security.cs.allow-jit com.apple.security.cs.allow-unsigned-executable-memory com.apple.security.cs.disable-library-validation com.apple.security.cs.disable-executable-page-protection com.apple.security.automation.apple-events ================================================ FILE: bios/COPYING.LESSER ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ================================================ FILE: docs/docker-instructions.md ================================================ # Running windows95 in Docker ## Display using a volume mount of the host X11 Unix Socket (Linux Only): **Requirements:** * Linux OS with a running X-Server Display * [Docker](http://docker.io) docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY --device /dev/snd --name windows95 toolboc/windows95 Note: You may need to run `xhost +` on your system to allow connections to the X server running on the host. ## Display using Xming X11 Server over tcp Socket (Windows and beyond): **Requirements:** * [Xming](https://sourceforge.net/projects/xming/) * [Docker](http://docker.io) 1. Start the Xming X11 Server 2. Run the command below: docker run -e DISPLAY=host.docker.internal:0 --name windows95 toolboc/windows95 ## Display using the host XQuartz Server (MacOS Only): **Requirements:** * [XQuartz](https://www.xquartz.org/) * [Docker](http://docker.io) 1. Start XQuartz, go to `Preferences` -> `Security`, and check the box `Allow connections from network clients` 2. Restart XQuartz 3. In the terminal, run ``` xhost + ``` 4. run ``` docker run -it -e DISPLAY=host.docker.internal:0 toolboc/windows95 ``` ================================================ FILE: docs/docker-kubernetes-gitpod.md ================================================ ## Running an online version of windows95 You can also run windows95 in Electron, in a virtual X server, in a JavaScript VNC client, in a Kubernetes workspace. What could go wrong? [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/felixrieseberg/windows95) ================================================ FILE: docs/qemu.md ================================================ # QEMU Instructions The image built here was made with QEMU. In this doc, I'm keeping instructions around. Disk image creation ```sh qemu-img create -f raw windows95_v4.raw 1G ``` ISO CD image creation ```sh hdiutil makehybrid -o output.iso /path/to/folder -iso -joliet ``` Installation ```sh qemu-system-i386 \ -cdrom Win95_OSR25.iso \ -m 128 \ -hda windows95.img \ -device sb16 \ -nic user,model=ne2k_pci \ -fda Win95_boot.img \ -boot a \ -M pc,acpi=off \ -cpu pentium ``` - Boot from floppy - Run `fdisk` and `format c:` - Run `D:\setup.exe` with `24796-OEM-0014736-66386` - After completing setup and restarting your computer, you might get an IOS Windows protection error - Use `fix95cpu.ima` as a bootable floppy to fix - Use `vga-driver.iso` to install different video driver ```sh qemu-system-i386 \ -m 128 \ -hda images/windows95.img \ -device sb16 \ -M pc,acpi=off \ -cpu pentium \ -netdev user,id=mynet0 \ -device ne2k_isa,netdev=mynet0,irq=10 ``` ================================================ FILE: forge.config.js ================================================ const path = require('path'); const fs = require('fs'); const package = require('./package.json'); require('dotenv').config() process.env.TEMP = process.env.TMP = `C:\\Users\\FelixRieseberg\\AppData\\Local\\Temp` const FLAGS = { SIGNTOOL_PATH: process.env.SIGNTOOL_PATH, AZURE_CODE_SIGNING_DLIB: process.env.AZURE_CODE_SIGNING_DLIB || path.join(__dirname, 'Microsoft.Trusted.Signing.Client.1.0.60/bin/x64/Azure.CodeSigning.Dlib.dll'), AZURE_METADATA_JSON: process.env.AZURE_METADATA_JSON || path.resolve(__dirname, 'trusted-signing-metadata.json'), AZURE_TENANT_ID: process.env.AZURE_TENANT_ID, AZURE_CLIENT_ID: process.env.AZURE_CLIENT_ID, AZURE_CLIENT_SECRET: process.env.AZURE_CLIENT_SECRET, APPLE_ID: process.env.APPLE_ID, APPLE_ID_PASSWORD: process.env.APPLE_ID_PASSWORD, } fs.writeFileSync(FLAGS.AZURE_METADATA_JSON, JSON.stringify({ Endpoint: process.env.AZURE_CODE_SIGNING_ENDPOINT || "https://wcus.codesigning.azure.net", CodeSigningAccountName: process.env.AZURE_CODE_SIGNING_ACCOUNT_NAME, CertificateProfileName: process.env.AZURE_CODE_SIGNING_CERTIFICATE_PROFILE_NAME, }, null, 2)); const windowsSign = { signToolPath: FLAGS.SIGNTOOL_PATH, signWithParams: `/v /dlib ${FLAGS.AZURE_CODE_SIGNING_DLIB} /dmdf ${FLAGS.AZURE_METADATA_JSON}`, timestampServer: "http://timestamp.acs.microsoft.com", hashes: ["sha256"], } module.exports = { hooks: { generateAssets: require('./tools/generateAssets'), }, packagerConfig: { asar: false, icon: path.resolve(__dirname, 'assets', 'icon'), appBundleId: 'com.felixrieseberg.windows95', appCategoryType: 'public.app-category.developer-tools', win32metadata: { CompanyName: 'Felix Rieseberg', OriginalFilename: 'windows95' }, osxSign: { identity: 'Developer ID Application: Felix Rieseberg (LT94ZKYDCJ)', }, osxNotarize: { appleId: FLAGS.APPLE_ID, appleIdPassword: FLAGS.APPLE_ID_PASSWORD, teamId: 'LT94ZKYDCJ' }, windowsSign, ignore: [ /\/assets(\/?)/, /\/docs(\/?)/, /\/tools(\/?)/, /\/src\/.*\.ts/, /\/test(\/?)/, /\/@types(\/?)/, /\/helper-images(\/?)/, /package-lock\.json/, /README\.md/, /tsconfig\.json/, /Dockerfile/, /issue_template\.md/, /HELP\.md/, /forge\.config\.js/, /\.github(\/?)/, /\.circleci(\/?)/, /\.vscode(\/?)/, /\.gitignore/, /\.gitattributes/, /\.eslintignore/, /\.eslintrc/, /\.prettierrc/, /\/Microsoft\.Trusted\.Signing\.Client.*/, /\/trusted-signing-metadata/, ] }, makers: [ { name: '@electron-forge/maker-squirrel', platforms: ['win32'], config: (arch) => { return { name: 'windows95', authors: 'Felix Rieseberg', exe: 'windows95.exe', noMsi: true, remoteReleases: '', iconUrl: 'https://raw.githubusercontent.com/felixrieseberg/windows95/master/assets/icon.ico', loadingGif: './assets/boot.gif', setupExe: `windows95-${package.version}-setup-${arch}.exe`, setupIcon: path.resolve(__dirname, 'assets', 'icon.ico'), windowsSign } } }, { name: '@electron-forge/maker-zip', platforms: ['darwin', 'win32'] }, { name: '@electron-forge/maker-deb', platforms: ['linux'] }, { name: '@electron-forge/maker-rpm', platforms: ['linux'] } ] }; ================================================ FILE: issue_template.md ================================================ ⚠️ Thank you for reporting an issue! Before we go any further, understand that I probably won't be able to fullfil feature requests. Feel free to report what feature you'd love to see, just don't get angry when I don't have time to implement it 🙇‍♂️ I will however _gladly_ help you make a pull request if you're willing to play with Javascript! ================================================ FILE: package.json ================================================ { "name": "windows95", "productName": "windows95", "version": "4.0.0", "description": "Windows 95, in an app. I'm sorry.", "main": "./dist/src/main/main.js", "scripts": { "start": "rimraf ./dist && electron-forge start", "package": "electron-forge package", "make": "electron-forge make", "publish": "electron-forge publish", "lint": "prettier --write src/**/*.{ts,tsx} && npm run check-links", "less": "node ./tools/lessc.js", "tsc": "tsc -p tsconfig.json --noEmit", "check-links": "node tools/check-links.js", "postinstall": "patch-package" }, "keywords": [], "author": "Felix Rieseberg, felix@felixrieseberg.com", "license": "MIT", "config": { "forge": "./forge.config.js" }, "dependencies": { "electron-squirrel-startup": "^1.0.1", "react": "^17.0.1", "react-dom": "^17.0.1", "update-electron-app": "^2.0.1" }, "devDependencies": { "@electron-forge/cli": "7.6.1", "@electron-forge/maker-deb": "7.6.1", "@electron-forge/maker-flatpak": "^7.6.1", "@electron-forge/maker-rpm": "^7.6.1", "@electron-forge/maker-squirrel": "^7.6.1", "@electron-forge/maker-zip": "^7.6.1", "@electron-forge/publisher-github": "^7.6.1", "@types/node": "^20", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", "dotenv": "^16.4.7", "electron": "34.2.0", "less": "^3.13.0", "parcel-bundler": "^1.12.5", "patch-package": "^8.0.0", "prettier": "^3.5.1", "rimraf": "^6.0.1", "typescript": "^5.7.3" } } ================================================ FILE: patches/@electron+packager+18.3.6.patch ================================================ diff --git a/node_modules/@electron/packager/dist/win32.js b/node_modules/@electron/packager/dist/win32.js index 5399b3e..f3b6e88 100644 --- a/node_modules/@electron/packager/dist/win32.js +++ b/node_modules/@electron/packager/dist/win32.js @@ -57,7 +57,26 @@ class WindowsApp extends platform_1.App { resOpts.iconPath = icon; } (0, common_1.debug)(`Running resedit with the options ${JSON.stringify(resOpts)}`); - await (0, resedit_1.resedit)(this.electronBinaryPath, resOpts); + + // This causes segmentation faults for me on multiple machines + // It's unclear why exactly but this spawn hack fixes it + // await (0, resedit_1.resedit)(this.electronBinaryPath, resOpts); + + const { spawnSync } = require('child_process'); + const resEditProcess = spawnSync('node', [ + 'C:\\Users\\FelixRieseberg\\Code\\windows95\\tools\\resedit.js', + this.electronBinaryPath + ], { + stdio: 'inherit' + }); + + if (resEditProcess.error) { + throw resEditProcess.error; + } + + if (resEditProcess.status !== 0) { + throw new Error(`Resedit process exited with code ${resEditProcess.status}`); + } } async signAppIfSpecified() { const windowsSignOpt = this.opts.windowsSign; ================================================ FILE: src/cache.ts ================================================ import { session } from "electron"; export async function clearCaches() { await clearCache(); await clearStorageData(); } export async function clearCache() { if (session.defaultSession) { await session.defaultSession.clearCache(); } } export async function clearStorageData() { if (!session.defaultSession) { return; } await session.defaultSession.clearStorageData({ storages: [ "appcache", "cookies", "filesystem", "indexdb", "localstorage", "shadercache", "websql", "serviceworkers", ], quotas: ["temporary", "persistent", "syncable"], }); } ================================================ FILE: src/constants.ts ================================================ import * as path from "path"; const IMAGES_PATH = path.join(__dirname, "../../images"); export const CONSTANTS = { IMAGES_PATH, IMAGE_PATH: path.join(IMAGES_PATH, "windows95.img"), IMAGE_DEFAULT_SIZE: 1073741824, // 1GB DEFAULT_STATE_PATH: path.join(IMAGES_PATH, "default-state.bin"), }; export const IPC_COMMANDS = { TOGGLE_INFO: "TOGGLE_INFO", SHOW_DISK_IMAGE: "SHOW_DISK_IMAGE", ZOOM_IN: "ZOOM_IN", ZOOM_OUT: "ZOOM_OUT", ZOOM_RESET: "ZOOM_RESET", // Machine instructions MACHINE_START: "MACHINE_START", MACHINE_RESTART: "MACHINE_RESTART", MACHINE_STOP: "MACHINE_STOP", MACHINE_RESET: "MACHINE_RESET", MACHINE_ALT_F4: "MACHINE_ALT_F4", MACHINE_ESC: "MACHINE_ESC", MACHINE_ALT_ENTER: "MACHINE_ALT_ENTER", MACHINE_CTRL_ALT_DEL: "MACHINE_CTRL_ALT_DEL", // Machine events MACHINE_STARTED: "MACHINE_STARTED", MACHINE_STOPPED: "MACHINE_STOPPED", // Else APP_QUIT: "APP_QUIT", GET_STATE_PATH: "GET_STATE_PATH", }; ================================================ FILE: src/less/emulator.less ================================================ #emulator { height: 100vh; width: 100vw; display: flex; > div { white-space: pre; font: 14px monospace; line-height: 14px } > canvas { display: none; margin: auto; } } .paused { canvas { opacity: 0.2; filter: blur(2px); z-index: -100; } #emulator-text-screen { display: none; visibility: hidden; } } ================================================ FILE: src/less/info.less ================================================ #information { text-align: center; position: absolute; width: 100vw; bottom: 50px; font-size: 18px; } ================================================ FILE: src/less/root.less ================================================ @import "./status.less"; @import "./emulator.less"; @import "./info.less"; @import "./settings.less"; @import "./start.less"; /* GENERAL RESETS */ html, body { margin: 0; padding: 0; } body { background: #000; } body.paused > #emulator { display: none; } body.paused { background: #008080; font-family: Courier; } #buttons { user-select: none; } section { display: flex; position: absolute; width: 100vw; height: 100vh; align-items: center; justify-content: center; } .card { width: 75%; max-width: 700px; min-width: 400px; .card-title { img { margin-right: 5px; } } } .nav-link > img, .btn > img { height: 24px; margin-right: 4px; } .windows95 { * { user-select: none; } *:focus { outline: none; } nav .nav-link, nav .nav-logo { height: 37px; display: flex; } nav .nav-logo img { margin-left: 2px; max-height: 20px; } nav .nav-logo > span { position: absolute; top: 9px; left: 37px; font-weight: bold; } .btn { height: 40px; padding-top: 3px; } .btn:focus { border-color: #fff #000 #000 #fff; outline: 5px auto -webkit-focus-ring-color; } .btn.active:before, .btn:focus:before, button.active:before, button:focus:before, input[type=submit].active:before, input[type=submit]:focus:before { border-color: #dedede grey grey #dedede; } .card { // Fix link colors .link, .link:active, .link:link, .link:visited, a, a:active, a:link, a:visited { color: #008080; text-decoration: underline; cursor: pointer; } // Ensure a-elements in fieldsets receive click events fieldset:before { pointer-events: none; } } } ================================================ FILE: src/less/settings.less ================================================ #floppy-path { font-size: .6rem; width: 100%; height: 30px; padding-left: 8px; border-color: #000 #fff #fff #000; border-style: solid; border-width: 2px; background-color: #c3c3c3; line-height: 27px; } #file-input { display: none; } .settings { legend > img { margin-right: 5px; } } ================================================ FILE: src/less/start.less ================================================ #section-start { display: flex; flex-direction: column; > small { margin-top: 25px; font-size: .8rem; } } ================================================ FILE: src/less/status.less ================================================ #status { user-select: none; position: absolute; z-index: 100; left: calc(50vw - 110px); background: white; font-size: 10px; padding-bottom: 3px; border-bottom-left-radius: 15px; border-bottom-right-radius: 15px; overflow: hidden; padding-left: 10px; padding-right: 10px; max-height: 18px; top: 0; } ================================================ FILE: src/less/vendor/95css.css ================================================ *,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,:after,:before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.333333%;max-width:8.333333%}.col-2{flex:0 0 16.666667%;max-width:16.666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.333333%;max-width:33.333333%}.col-5{flex:0 0 41.666667%;max-width:41.666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.333333%;max-width:58.333333%}.col-8{flex:0 0 66.666667%;max-width:66.666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.333333%;max-width:83.333333%}.col-11{flex:0 0 91.666667%;max-width:91.666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}@font-face{font-family:windows;src:url(windows.woff2) format("woff2"),url(windows.woff) format("woff")}body{font-family:windows,monospace;font-size:.8rem;line-height:1.7;padding:60px 0;color:#000;background-color:#008483}code,mark{background-color:#c3c3c3}code{padding:2px 4px;font-family:windows}.btn,button,input[type=submit]{font-size:.8rem;position:relative;display:inline-block;width:auto;height:30px;padding:2px 15px;border-color:#fff #000 #000 #fff;border-style:solid;border-width:2px;background-color:#c3c3c3}.btn:before,button:before,input[type=submit]:before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;content:"";border-color:#dedede grey grey #dedede;border-style:solid;border-width:2px}.btn.active,.btn:focus,button.active,button:focus,input[type=submit].active,input[type=submit]:focus{border-color:#000 #fff #fff #000;outline:none}.btn.active:before,.btn:focus:before,button.active:before,button:focus:before,input[type=submit].active:before,input[type=submit]:focus:before{border-color:grey #dedede #dedede grey}.btn.disabled,button.disabled,input[type=submit].disabled{background-color:#c3c3c3}.input,input,select,textarea{font-size:.6rem;width:100%;height:30px;padding-left:8px;border-color:#000 #fff #fff #000;border-style:solid;border-width:2px;background-color:#fff}.input:focus,input:focus,select:focus,textarea:focus{outline:none}.disabled.input,.input:disabled,input.disabled,input:disabled,select.disabled,select:disabled,textarea.disabled,textarea:disabled{background-color:#c3c3c3}textarea{min-height:150px}select{padding:2px 32px 2px 4px;border-radius:0;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO8AAADvCAYAAAAacIO5AAAAAXNSR0IArs4c6QAACaVJREFUeAHt3LFuU9sSBmDn3hshISGQQBRISFBR0tCmoOVZ6KGgCEhIUNFQ8hy8AHkQHoACCmi52Uc60vGRjeNktmftmc8SRRJ7Zs03+/d2YXH0+/yx8iBAYFECr1+/Xv1nUSd2WAIEVlNwT09Phde1QGBJAn8HdzqzO++SNuesrQX+GdwJQnhbXw6GX4rAv4M7nVt4l7I952wrsCm4E4bwtr0kDL4EgW3Bnc4uvEvYoDO2FPhTcCcQ4W15WRh6dIFdwZ3OL7yjb9H52glcJLgTivC2uzQMPLLARYM7zSC8I2/S2VoJ7BPcCUZ4W10ehh1VYN/gTnMI76jbdK42ApcJ7oQjvG0uEYOOKHDZ4E6zCO+IG3WmFgJXCe4EJLwtLhNDjiZw1eBO8wjvaFt1nvICEcGdkI6i/ieNs7Oz8ugGJBAhcHJyElHGnTdEURECCQI+Niega0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIEhDdCUQ0CCQLCm4CuJYEIAeGNUFSDQIKA8Caga0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIEhDdCUQ0CCQLCm4CuJYEIAeGNUFSDQIKA8Caga0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIEhDdCUQ0CCQLCm4CuJYEIAeGNUFSDQIKA8Caga0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIEhDdCUQ0CCQLCm4CuJYEIAeGNUFSDQIKA8Caga0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIEhDdCUQ0CCQLCm4CuJYEIAeGNUFSDQIKA8Caga0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIEhDdCUQ0CCQLCm4CuJYEIAeGNUFSDQIKA8Caga0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIEhDdCUQ0CCQLCm4CuJYEIAeGNUFSDQIKA8Caga0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIEhDdCUQ0CCQLCm4CuJYEIAeGNUFSDQIKA8Caga0kgQkB4IxTVIJAgILwJ6FoSiBAQ3ghFNQgkCAhvArqWBCIE/hdRZCk1Tk5OlnJU57yCwJcvX67w6uW81J13ObtyUgJrAsK7xuEHAssREN7l7MpJCawJCO8ahx8ILEdAeJezKyclsCYgvGscfiCwHAHhXc6unJTAmoDwrnH4gcByBIR3ObtyUgJrAsK7xuEHAssREN7l7MpJCawJtPpu8+fPn9eGv8gPHz9+XF3mdRep7Tl/Fnj27Nnq+fPnf35S47+2Cu+NGzf2XvXx8fHer/GCGIHJ/jI7i+k+fhUfm8ffkRMS2CggvBtZ/JLA+ALCO/6OnJDARgHh3cjilwTGFxDe8XfkhAQ2CgjvRha/JDC+gPCOvyMnJLBRQHg3svglgfEFhHf8HTkhgY0CwruRxS8JjC9w9Pv8EXHMs7OziDLD1fj+/fvq169fe53r69evqxcvXuz1mupPfv/+/erBgwd7jXn9+vXVrVu39nrNEp4c9f+Ht/pu82UWO108+15A+4b9Muda2mvu3r27unfv3tKOPfR5fWweej0OR2C7gPBut/EXAkMLCO/Q63E4AtsFhHe7jb8QGFpAeIdej8MR2C4gvNtt/IXA0ALCO/R6HI7AdgHh3W7jLwSGFhDeodfjcAS2Cwjvdht/ITC0gK9HzrCe+/fvrz59+rSz8rdv31YvX77c+byRn/Du3bvVnTt3dh5xMvGIFRDeWM+/ql27dm316NGjnZUr/J/EDx8+9J3lnZue5wk+Ns/jqiqB2QWEd3ZiDQjMIyC887iqSmB2AeGdnVgDAvMICO88rqoSmF1AeGcn1oDAPALCO4+rqgRmFxDe2Yk1IDCPgPDO46oqgdkFhHd2Yg0IzCPg65HzuF6o6u3bt1cfPnzY+dyfP3+uXr16tfN5kU94+/btavp/k3c9phk8cgSEN8f9r67Td6CfPHmy8wQ/fvzY+ZzoJzx+/Hh18+bN6LLqBQr42ByIqRSBQwoI7yG19SIQKCC8gZhKETikgPAeUlsvAoECwhuIqRSBQwoI7yG19SIQKCC8gZhKETikgPAeUlsvAoECwhuIqRSBQwoI7yG19SIQKODrkYGYc5WavmP85s2bucpvrHuR7zVvfKFfHkxAeA9GfflGx8fHq6dPn16+gFeWFPCxueRaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMJQWEt+RaDdVBQHg7bNmMNQV+BzxOT09/n+v4x8A1cMhr4KrZFVxvWt64k66Bq4RXcJOWdsh3d73G/TRx2fAKruC64yZfA5cJr+AmL83dcNy74SF3s294BVdw3XEHuQb2Ca/gDrK0Q7676zXuXf6i4RVcwXXHHewauEh4BXewpbkbjns3PORudoVXcAXXHXfQa+BP4RXcQZd2yHd3vca9y28Lr+AKrjvu4NfApvAK7uBLczcc9254yN38O7yCK7juuAu5Bv4ZXsFdyNIO+e6u17h3+b/DK7iC6467sGtgCq/gLmxp7obj3g0PuJv/Hh0dnWf39PxN14MAgSUJ/B9DhDGbr5D4RQAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:100%;background-size:26px;-webkit-appearance:none}fieldset{position:relative;margin-bottom:20px;padding:10px;border-color:grey #fff #fff grey;background-color:#c3c3c3}fieldset,fieldset:before{border-style:solid;border-width:2px}fieldset:before{position:absolute;top:11px;right:0;bottom:0;left:0;display:block;content:"";border-color:#dedede grey grey #dedede}legend{font-size:.9rem;font-weight:700;position:relative;display:inline-block;width:auto;padding:0 3px;background-color:#c3c3c3}.input-field{margin-bottom:20px}.link,.link:active,.link:hover,.link:link,.link:visited,a,a:active,a:hover,a:link,a:visited{color:#c3c3c3}::-webkit-scrollbar{width:20px;background-image:url(bg-pattern.png);background-size:20px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{position:relative;border-color:#fff #000 #000 #fff;border-style:solid;border-width:2px;background:#c3c3c3;background-color:#c3c3c3}::-webkit-scrollbar-thumb:before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;content:"";border-color:#dedede grey grey #dedede;border-style:solid;border-width:2px}.card,.modal-dialog{position:relative;border-color:#fff #000 #000 #fff;border-style:solid;border-width:2px;background-color:#c3c3c3}.card:before,.modal-dialog:before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;content:"";pointer-events:none;border-color:#dedede grey grey #dedede;border-style:solid;border-width:2px}.card-header,.modal-header{width:calc(100% - 4px);margin:2px;padding:4px 10px 6px;color:#fff;background-color:#0f0086}.card-title,.modal-title{font-size:1rem;display:block;margin:0}.card-body,.modal-body{margin:10px}.modal{display:none}.modal.is-open{position:fixed;top:0;right:0;bottom:0;left:0;display:block;width:100vw;height:100vh}.modal-bg{position:relative;width:100%;height:100%;background-color:rgba(0,0,0,.5)}.modal-dialog{position:absolute;top:50%;right:0;left:0;width:100%;max-width:600px;margin:0 auto;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.modal-header{position:relative}.modal-close{position:absolute;top:5px;right:4px;height:24px;padding:0 4px}.has-bottom-nav{padding-bottom:80px}.has-top-nav{padding-top:80px}.nav{position:relative;display:flex;margin-bottom:40px;padding:4px;border-bottom:2px solid #fff;background-color:#c3c3c3;box-shadow:0 2px 2px rgba(0,0,0,.2);justify-content:space-between;align-items:center}.nav:before{position:absolute;bottom:0;left:0;display:block;width:100%;height:2px;content:"";background-color:#dedede}.nav.nav-bottom,.nav.nav-top{position:fixed;z-index:20;width:100%;margin:0}.nav.nav-top{top:0}.nav.nav-bottom{bottom:0;border-top:2px solid #fff;border-bottom:none;box-shadow:0 -2px 2px rgba(0,0,0,.2)}.nav.nav-bottom:before{top:0;bottom:unset}.nav-logo,.nav-logo:active,.nav-logo:hover,.nav-logo:link,.nav-logo:visited{display:inline-block;min-width:150px;height:40px;margin-right:4px;padding:2px 20px 2px 2px;color:#000;border-color:#fff #000 #000 #fff;border-style:solid;border-width:2px;background-color:#c3c3c3}.nav-logo:active:before,.nav-logo:before,.nav-logo:hover:before,.nav-logo:link:before,.nav-logo:visited:before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;content:"";border-color:#dedede grey grey #dedede;border-style:solid;border-width:2px}.nav-logo:active img,.nav-logo:hover img,.nav-logo:link img,.nav-logo:visited img,.nav-logo img{max-height:32px}.nav-menu-btn{display:block;height:40px}@media screen and (min-width:768px){.nav-menu-btn{display:none}}.nav-menu{position:absolute;bottom:100%;left:0;display:none;width:100%;color:#000;border-color:#fff #000 #000 #fff;border-style:solid;border-width:2px;background-color:#c3c3c3;flex-flow:column}.nav-menu.active{display:flex}.nav-menu:before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;content:"";border-color:#dedede grey grey #dedede;border-style:solid;border-width:2px}@media screen and (min-width:768px){.nav-menu{position:relative;display:flex;border:none;flex-flow:row}.nav-menu:before{content:none}}.nav-link,.nav-link:active,.nav-link:hover,.nav-link:link,.nav-link:visited{line-height:2;position:relative;display:block;height:40px;margin:0 2px;padding:4px 40px 4px 10px;color:#000}.nav-link:active:hover,.nav-link:hover,.nav-link:hover:hover,.nav-link:link:hover,.nav-link:visited:hover{color:#fff;background-color:#0f0086}@media screen and (min-width:768px){.nav-link:active:hover,.nav-link:hover,.nav-link:hover:hover,.nav-link:link:hover,.nav-link:visited:hover{color:#000;background-color:#c3c3c3}}@media screen and (min-width:768px){.nav-link,.nav-link:active,.nav-link:hover,.nav-link:link,.nav-link:visited{border-color:#fff #000 #000 #fff;border-style:solid;border-width:2px;background-color:#c3c3c3}.nav-link:active:before,.nav-link:before,.nav-link:hover:before,.nav-link:link:before,.nav-link:visited:before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;content:"";border-color:#dedede grey grey #dedede;border-style:solid;border-width:2px}.nav-link.active,.nav-link:active.active,.nav-link:hover.active,.nav-link:link.active,.nav-link:visited.active{border-color:#000 #fff #fff #000;background-image:url(bg-pattern.png)}.nav-link.active:before,.nav-link:active.active:before,.nav-link:hover.active:before,.nav-link:link.active:before,.nav-link:visited.active:before{border-color:grey #dedede #dedede grey}} ================================================ FILE: src/less/vendor/LICENSE ================================================ MIT License Copyright (c) 2019 Yoshi Mannaert Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: src/main/about-panel.ts ================================================ import { AboutPanelOptionsOptions, app } from "electron"; /** * Sets Fiddle's About panel options on Linux and macOS * * @returns */ export function setupAboutPanel(): void { if (process.platform === "win32") return; const options: AboutPanelOptionsOptions = { applicationName: "windows95", applicationVersion: app.getVersion(), version: process.versions.electron, copyright: "Felix Rieseberg", }; switch (process.platform) { case "linux": options.website = "https://github.com/felixrieseberg/windows95"; case "darwin": options.credits = "https://github.com/felixrieseberg/windows95"; default: // fallthrough } app.setAboutPanelOptions(options); } ================================================ FILE: src/main/fileserver/encoding.ts ================================================ export function encode(text: string) { // Convert to windows-1252 compatible string by removing unsupported chars let result = text.replaceAll(/[^\x00-\xFF]/g, ''); // If result would be empty, return original if (!result.trim()) { return text; } return result; } export function getEncoding() { return ``; } ================================================ FILE: src/main/fileserver/fileserver.ts ================================================ import { protocol, net } from 'electron'; import * as fs from 'fs'; import * as path from 'path'; import { generateDirectoryListing } from './page-directory-listing'; import { generateErrorPage } from './page-error'; import { log } from '../logging'; export interface FileEntry { name: string; fullPath: string; stats: fs.Stats; } export const APP_INTERCEPT = 'http://windows95/'; export const MY_COMPUTER_INTERCEPT = 'http://my-computer/'; const interceptedUrls = [ MY_COMPUTER_INTERCEPT, APP_INTERCEPT ]; export function setupFileServer() { // Register protocol handler for our custom schema protocol.handle('http', async (request) => { if (!interceptedUrls.some(url => request.url.startsWith(url))) { return fetch(request.url, { headers: request.headers, method: request.method, body: request.body, }); } try { const { fullPath, decodedPath } = getFilePath(request.url); log(`FileServer: Handling request for ${request.url}`, { fullPath, decodedPath }); // Check if path exists if (!fs.existsSync(fullPath)) { return new Response(generateErrorPage( 'File or Directory Not Found', decodedPath ), { status: 404, headers: { 'Content-Type': 'text/html' } }); } // Check if it's a directory const stats = await fs.promises.stat(fullPath); if (stats.isDirectory()) { // If we're in an app-intercept, check if there's an index.htm file in the directory if (request.url.startsWith(APP_INTERCEPT)) { const indexHtmlPath = path.join(fullPath, 'index.htm'); if (fs.existsSync(indexHtmlPath)) { return serveFile(indexHtmlPath); } } // Generate directory listing const files = await fs.promises.readdir(fullPath); const listing = generateDirectoryListing(fullPath, files); return new Response(listing, { status: 200, headers: { 'Content-Type': 'text/html' } }); } else { try { return await serveFile(fullPath); } catch (error) { // Handle specific file read errors if (error.code === 'EACCES') { return new Response(generateErrorPage( 'Access Denied', 'You do not have permission to access this file' ), { status: 403, headers: { 'Content-Type': 'text/html' } }); } // Re-throw other errors to be caught by outer try-catch throw error; } } } catch (error) { const errorPage = generateErrorPage( 'Internal Server Error', `An error occurred while processing your request: ${error.message}` ); return new Response(errorPage, { status: 500, headers: { 'Content-Type': 'text/html' } }); } }); } function getFilePath(url: string) { let urlPath: string; let fullPath: string; let decodedPath: string; if (url.startsWith(APP_INTERCEPT)) { fullPath = path.resolve(__dirname, '../../../static/www', url.replace(APP_INTERCEPT, '')); decodedPath = '.'; } else if (url.startsWith(MY_COMPUTER_INTERCEPT)) { urlPath = url.replace(MY_COMPUTER_INTERCEPT, ''); decodedPath = decodeURIComponent(urlPath); fullPath = path.join('/', decodedPath); } else { throw new Error('Invalid URL'); } return { fullPath, decodedPath }; } async function serveFile(fullPath: string): Promise { const fileData = await fs.promises.readFile(fullPath); // Determine content type based on file extension const ext = path.extname(fullPath).toLowerCase(); let contentType = 'application/octet-stream'; // Common content types const contentTypes: Record = { '.htm': 'text/html', '.html': 'text/html', '.txt': 'text/plain', '.css': 'text/css', '.js': 'text/javascript', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.png': 'image/png', '.gif': 'image/gif' }; if (ext in contentTypes) { contentType = contentTypes[ext]; } return new Response(fileData, { status: 200, headers: { 'Content-Type': contentType } }); } ================================================ FILE: src/main/fileserver/hide-files.ts ================================================ import { Stats } from "fs"; import { settings } from "../settings"; import { FileEntry } from "./fileserver"; const FILES_TO_HIDE_ON_DARWIN: string[] = [ '.DS_Store', '.localized', '.Trashes', '.fseventsd', '.Spotlight-V100', '.file', '.hotfiles.btree', '.DocumentRevisions-V100', '.TemporaryItems', '.file (resource fork files)', '.VolumeIcon.icns', ]; const FILES_TO_HIDE_ON_WINDOWS: string[] = [ 'desktop.ini', 'Thumbs.db', 'ehthumbs.db', 'ehthumbs.db-shm', 'ehthumbs.db-wal', ]; const FILES_TO_HIDE_ON_LINUX: string[] = []; export function shouldHideFile(file: FileEntry) { if (isHiddenFile(file) && !settings.get('isFileServerShowingHiddenFiles')) { return true; } if (isSystemHiddenFile(file) && !settings.get('isFileServerShowingSystemHiddenFiles')) { return true; } return false; } export function isHiddenFile(file: FileEntry) { if (process.platform === 'win32') { return (file.stats.mode & 0x2) === 0x2; } else { return file.name.startsWith('.'); } } export function isSystemHiddenFile(file: FileEntry) { return getFilesToHide().some(hiddenFile => file.name.endsWith(hiddenFile)); } let _filesToHide: string[]; function getFilesToHide() { if (_filesToHide) { return _filesToHide; } if (process.platform === 'darwin') { _filesToHide = FILES_TO_HIDE_ON_DARWIN; } else if (process.platform === 'win32') { _filesToHide = FILES_TO_HIDE_ON_WINDOWS; } else { _filesToHide = FILES_TO_HIDE_ON_LINUX; } return _filesToHide; } ================================================ FILE: src/main/fileserver/page-directory-listing.ts ================================================ import path from "path"; import fs from "fs"; import { APP_INTERCEPT, FileEntry, MY_COMPUTER_INTERCEPT } from "./fileserver"; import { shouldHideFile } from "./hide-files"; import { encode, getEncoding } from "./encoding"; import { log } from "console"; import { app } from "electron"; export function generateDirectoryListing(currentPath: string, files: string[]): string { const parentPath = path.dirname(currentPath || '/'); const title = currentPath === '/' ? 'My Host Computer' : `Directory: ${encode(currentPath)}`; // Get file info and sort (directories first, then alphabetically) const items = files .map(name => { const fullPath = path.join(currentPath, name); let stats: fs.Stats; try { stats = fs.statSync(fullPath); } catch (error) { log(`FileServer: Failed to get stats for ${fullPath}: ${error}`); stats = new fs.Stats(); } return { name, fullPath, stats } as FileEntry; }) .filter(entry => entry.stats && !shouldHideFile(entry)) .sort((a, b) => { if (a.stats.isDirectory() !== b.stats.isDirectory()) { return a.stats.isDirectory() ? -1 : 1; } return a.name.localeCompare(b.name); }) .map(getFileLiHtml) .join('') // Generate very simple HTML that works in IE 5.5 return ` ${getEncoding()} ${title}

${title}

${getParentFolderLinkHtml(parentPath)} | ${getDesktopLinkHtml()} | ${getDownloadsLinkHtml()}

    ${items}
`; } function getParentFolderLinkHtml(parentPath: string) { return ` ${getIconHtml('folder.gif')} [Parent Directory] `; } function getDesktopLinkHtml() { const desktopPath = app.getPath('desktop'); return ` ${getIconHtml('desktop.gif')} Desktop `; } function getDownloadsLinkHtml() { const downloadsPath = app.getPath('downloads'); return ` ${getIconHtml('network.gif')} Downloads `; } function getIconHtml(icon: string) { return ``; } function getFileLiHtml(entry: FileEntry) { const encodedPath = encodeURI(entry.fullPath); const sizeDisplay = entry.stats.isDirectory() ? '' : ` (${formatFileSize(entry.stats.size)})`; const icon = entry.stats.isDirectory() ? getIconHtml('folder.gif') : getIconHtml('doc.gif'); return `
  • ${icon} ${getDisplayName(entry)} ${sizeDisplay}
  • `; } function getDisplayName(entry: FileEntry) { return encode(entry.stats.isDirectory() ? `[${entry.name}]` : entry.name); } function formatFileSize(bytes: number): string { if (bytes === 0) return '0 B'; const k = 1024; const sizes = ['B', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; } ================================================ FILE: src/main/fileserver/page-error.ts ================================================ import { getEncoding } from "./encoding"; import { MY_COMPUTER_INTERCEPT } from "./fileserver"; export function generateErrorPage(errorMessage: string, requestedPath: string): string { return ` ${getEncoding()} Error - File Not Found

    Error: ${errorMessage}

    windows95 failed to find the file or directory on your host computer: ${requestedPath}

    Options:

    `; } ================================================ FILE: src/main/ipc.ts ================================================ import { ipcMain, app } from "electron"; import * as path from "path"; import { IPC_COMMANDS } from "../constants"; export function setupIpcListeners() { ipcMain.handle(IPC_COMMANDS.GET_STATE_PATH, () => { return path.join(app.getPath("userData"), "state-v4.bin"); }); ipcMain.handle(IPC_COMMANDS.APP_QUIT, () => { app.quit(); }); } ================================================ FILE: src/main/logging.ts ================================================ export function log(message: string, ...args: unknown[]) { console.log(`[${new Date().toLocaleString()}] ${message}`, ...args); } ================================================ FILE: src/main/main.ts ================================================ import { app } from "electron"; import { isDevMode } from "../utils/devmode"; import { setupAboutPanel } from "./about-panel"; import { shouldQuit } from "./squirrel"; import { setupUpdates } from "./update"; import { getOrCreateWindow } from "./windows"; import { setupMenu } from "./menu"; import { setupIpcListeners } from "./ipc"; import { setupSession } from "./session"; import { setupFileServer } from './fileserver/fileserver'; /** * Handle the app's "ready" event. This is essentially * the method that takes care of booting the application. */ export async function onReady() { if (!isDevMode()) process.env.NODE_ENV = "production"; setupSession(); setupIpcListeners(); getOrCreateWindow(); setupAboutPanel(); setupMenu(); setupUpdates(); setupFileServer(); } /** * Handle the "before-quit" event * * @export */ export function onBeforeQuit() { (global as any).isQuitting = true; } /** * All windows have been closed, quit on anything but * macOS. */ export function onWindowsAllClosed() { // On OS X it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q if (process.platform !== "darwin") { app.quit(); } } /** * The main method - and the first function to run * when Fiddle is launched. * * Exported for testing purposes. */ export function main() { // Handle creating/removing shortcuts on Windows when // installing/uninstalling. if (shouldQuit()) { app.quit(); return; } // Set the app's name app.setName("windows95"); // Launch app.on("ready", onReady); app.on("before-quit", onBeforeQuit); app.on("window-all-closed", onWindowsAllClosed); } main(); ================================================ FILE: src/main/menu.ts ================================================ import { app, shell, Menu, BrowserWindow, ipcMain, dialog } from "electron"; import { clearCaches } from "../cache"; import { IPC_COMMANDS } from "../constants"; import { isDevMode } from "../utils/devmode"; import { log } from "./logging"; const LINKS = { homepage: "https://www.felixrieseberg.com", repo: "https://github.com/felixrieseberg/windows95", credits: "https://github.com/felixrieseberg/windows95/blob/master/CREDITS.md", help: "https://github.com/felixrieseberg/windows95/blob/master/HELP.md", }; export async function setupMenu() { await createMenu(); ipcMain.on(IPC_COMMANDS.MACHINE_STARTED, () => createMenu({ isRunning: true }), ); ipcMain.on(IPC_COMMANDS.MACHINE_STOPPED, () => createMenu({ isRunning: false }), ); } function send(cmd: string) { const windows = BrowserWindow.getAllWindows(); if (windows[0]) { log(`Sending "${cmd}"`); windows[0].webContents.send(cmd); } else { log(`Tried to send "${cmd}", but could not find window`); } } async function createMenu({ isRunning } = { isRunning: false }) { const template: Array = [ { label: "View", submenu: [ { label: "Toggle Full Screen", accelerator: (function () { if (process.platform === "darwin") { return "Ctrl+Command+F"; } else { return "F11"; } })(), click: function (_item, focusedWindow) { if (focusedWindow) { focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); } }, }, { label: "Toggle Developer Tools", accelerator: (function () { if (process.platform === "darwin") { return "Alt+Command+I"; } else { return "Ctrl+Shift+I"; } })(), click: function (_item, focusedWindow) { if (focusedWindow) { focusedWindow.webContents.toggleDevTools(); } }, }, { type: "separator", }, { label: "Toggle Emulator Info", click: () => send(IPC_COMMANDS.TOGGLE_INFO), }, { type: "separator", }, { role: "reload", }, ], }, { role: "editMenu", visible: isDevMode(), }, { label: "Window", role: "window", submenu: [ { label: "Minimize", accelerator: "CmdOrCtrl+M", role: "minimize", }, { label: "Close", accelerator: "CmdOrCtrl+W", role: "close", }, { type: "separator", }, { label: "Zoom in", click: () => send(IPC_COMMANDS.ZOOM_IN), enabled: isRunning, }, { label: "Zoom out", click: () => send(IPC_COMMANDS.ZOOM_OUT), enabled: isRunning, }, { label: "Reset zoom", click: () => send(IPC_COMMANDS.ZOOM_RESET), enabled: isRunning, }, ], }, { label: "Machine", submenu: [ { label: "Send Ctrl+Alt+Del", click: () => send(IPC_COMMANDS.MACHINE_CTRL_ALT_DEL), enabled: isRunning, }, { label: "Send Alt+F4", click: () => send(IPC_COMMANDS.MACHINE_ALT_F4), enabled: isRunning, }, { label: "Send Alt+Enter", click: () => send(IPC_COMMANDS.MACHINE_ALT_ENTER), enabled: isRunning, }, { label: "Send Esc", click: () => send(IPC_COMMANDS.MACHINE_ESC), enabled: isRunning, }, { type: "separator", }, isRunning ? { label: "Stop", click: () => send(IPC_COMMANDS.MACHINE_STOP), } : { label: "Start", click: () => send(IPC_COMMANDS.MACHINE_START), }, { label: "Restart", click: () => send(IPC_COMMANDS.MACHINE_RESTART), enabled: isRunning, }, { label: "Reset", click: async () => { const result = await dialog.showMessageBox({ type: 'warning', buttons: ['Reset', 'Cancel'], defaultId: 1, title: 'Reset Machine', message: 'Are you sure you want to reset the machine?', detail: 'This will delete the machine state, including all changes you have made.', }); if (result.response === 0) { send(IPC_COMMANDS.MACHINE_RESET); } }, enabled: isRunning, }, { type: "separator", }, { label: "Go to Disk Image", click: () => send(IPC_COMMANDS.SHOW_DISK_IMAGE), }, ], }, { label: "Help", role: "help", submenu: [ { label: "Author", click: () => shell.openExternal(LINKS.homepage), }, { label: "windows95 on GitHub", click: () => shell.openExternal(LINKS.repo), }, { label: "Help", click: () => shell.openExternal(LINKS.help), }, { type: "separator", }, { label: "Troubleshooting", submenu: [ { label: "Clear Cache and Restart", async click() { await clearCaches(); app.relaunch(); app.quit(); }, }, ], }, ], }, ]; if (process.platform === "darwin") { template.unshift({ label: "windows95", submenu: [ { role: "about", }, { type: "separator", }, { role: "services", }, { type: "separator", }, { label: "Hide windows95", accelerator: "Command+H", role: "hide", }, { label: "Hide Others", accelerator: "Command+Shift+H", role: "hideothers", }, { role: "unhide", }, { type: "separator", }, { label: "Quit", accelerator: "Command+Q", click() { app.quit(); }, }, ], } as any); } Menu.setApplicationMenu(Menu.buildFromTemplate(template as any)); } ================================================ FILE: src/main/session.ts ================================================ import { session } from "electron"; export function setupSession() { const s = session.defaultSession; s.webRequest.onBeforeSendHeaders( (details, callback) => { callback({ requestHeaders: { Origin: '*', ...details.requestHeaders } }); }, ); s.webRequest.onHeadersReceived((details, callback) => { callback({ responseHeaders: { 'Access-Control-Allow-Origin': ['*'], ...details.responseHeaders, }, }); }); } ================================================ FILE: src/main/settings.ts ================================================ import * as fs from 'fs'; import * as path from 'path'; import { app } from 'electron'; export interface Settings { isFileServerEnabled: boolean; isFileServerShowingHiddenFiles: boolean; isFileServerShowingSystemHiddenFiles: boolean; } const DEFAULT_SETTINGS: Settings = { isFileServerEnabled: true, isFileServerShowingHiddenFiles: false, isFileServerShowingSystemHiddenFiles: false, }; class SettingsManager { private filePath: string; private data: Settings; constructor() { this.filePath = path.join(app.getPath('userData'), 'settings.json'); this.data = this.load(); } private load(): Settings { try { if (fs.existsSync(this.filePath)) { const fileContent = fs.readFileSync(this.filePath, 'utf8'); const parsed = JSON.parse(fileContent); return { ...DEFAULT_SETTINGS, ...parsed, }; } } catch (error) { console.error('Error loading settings:', error); } return DEFAULT_SETTINGS; } private save(): void { try { fs.writeFileSync(this.filePath, JSON.stringify(this.data, null, 2)); } catch (error) { console.error('Error saving settings:', error); } } get(key: keyof Settings): any { return this.data[key]; } set(key: keyof Settings, value: any): void { this.data[key] = value; this.save(); } delete(key: keyof Settings): void { delete this.data[key]; this.save(); } clear(): void { this.data = DEFAULT_SETTINGS; this.save(); } } export const settings = new SettingsManager(); ================================================ FILE: src/main/squirrel.ts ================================================ export function shouldQuit() { return require("electron-squirrel-startup"); } ================================================ FILE: src/main/update.ts ================================================ import { app } from "electron"; export function setupUpdates() { if (app.isPackaged) { require("update-electron-app")({ repo: "felixrieseberg/windows95", updateInterval: "1 hour", }); } } ================================================ FILE: src/main/windows.ts ================================================ import { BrowserWindow, shell } from "electron"; let mainWindow: BrowserWindow | null = null; export function getOrCreateWindow(): BrowserWindow { if (mainWindow) return mainWindow; // Create the browser window. mainWindow = new BrowserWindow({ width: 1024, height: 768, useContentSize: true, webPreferences: { nodeIntegration: true, sandbox: false, webviewTag: false, contextIsolation: false, }, }); // mainWindow.webContents.toggleDevTools(); mainWindow.loadFile("./dist/static/index.html"); mainWindow.webContents.on("will-navigate", (event, url) => handleNavigation(event, url), ); mainWindow.on("closed", () => { mainWindow = null; }); return mainWindow; } function handleNavigation(event: Electron.Event, url: string) { if (url.startsWith("http")) { event.preventDefault(); shell.openExternal(url); } } ================================================ FILE: src/renderer/app.tsx ================================================ export interface Win95Window extends Window { emulator: any; win95: { app: App; }; } declare let window: Win95Window; /** * The top-level class controlling the whole app. This is *not* a React component, * but it does eventually render all components. * * @class App */ export class App { /** * Initial setup call, loading Monaco and kicking off the React * render process. */ public async setup(): Promise { const React = await import("react"); const { render } = await import("react-dom"); const { Emulator } = await import("./emulator"); const className = `${process.platform}`; const app = (
    ); const rendered = render(app, document.getElementById("app")); return rendered; } } window.win95 = window.win95 || { app: new App(), }; window.win95.app.setup(); ================================================ FILE: src/renderer/card-settings.tsx ================================================ import * as React from "react"; import { resetState } from "./utils/reset-state"; interface CardSettingsProps { bootFromScratch: () => void; setFloppy: (file: File) => void; setCdrom: (cdrom: File) => void; floppy?: File; cdrom?: File; } interface CardSettingsState { isStateReset: boolean; } export class CardSettings extends React.Component< CardSettingsProps, CardSettingsState > { constructor(props: CardSettingsProps) { super(props); this.onChangeFloppy = this.onChangeFloppy.bind(this); this.onChangeCdrom = this.onChangeCdrom.bind(this); this.onResetState = this.onResetState.bind(this); this.state = { isStateReset: false, }; } public render() { return (

    Settings

    {this.renderCdrom()}
    {this.renderFloppy()}
    {this.renderState()}
    ); } public renderCdrom() { // CD is currently not working, so.. let's return nothing. return null; const { cdrom } = this.props; return (
    CD-ROM

    windows95 comes with a virtual CD drive. It can mount images in the "iso" format.

    {cdrom ? `Inserted CD: ${cdrom?.path}` : `No CD mounted`}

    ); } public renderFloppy() { const { floppy } = this.props; return (
    Floppy

    windows95 comes with a virtual floppy drive. It can mount floppy disk images in the "img" format.

    Back in the 90s and before CD-ROMs became a popular, software was typically distributed on floppy disks. Some developers have since released their apps or games for free, usually on virtual floppy disks using the "img" format.

    Once you've mounted a disk image, you might have to boot your virtual windows95 machine from scratch.

    {floppy ? `Inserted Floppy Disk: ${floppy.name}` : `No floppy mounted`}

    ); } public renderState() { const { isStateReset } = this.state; const { bootFromScratch } = this.props; return (
    Reset machine state

    windows95 stores changes to your machine (like saved files) in a state file. If you encounter any trouble, you can reset your state or boot Windows 95 from scratch.{" "} All your changes will be lost.

    ); } /** * Handle a change in the floppy input * * @param event */ private onChangeFloppy(event: React.ChangeEvent) { const floppyFile = event.target.files && event.target.files.length > 0 ? event.target.files[0] : null; if (floppyFile) { this.props.setFloppy(floppyFile); } else { console.log(`Floppy: Input changed but no file selected`); } } /** * Handle a change in the cdrom input * * @param event */ private onChangeCdrom(event: React.ChangeEvent) { const CdromFile = event.target.files && event.target.files.length > 0 ? event.target.files[0] : null; if (CdromFile) { this.props.setCdrom(CdromFile); } else { console.log(`Cdrom: Input changed but no file selected`); } } /** * Handle the state reset */ private async onResetState() { await resetState(); this.setState({ isStateReset: true }); } } ================================================ FILE: src/renderer/card-start.tsx ================================================ import * as React from "react"; export interface CardStartProps { startEmulator: () => void; } export class CardStart extends React.Component { public render() { return (
    Hit ESC to lock or unlock your mouse
    ); } } ================================================ FILE: src/renderer/emulator-info.tsx ================================================ import * as React from "react"; interface EmulatorInfoProps { toggleInfo: () => void; emulator: any; } interface EmulatorInfoState { cpu: number; disk: string; lastCounter: number; lastTick: number; } export class EmulatorInfo extends React.Component< EmulatorInfoProps, EmulatorInfoState > { private cpuInterval = -1; constructor(props: EmulatorInfoProps) { super(props); this.cpuCount = this.cpuCount.bind(this); this.onIDEReadStart = this.onIDEReadStart.bind(this); this.onIDEReadWriteEnd = this.onIDEReadWriteEnd.bind(this); this.state = { cpu: 0, disk: "Idle", lastCounter: 0, lastTick: 0, }; } public render() { const { cpu, disk } = this.state; return (
    Disk: {disk} | CPU Speed: {cpu} |{" "} Hide
    ); } public componentWillUnmount() { this.uninstallListeners(); } /** * The emulator starts whenever, so install or uninstall listeners * at the right time * * @param newProps */ public componentDidUpdate(prevProps: EmulatorInfoProps) { if (prevProps.emulator !== this.props.emulator) { if (this.props.emulator) { this.installListeners(); } else { this.uninstallListeners(); } } } /** * Let's start listening to what the emulator is up to. */ private installListeners() { const { emulator } = this.props; if (!emulator) { console.log( `Emulator info: Tried to install listeners, but emulator not defined yet.`, ); return; } // CPU if (this.cpuInterval > -1) { clearInterval(this.cpuInterval); } // TypeScript think's we're using a Node.js setInterval. We're not. this.cpuInterval = setInterval(this.cpuCount, 500) as unknown as number; // Disk emulator.add_listener("ide-read-start", this.onIDEReadStart); emulator.add_listener("ide-read-end", this.onIDEReadWriteEnd); emulator.add_listener("ide-write-end", this.onIDEReadWriteEnd); // Screen emulator.add_listener("screen-set-size-graphical", console.log); } /** * Stop listening to the emulator. */ private uninstallListeners() { const { emulator } = this.props; if (!emulator) { console.log( `Emulator info: Tried to uninstall listeners, but emulator not defined yet.`, ); return; } // CPU if (this.cpuInterval > -1) { clearInterval(this.cpuInterval); } // Disk emulator.remove_listener("ide-read-start", this.onIDEReadStart); emulator.remove_listener("ide-read-end", this.onIDEReadWriteEnd); emulator.remove_listener("ide-write-end", this.onIDEReadWriteEnd); // Screen emulator.remove_listener("screen-set-size-graphical", console.log); } /** * The virtual IDE is handling read (start). */ private onIDEReadStart() { this.requestIdle(() => this.setState({ disk: "Read" })); } /** * The virtual IDE is handling read/write (end). */ private onIDEReadWriteEnd() { this.requestIdle(() => this.setState({ disk: "Idle" })); } /** * Request an idle callback with a 3s timeout. * * @param fn */ private requestIdle(fn: () => void) { (window as any).requestIdleCallback(fn, { timeout: 3000 }); } /** * Calculates what's up with the virtual cpu. */ private cpuCount() { const { lastCounter, lastTick } = this.state; const now = Date.now(); const instructionCounter = this.props.emulator.get_instruction_counter(); const ips = instructionCounter - lastCounter; const deltaTime = now - lastTick; this.setState({ lastTick: now, lastCounter: instructionCounter, cpu: Math.round(ips / deltaTime), }); } } ================================================ FILE: src/renderer/emulator.tsx ================================================ import * as React from "react"; import * as fs from "fs"; import * as path from "path"; import { ipcRenderer, shell, webUtils } from "electron"; import { CONSTANTS, IPC_COMMANDS } from "../constants"; import { getDiskImageSize } from "../utils/disk-image-size"; import { CardStart } from "./card-start"; import { StartMenu } from "./start-menu"; import { CardSettings } from "./card-settings"; import { EmulatorInfo } from "./emulator-info"; import { getStatePath } from "./utils/get-state-path"; import { Win95Window } from "./app"; import { resetState } from "./utils/reset-state"; declare let window: Win95Window; export interface EmulatorState { currentUiCard: "start" | "settings"; emulator?: any; scale: number; floppyFile?: File; cdromFile?: File; isBootingFresh: boolean; isCursorCaptured: boolean; isInfoDisplayed: boolean; isRunning: boolean; } export class Emulator extends React.Component<{}, EmulatorState> { private isQuitting = false; private isResetting = false; constructor(props: {}) { super(props); this.startEmulator = this.startEmulator.bind(this); this.stopEmulator = this.stopEmulator.bind(this); this.restartEmulator = this.restartEmulator.bind(this); this.resetEmulator = this.resetEmulator.bind(this); this.bootFromScratch = this.bootFromScratch.bind(this); this.state = { isBootingFresh: false, isCursorCaptured: false, isRunning: false, currentUiCard: "start", isInfoDisplayed: true, // We can start pretty large // If it's too large, it'll just grow until it hits borders scale: 2, }; this.setupInputListeners(); this.setupIpcListeners(); this.setupUnloadListeners(); } /** * We want to capture and release the mouse at appropriate times. */ public setupInputListeners() { // ESC document.onkeydown = (evt) => { const { isCursorCaptured } = this.state; evt = evt || window.event; if (evt.keyCode === 27) { if (isCursorCaptured) { this.unlockMouse(); } else { this.lockMouse(); } evt.stopPropagation(); } }; // Click document.addEventListener("click", () => { const { isRunning } = this.state; if (isRunning) { this.lockMouse(); } }); } /** * Save the emulator's state to disk during exit. */ public setupUnloadListeners() { const handleClose = async () => { await this.saveState(); console.log(`Unload: Now done, quitting again.`); this.isQuitting = true; setImmediate(() => { ipcRenderer.invoke(IPC_COMMANDS.APP_QUIT); }); }; window.onbeforeunload = (event: Event) => { if (this.isQuitting || this.isResetting) { console.log(`Unload: Not preventing`); return; } console.log(`Unload: Preventing to first save state`); handleClose(); event.preventDefault(); event.returnValue = false; }; } /** * Setup the various IPC messages sent to the renderer * from the main process */ public setupIpcListeners() { ipcRenderer.on(IPC_COMMANDS.MACHINE_CTRL_ALT_DEL, () => { this.sendKeys([ 0x1d, // ctrl 0x38, // alt 0x53, // delete ]); }); ipcRenderer.on(IPC_COMMANDS.MACHINE_ALT_F4, () => { this.sendKeys([ 0x38, // alt 0x3e, // f4 ]); }); ipcRenderer.on(IPC_COMMANDS.MACHINE_ALT_ENTER, () => { this.sendKeys([ 0x38, // alt 0, // enter ]); }); ipcRenderer.on(IPC_COMMANDS.MACHINE_ESC, () => { this.sendKeys([ 0x18, // alt ]); }); ipcRenderer.on(IPC_COMMANDS.MACHINE_STOP, this.stopEmulator); ipcRenderer.on(IPC_COMMANDS.MACHINE_RESET, this.resetEmulator); ipcRenderer.on(IPC_COMMANDS.MACHINE_START, this.startEmulator); ipcRenderer.on(IPC_COMMANDS.MACHINE_RESTART, this.restartEmulator); ipcRenderer.on(IPC_COMMANDS.TOGGLE_INFO, () => { this.setState({ isInfoDisplayed: !this.state.isInfoDisplayed }); }); ipcRenderer.on(IPC_COMMANDS.SHOW_DISK_IMAGE, () => { this.showDiskImage(); }); ipcRenderer.on(IPC_COMMANDS.ZOOM_IN, () => { this.setScale(this.state.scale * 1.2); }); ipcRenderer.on(IPC_COMMANDS.ZOOM_OUT, () => { this.setScale(this.state.scale * 0.8); }); ipcRenderer.on(IPC_COMMANDS.ZOOM_RESET, () => { this.setScale(1); }); } /** * If the emulator isn't running, this is rendering the, erm, UI. * * 🤡 */ public renderUI() { const { isRunning, currentUiCard, floppyFile, cdromFile } = this.state; if (isRunning) { return null; } let card; if (currentUiCard === "settings") { card = ( this.setState({ floppyFile })} setCdrom={(cdromFile) => this.setState({ cdromFile })} bootFromScratch={this.bootFromScratch} floppy={floppyFile} cdrom={cdromFile} /> ); } else { card = ; } return ( <> {card} this.setState({ currentUiCard: target as "start" | "settings" })} /> ); } /** * Yaknow, render things and stuff. */ public render() { return ( <> {this.renderInfo()} {this.renderUI()}
    ); } /** * Render the little info thingy */ public renderInfo() { if (!this.state.isInfoDisplayed) { return null; } return ( { this.setState({ isInfoDisplayed: !this.state.isInfoDisplayed }); }} /> ); } /** * Boot the emulator without restoring state */ public bootFromScratch() { this.setState({ isBootingFresh: true }); this.startEmulator(); } /** * Show the disk image on disk */ public showDiskImage() { // Contents/Resources/app/dist/static console.log(`Showing disk image in ${CONSTANTS.IMAGE_PATH}`); shell.showItemInFolder(CONSTANTS.IMAGE_PATH); } /** * Start the actual emulator */ private async startEmulator() { document.body.classList.remove("paused"); const cdromPath = this.state.cdromFile ? webUtils.getPathForFile(this.state.cdromFile) : null; const options = { wasm_path: path.join(__dirname, "build/v86.wasm"), memory_size: 128 * 1024 * 1024, vga_memory_size: 64 * 1024 * 1024, screen: { container: document.getElementById("emulator"), scale: 0 }, preserve_mac_from_state_image: true, net_device: { relay_url: "fetch", type: "ne2k", }, bios: { url: path.join(__dirname, "../../bios/seabios.bin"), }, vga_bios: { url: path.join(__dirname, "../../bios/vgabios.bin"), }, hda: { url: CONSTANTS.IMAGE_PATH, async: true, size: await getDiskImageSize(CONSTANTS.IMAGE_PATH), }, fda: this.state.floppyFile ? { buffer: this.state.floppyFile, } : undefined, cdrom: cdromPath ? { url: cdromPath, async: true, size: await getDiskImageSize(cdromPath), } : undefined, boot_order: 0x132, }; console.log(`🚜 Starting emulator with options`, options); window["emulator"] = new V86(options); // New v86 instance this.setState({ emulator: window["emulator"], isRunning: true, }); ipcRenderer.send(IPC_COMMANDS.MACHINE_STARTED); // Restore state. We can't do this right away // and randomly chose 500ms as the appropriate // wait time (lol) setTimeout(async () => { if (!this.state.isBootingFresh) { this.restoreState(); } this.lockMouse(); this.state.emulator.run(); this.state.emulator.screen_set_scale(this.state.scale); }, 500); } /** * Restart emulator */ private restartEmulator() { if (this.state.emulator && this.state.isRunning) { console.log(`🚜 Restarting emulator`); this.state.emulator.restart(); } else { console.log(`🚜 Restarting emulator failed: Emulator not running`); } } /** * Stop the emulator */ private async stopEmulator() { const { emulator, isRunning } = this.state; if (!emulator || !isRunning) { return; } console.log(`🚜 Stopping emulator`); await this.saveState(); this.unlockMouse(); await emulator.stop(); this.setState({ isRunning: false }); this.resetCanvas(); document.body.classList.add("paused"); ipcRenderer.send(IPC_COMMANDS.MACHINE_STOPPED); } /** * Reset the emulator by reloading the whole page */ private async resetEmulator() { this.isResetting = true; await this.stopEmulator(); await resetState(); document.location.reload(); } /** * Take the emulators state and write it to disk. This is possibly * a fairly big file. */ private async saveState(): Promise { const { emulator } = this.state; const statePath = await getStatePath(); if (!emulator || !emulator.save_state) { console.log(`restoreState: No emulator present`); return; } try { const newState = await emulator.save_state(); await fs.promises.writeFile(statePath, Buffer.from(newState), { flush: true }); } catch (error) { console.warn(`saveState: Could not save state`, error); } } /** * Restores state to the emulator. */ private async restoreState() { const { emulator, isBootingFresh } = this.state; const state = await this.getState(); if (isBootingFresh) { console.log(`restoreState: Booting fresh, not restoring.`); return; } else if (!state) { console.log(`restoreState: No state present, not restoring.`); return; } else if (!emulator) { console.log(`restoreState: No emulator present`); return; } try { await this.state.emulator.restore_state(state); } catch (error) { console.log( `restoreState: Could not read state file. Maybe none exists?`, error, ); } } /** * Returns the current machine's state - either what * we have saved or alternatively the default state. * * @returns {ArrayBuffer} */ private async getState(): Promise { const expectedStatePath = await getStatePath(); const statePath = fs.existsSync(expectedStatePath) ? expectedStatePath : CONSTANTS.DEFAULT_STATE_PATH; if (fs.existsSync(statePath)) { return fs.readFileSync(statePath).buffer; } else { console.log(`getState: No state file found at ${statePath}`); } return null; } private unlockMouse() { const { emulator } = this.state; this.setState({ isCursorCaptured: false }); if (emulator) { emulator.mouse_set_status(false); } document.exitPointerLock(); } private lockMouse() { const { emulator } = this.state; if (emulator) { this.setState({ isCursorCaptured: true }); emulator.mouse_set_status(true); emulator.lock_mouse(); } else { console.warn( `Emulator: Tried to lock mouse, but no emulator or not running`, ); } } /** * Set the emulator's scale * * @param target */ private setScale(target: number) { const { emulator, isRunning } = this.state; if (emulator && isRunning) { emulator.screen_set_scale(target); this.setState({ scale: target }); } } /** * Send keys to the emulator (including the key-up), * if it's running * * @param {Array} codes */ private sendKeys(codes: Array) { if (this.state.emulator && this.state.isRunning) { const scancodes = codes; // Push break codes (key-up) for (const scancode of scancodes) { scancodes.push(scancode | 0x80); } this.state.emulator.keyboard_send_scancodes(scancodes); } } /** * Reset the canvas */ private resetCanvas() { const canvas = document.getElementById("emulator-canvas"); if (canvas instanceof HTMLCanvasElement) { const ctx = canvas.getContext('2d'); ctx?.clearRect(0, 0, canvas.width, canvas.height); } } } ================================================ FILE: src/renderer/global.d.ts ================================================ declare const V86: any; declare const win95: any; ================================================ FILE: src/renderer/lib/LICENSE.md ================================================ Copyright (c) 2012, The v86 contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: src/renderer/lib/libv86.js ================================================ ;(function(){'use strict';function aa(a,b){function c(y){y=y.toString(16);return"#"+"0".repeat(6-y.length)+y}function d(y){var v=256*ma,F=8*S,J=Oa?Oa.canvas:null;J&&J.width===v&&J.height===F||(J?(J.width=v,J.height=F):(J=new OffscreenCanvas(v,F),Oa=J.getContext("2d")),sb=Oa.createImageData(v,F));const Q=sb.data;let P=0,T;F=tb?function(Y){T=T||Y;Q[P+3]=Y;Q[P+7]=Y;P+=8}:function(Y){T=T||Y;Q[P+3]=Y;P+=4};J=32-S;const ha=v*(S-1)*4;v=4*(ma-v*S);const ea=1020*ma;for(let Y=0,Aa=0;2048>Y;++Y,Aa+=J,P+=v){const Ba=Y%256;Y&&!Ba&&(P+= ha);T=!1;for(let Ia=0;Ia>=1)F(Ja&sa?255:0);ub&&F(vb&&192<=Ba&&223>=Ba&&Ja&1?255:0)}Mb[Y]=T?1:0}Oa.putImageData(sb,0,0)}function e(y,v,F,J){if(v&&F){y.style.width="";y.style.height="";J&&(y.style.transform="");var Q=y.getBoundingClientRect();J?y.style.transform=(1===v?"":" scaleX("+v+")")+(1===F?"":" scaleY("+F+")"):(0===v%1&&0===F%1?(f.style.imageRendering="crisp-edges",f.style.imageRendering="pixelated",f.style["-ms-interpolation-mode"]="nearest-neighbor"): (f.style.imageRendering="",f.style["-ms-interpolation-mode"]=""),J=window.devicePixelRatio||1,0!==J%1&&(v/=J,F/=J));1!==v&&(y.style.width=Q.width*v+"px");1!==F&&(y.style.height=Q.height*F+"px")}}const g=a.container;this.screen_fill_buffer=b;console.assert(g,"options.container must be provided");this.FLAG_BLINKING=1;this.FLAG_FONT_PAGE_B=2;var f=g.getElementsByTagName("canvas")[0],h=f.getContext("2d",{alpha:!1}),l=g.getElementsByTagName("div")[0],m=document.createElement("div"),n,p,q=void 0!==a.scale? a.scale:1,r=void 0!==a.scale?a.scale:1,A=1,w,u,G,z,I,R,na,Oa,sb,Mb=new Int8Array(2048),S,ma,ub,tb,vb,wb=0,xb=0,eb,Nb=0,fb,yb,gb,zb=[],hb=zb,ib=0,Ab=!1;this.init=function(){const y=new Uint16Array([32,9786,9787,9829,9830,9827,9824,8226,9688,9675,9689,9794,9792,9834,9835,9788,9658,9668,8597,8252,182,167,9644,8616,8593,8595,8594,8592,8735,8596,9650,9660]),v=new Uint16Array([8962,199,252,233,226,228,224,229,231,234,235,232,239,238,236,196,197,201,230,198,244,246,242,251,249,255,214,220,162,163,165,8359, 402,225,237,243,250,241,209,170,186,191,8976,172,189,188,161,171,187,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,945,223,915,960,931,963,181,964,934,920,937,948,8734,966,949,8745,8801,177,8805,8804,8992,8993,247,8776,176,8729,183,8730,8319,178,9632,160]);for(var F=0,J;256>F;F++)J=126F?y[F]: F,zb.push(String.fromCharCode(J));m.classList.add("cursor");m.style.position="absolute";m.style.backgroundColor="#ccc";m.style.width="7px";m.style.display="inline-block";this.set_mode(!1);this.set_size_text(80,25);2===u&&this.set_size_graphical(720,400,720,400);this.set_scale(q,r);this.timer()};this.make_screenshot=function(){const y=new Image;if(1===u||2===u)y.src=f.toDataURL("image/png");else{const v=[9,16],F=document.createElement("canvas");F.width=z*v[0];F.height=I*v[1];const J=F.getContext("2d"); J.imageSmoothingEnabled=!1;J.font=window.getComputedStyle(l).font;J.textBaseline="top";for(let Q=0;Qthis.update_screen())};this.update_screen=function(){Ab||(0===u?this.update_text():1===u?this.update_graphical():this.update_graphical_text());this.timer()};this.update_text=function(){for(var y=0;yv;)l.removeChild(l.firstChild);for(;l.childNodes.length=y&&2*y{}},notification:{initial_port:43264, single_handler:!1,handlers:[d=>{if(0===d){for(;this.virtqueue.has_request();)d=this.virtqueue.pop_request(),this.ReceiveRequest(d);this.virtqueue.notify_me_after(0)}}]},isr_status:{initial_port:42752},device_specific:{initial_port:42496,struct:[{bytes:2,name:"mount tag length",read:()=>this.configspace_taglen,write:()=>{}}].concat(k.range(254).map(d=>({bytes:1,name:"mount tag name "+d,read:()=>this.configspace_tagname[d]||0,write:()=>{}})))}});this.virtqueue=this.virtio.queues[0]} ca.prototype.get_state=function(){var a=[];a[0]=this.configspace_tagname;a[1]=this.configspace_taglen;a[2]=this.virtio;a[3]=this.VERSION;a[4]=this.BLOCKSIZE;a[5]=this.msize;a[6]=this.replybuffer;a[7]=this.replybuffersize;a[8]=this.fids.map(function(b){return[b.inodeid,b.type,b.uid,b.dbg_name]});a[9]=this.fs;return a}; ca.prototype.set_state=function(a){this.configspace_tagname=a[0];this.configspace_taglen=a[1];this.virtio.set_state(a[2]);this.virtqueue=this.virtio.queues[0];this.VERSION=a[3];this.BLOCKSIZE=a[4];this.msize=a[5];this.replybuffer=a[6];this.replybuffersize=a[7];this.fids=a[8].map(function(b){return{inodeid:b[0],type:b[1],uid:b[2],dbg_name:b[3]}});this.fs.set_state(a[9])};ca.prototype.Createfid=function(a,b,c,d){return{inodeid:a,type:b,uid:c,dbg_name:d}}; ca.prototype.update_dbg_name=function(a,b){for(const c of this.fids)c.inodeid===a&&(c.dbg_name=b)};ca.prototype.reset=function(){this.fids=[];this.virtio.reset()};ca.prototype.BuildReply=function(a,b,c){t.Marshall(["w","b","h"],[c+7,a+1,b],this.replybuffer,0);c+7>=this.replybuffer.length&&x.Debug("Error in 9p: payloadsize exceeds maximum length");this.replybuffersize=c+7};ca.prototype.SendError=function(a,b,c){b=t.Marshall(["w"],[c],this.replybuffer,7);this.BuildReply(6,a,b)}; ca.prototype.SendReply=function(a){a.set_next_blob(this.replybuffer.subarray(0,this.replybuffersize));this.virtqueue.push_reply(a);this.virtqueue.flush_replies()}; ca.prototype.ReceiveRequest=async function(a){var b=new Uint8Array(a.length_readable);a.get_next_blob(b);var c={offset:0},d=t.Unmarshall(["w","b","h"],b,c),e=d[0],g=d[1],f=d[2];switch(g){case 8:e=this.fs.GetTotalSize();b=this.fs.GetSpace();d=[16914839];d[1]=this.BLOCKSIZE;d[2]=Math.floor(b/d[1]);d[3]=d[2]-Math.floor(e/d[1]);d[4]=d[2]-Math.floor(e/d[1]);d[5]=this.fs.CountUsedInodes();d[6]=this.fs.CountFreeInodes();d[7]=0;d[8]=256;e=t.Marshall("wwddddddw".split(""),d,this.replybuffer,7);this.BuildReply(g, f,e);this.SendReply(a);break;case 112:case 12:d=t.Unmarshall(["w","w"],b,c);var h=d[0];c=d[1];x.Debug("[open] fid="+h+", mode="+c);b=this.fids[h].inodeid;var l=this.fs.GetInode(b);x.Debug("file open "+this.fids[h].dbg_name);e=this.fs.OpenInode(b,c);this.fs.AddEvent(this.fids[h].inodeid,function(){x.Debug("file opened "+this.fids[h].dbg_name+" tag:"+f);var q=[];q[0]=l.qid;q[1]=this.msize-24;t.Marshall(["Q","w"],q,this.replybuffer,7);this.BuildReply(g,f,17);this.SendReply(a)}.bind(this));break;case 70:d= t.Unmarshall(["w","w","s"],b,c);b=d[0];h=d[1];e=d[2];x.Debug("[link] dfid="+b+", name="+e);e=this.fs.Link(this.fids[b].inodeid,this.fids[h].inodeid,e);if(0>e){this.SendError(f,-1===e?"Operation not permitted":"Unknown error: "+-e,-e);this.SendReply(a);break}this.BuildReply(g,f,0);this.SendReply(a);break;case 16:d=t.Unmarshall(["w","s","s","w"],b,c);h=d[0];e=d[1];b=d[2];d=d[3];x.Debug("[symlink] fid="+h+", name="+e+", symgt="+b+", gid="+d);b=this.fs.CreateSymlink(e,this.fids[h].inodeid,b);l=this.fs.GetInode(b); l.uid=this.fids[h].uid;l.gid=d;t.Marshall(["Q"],[l.qid],this.replybuffer,7);this.BuildReply(g,f,13);this.SendReply(a);break;case 18:d=t.Unmarshall("wswwww".split(""),b,c);h=d[0];e=d[1];c=d[2];b=d[3];var m=d[4];d=d[5];x.Debug("[mknod] fid="+h+", name="+e+", major="+b+", minor="+m);b=this.fs.CreateNode(e,this.fids[h].inodeid,b,m);l=this.fs.GetInode(b);l.mode=c;l.uid=this.fids[h].uid;l.gid=d;t.Marshall(["Q"],[l.qid],this.replybuffer,7);this.BuildReply(g,f,13);this.SendReply(a);break;case 22:d=t.Unmarshall(["w"], b,c);h=d[0];l=this.fs.GetInode(this.fids[h].inodeid);x.Debug("[readlink] fid="+h+" name="+this.fids[h].dbg_name+" target="+l.symlink);e=t.Marshall(["s"],[l.symlink],this.replybuffer,7);this.BuildReply(g,f,e);this.SendReply(a);break;case 72:d=t.Unmarshall(["w","s","w","w"],b,c);h=d[0];e=d[1];c=d[2];d=d[3];x.Debug("[mkdir] fid="+h+", name="+e+", mode="+c+", gid="+d);b=this.fs.CreateDirectory(e,this.fids[h].inodeid);l=this.fs.GetInode(b);l.mode=c|fa;l.uid=this.fids[h].uid;l.gid=d;t.Marshall(["Q"],[l.qid], this.replybuffer,7);this.BuildReply(g,f,13);this.SendReply(a);break;case 14:d=t.Unmarshall(["w","s","w","w","w"],b,c);h=d[0];e=d[1];b=d[2];c=d[3];d=d[4];this.bus.send("9p-create",[e,this.fids[h].inodeid]);x.Debug("[create] fid="+h+", name="+e+", flags="+b+", mode="+c+", gid="+d);b=this.fs.CreateFile(e,this.fids[h].inodeid);this.fids[h].inodeid=b;this.fids[h].type=1;this.fids[h].dbg_name=e;l=this.fs.GetInode(b);l.uid=this.fids[h].uid;l.gid=d;l.mode=c|ia;t.Marshall(["Q","w"],[l.qid,this.msize-24],this.replybuffer, 7);this.BuildReply(g,f,17);this.SendReply(a);break;case 52:d=t.Unmarshall("wbwddws".split(""),b,c);h=d[0];b=d[2];e=0===d[4]?Infinity:d[4];d=this.fs.DescribeLock(d[1],d[3],e,d[5],d[6]);x.Debug("[lock] fid="+h+", type="+ba[d.type]+", start="+d.start+", length="+d.length+", proc_id="+d.proc_id);e=this.fs.Lock(this.fids[h].inodeid,d,b);t.Marshall(["b"],[e],this.replybuffer,7);this.BuildReply(g,f,1);this.SendReply(a);break;case 54:d=t.Unmarshall("wbddws".split(""),b,c);h=d[0];e=0===d[3]?Infinity:d[3]; d=this.fs.DescribeLock(d[1],d[2],e,d[4],d[5]);x.Debug("[getlock] fid="+h+", type="+ba[d.type]+", start="+d.start+", length="+d.length+", proc_id="+d.proc_id);e=this.fs.GetLock(this.fids[h].inodeid,d);e||(e=d,e.type=2);e=t.Marshall(["b","d","d","w","s"],[e.type,e.start,Infinity===e.length?0:e.length,e.proc_id,e.client_id],this.replybuffer,7);this.BuildReply(g,f,e);this.SendReply(a);break;case 24:d=t.Unmarshall(["w","d"],b,c);h=d[0];l=this.fs.GetInode(this.fids[h].inodeid);x.Debug("[getattr]: fid="+ h+" name="+this.fids[h].dbg_name+" request mask="+d[1]);if(!l||l.status===ja){x.Debug("getattr: unlinked");this.SendError(f,"No such file or directory",2);this.SendReply(a);break}d[0]=d[1];d[1]=l.qid;d[2]=l.mode;d[3]=l.uid;d[4]=l.gid;d[5]=l.nlinks;d[6]=l.major<<8|l.minor;d[7]=l.size;d[8]=this.BLOCKSIZE;d[9]=Math.floor(l.size/512+1);d[10]=l.atime;d[11]=0;d[12]=l.mtime;d[13]=0;d[14]=l.ctime;d[15]=0;d[16]=0;d[17]=0;d[18]=0;d[19]=0;t.Marshall("dQwwwddddddddddddddd".split(""),d,this.replybuffer,7);this.BuildReply(g, f,153);this.SendReply(a);break;case 26:d=t.Unmarshall("wwwwwddddd".split(""),b,c);h=d[0];l=this.fs.GetInode(this.fids[h].inodeid);x.Debug("[setattr]: fid="+h+" request mask="+d[1]+" name="+this.fids[h].dbg_name);d[1]&1&&(l.mode=d[2]);d[1]&2&&(l.uid=d[3]);d[1]&4&&(l.gid=d[4]);d[1]&16&&(l.atime=Math.floor((new Date).getTime()/1E3));d[1]&32&&(l.mtime=Math.floor((new Date).getTime()/1E3));d[1]&64&&(l.ctime=Math.floor((new Date).getTime()/1E3));d[1]&128&&(l.atime=d[6]);d[1]&256&&(l.mtime=d[8]);d[1]&8&& await this.fs.ChangeSize(this.fids[h].inodeid,d[5]);this.BuildReply(g,f,0);this.SendReply(a);break;case 50:d=t.Unmarshall(["w","d"],b,c);h=d[0];this.BuildReply(g,f,0);this.SendReply(a);break;case 40:case 116:d=t.Unmarshall(["w","d","w"],b,c);h=d[0];e=d[1];m=d[2];l=this.fs.GetInode(this.fids[h].inodeid);40===g&&x.Debug("[treaddir]: fid="+h+" offset="+e+" count="+m);116===g&&x.Debug("[read]: fid="+h+" ("+this.fids[h].dbg_name+") offset="+e+" count="+m+" fidtype="+this.fids[h].type);if(!l||l.status=== ja){x.Debug("read/treaddir: unlinked");this.SendError(f,"No such file or directory",2);this.SendReply(a);break}if(2===this.fids[h].type)for(l.caps.lengthl.size&&(m=0),this.bus.send("9p-read-start",[this.fids[h].dbg_name]),d=await this.fs.Read(d, e,m),this.bus.send("9p-read-end",[this.fids[h].dbg_name,m]),d&&this.replybuffer.set(d,11);t.Marshall(["w"],[m],this.replybuffer,7);this.BuildReply(g,f,4+m);this.SendReply(a);break;case 118:d=t.Unmarshall(["w","d","w"],b,c);h=d[0];e=d[1];m=d[2];d=this.fids[h].dbg_name;x.Debug("[write]: fid="+h+" ("+d+") offset="+e+" count="+m+" fidtype="+this.fids[h].type);if(2===this.fids[h].type){this.SendError(f,"Setxattr not supported",95);this.SendReply(a);break}else await this.fs.Write(this.fids[h].inodeid,e, m,b.subarray(c.offset));this.bus.send("9p-write-end",[d,m]);t.Marshall(["w"],[m],this.replybuffer,7);this.BuildReply(g,f,4);this.SendReply(a);break;case 74:d=t.Unmarshall(["w","s","w","s"],b,c);e=d[0];b=d[1];c=d[2];d=d[3];x.Debug("[renameat]: oldname="+b+" newname="+d);e=await this.fs.Rename(this.fids[e].inodeid,b,this.fids[c].inodeid,d);if(0>e){this.SendError(f,-2===e?"No such file or directory":-1===e?"Operation not permitted":-39===e?"Directory not empty":"Unknown error: "+-e,-e);this.SendReply(a); break}this.BuildReply(g,f,0);this.SendReply(a);break;case 76:d=t.Unmarshall(["w","s","w"],b,c);c=d[0];e=d[1];b=d[2];x.Debug("[unlink]: dirfd="+c+" name="+e+" flags="+b);h=this.fs.Search(this.fids[c].inodeid,e);if(-1===h){this.SendError(f,"No such file or directory",2);this.SendReply(a);break}e=this.fs.Unlink(this.fids[c].inodeid,e);if(0>e){this.SendError(f,-39===e?"Directory not empty":-1===e?"Operation not permitted":"Unknown error: "+-e,-e);this.SendReply(a);break}this.BuildReply(g,f,0);this.SendReply(a); break;case 100:d=t.Unmarshall(["w","s"],b,c);x.Debug("[version]: msize="+d[0]+" version="+d[1]);this.msize!==d[0]&&(this.msize=d[0],this.replybuffer=new Uint8Array(Math.min(16777216,2*this.msize)));e=t.Marshall(["w","s"],[this.msize,this.VERSION],this.replybuffer,7);this.BuildReply(g,f,e);this.SendReply(a);break;case 104:d=t.Unmarshall(["w","w","s","s","w"],b,c);h=d[0];e=d[4];x.Debug("[attach]: fid="+h+" afid="+B(d[1])+" uname="+d[2]+" aname="+d[3]);this.fids[h]=this.Createfid(0,1,e,"");l=this.fs.GetInode(this.fids[h].inodeid); t.Marshall(["Q"],[l.qid],this.replybuffer,7);this.BuildReply(g,f,13);this.SendReply(a);this.bus.send("9p-attach");break;case 108:d=t.Unmarshall(["h"],b,c);x.Debug("[flush] "+f);this.BuildReply(g,f,0);this.SendReply(a);break;case 110:d=t.Unmarshall(["w","w","h"],b,c);h=d[0];m=d[1];var n=d[2];x.Debug("[walk]: fid="+d[0]+" nwfid="+d[1]+" nwname="+n);if(0===n){this.fids[m]=this.Createfid(this.fids[h].inodeid,1,this.fids[h].uid,this.fids[h].dbg_name);t.Marshall(["h"],[0],this.replybuffer,7);this.BuildReply(g, f,2);this.SendReply(a);break}e=[];for(d=0;db;b++)this.ports[b]=this.create_empty_entry();var c=a.memory_size[0];for(b=0;b<<17>>0,8);return 255},function(d,e){B(d>>>0,8);B(e,2)},function(d){B(d>>>0,8);return-1},function(d,e){B(d>>>0,8);B(e>>>0,8)})} C.prototype.create_empty_entry=function(){return{read8:this.empty_port_read8,read16:this.empty_port_read16,read32:this.empty_port_read32,write8:this.empty_port_write,write16:this.empty_port_write,write32:this.empty_port_write,device:void 0}};C.prototype.empty_port_read8=function(){return 255};C.prototype.empty_port_read16=function(){return 65535};C.prototype.empty_port_read32=function(){return-1};C.prototype.empty_port_write=function(){}; C.prototype.register_read=function(a,b,c,d,e){c&&(this.ports[a].read8=c);d&&(this.ports[a].read16=d);e&&(this.ports[a].read32=e);this.ports[a].device=b};C.prototype.register_write=function(a,b,c,d,e){c&&(this.ports[a].write8=c);d&&(this.ports[a].write16=d);e&&(this.ports[a].write32=e);this.ports[a].device=b}; C.prototype.register_read_consecutive=function(a,b,c,d,e,g){function f(){return c.call(this)|d.call(this)<<8}function h(){return e.call(this)|g.call(this)<<8}function l(){return c.call(this)|d.call(this)<<8|e.call(this)<<16|g.call(this)<<24}e&&g?(this.register_read(a,b,c,f,l),this.register_read(a+1,b,d),this.register_read(a+2,b,e,h),this.register_read(a+3,b,g)):(this.register_read(a,b,c,f),this.register_read(a+1,b,d))}; C.prototype.register_write_consecutive=function(a,b,c,d,e,g){function f(m){c.call(this,m&255);d.call(this,m>>8&255)}function h(m){e.call(this,m&255);g.call(this,m>>8&255)}function l(m){c.call(this,m&255);d.call(this,m>>8&255);e.call(this,m>>16&255);g.call(this,m>>>24)}e&&g?(this.register_write(a,b,c,f,l),this.register_write(a+1,b,d),this.register_write(a+2,b,e,h),this.register_write(a+3,b,g)):(this.register_write(a,b,c,f),this.register_write(a+1,b,d))}; C.prototype.mmap_read32_shim=function(a){var b=this.cpu.memory_map_read8[a>>>17];return b(a)|b(a+1)<<8|b(a+2)<<16|b(a+3)<<24};C.prototype.mmap_write32_shim=function(a,b){var c=this.cpu.memory_map_write8[a>>>17];c(a,b&255);c(a+1,b>>8&255);c(a+2,b>>16&255);c(a+3,b>>>24)}; C.prototype.mmap_register=function(a,b,c,d,e,g){B(a>>>0,8);B(b,8);e||(e=this.mmap_read32_shim.bind(this));g||(g=this.mmap_write32_shim.bind(this));for(a>>>=17;0>>0,8),this.get_port_description(a));return c.write32.call(c.device,b)}; C.prototype.port_read8=function(a){var b=this.ports[a];b.read8===this.empty_port_read8&&(B(a,4),this.get_port_description(a));b=b.read8.call(b.device);B(a);return b};C.prototype.port_read16=function(a){var b=this.ports[a];b.read16===this.empty_port_read16&&(B(a,4),this.get_port_description(a));b=b.read16.call(b.device);B(a);return b};C.prototype.port_read32=function(a){var b=this.ports[a];b.read32===this.empty_port_read32&&(B(a,4),this.get_port_description(a));return b.read32.call(b.device)}; var ka={4:"PORT_DMA_ADDR_2",5:"PORT_DMA_CNT_2",10:"PORT_DMA1_MASK_REG",11:"PORT_DMA1_MODE_REG",12:"PORT_DMA1_CLEAR_FF_REG",13:"PORT_DMA1_MASTER_CLEAR",32:"PORT_PIC1_CMD",33:"PORT_PIC1_DATA",64:"PORT_PIT_COUNTER0",65:"PORT_PIT_COUNTER1",66:"PORT_PIT_COUNTER2",67:"PORT_PIT_MODE",96:"PORT_PS2_DATA",97:"PORT_PS2_CTRLB",100:"PORT_PS2_STATUS",112:"PORT_CMOS_INDEX",113:"PORT_CMOS_DATA",128:"PORT_DIAG",129:"PORT_DMA_PAGE_2",146:"PORT_A20",160:"PORT_PIC2_CMD",161:"PORT_PIC2_DATA",178:"PORT_SMI_CMD",179:"PORT_SMI_STATUS", 212:"PORT_DMA2_MASK_REG",214:"PORT_DMA2_MODE_REG",218:"PORT_DMA2_MASTER_CLEAR",240:"PORT_MATH_CLEAR",368:"PORT_ATA2_CMD_BASE",496:"PORT_ATA1_CMD_BASE",632:"PORT_LPT2",744:"PORT_SERIAL4",760:"PORT_SERIAL2",884:"PORT_ATA2_CTRL_BASE",888:"PORT_LPT1",1E3:"PORT_SERIAL3",1008:"PORT_FD_BASE",1010:"PORT_FD_DOR",1012:"PORT_FD_STATUS",1013:"PORT_FD_DATA",1014:"PORT_HD_DATA",1015:"PORT_FD_DIR",1016:"PORT_SERIAL1",3320:"PORT_PCI_CMD",3321:"PORT_PCI_REBOOT",3324:"PORT_PCI_DATA",1026:"PORT_BIOS_DEBUG",1296:"PORT_QEMU_CFG_CTL", 1297:"PORT_QEMU_CFG_DATA",45056:"PORT_ACPI_PM_BASE",45312:"PORT_SMB_BASE",35072:"PORT_BIOS_APM"};C.prototype.get_port_description=function(a){return ka[a]?" ("+ka[a]+")":""};function D(a,b){this.stopping=this.running=!1;this.idle=!0;this.tick_counter=0;this.worker=null;this.cpu=new E(a,b,()=>{this.idle&&this.next_tick(0)});this.bus=a;this.register_yield()}D.prototype.run=function(){this.stopping=!1;this.running||(this.running=!0,this.bus.send("emulator-started"));this.next_tick(0)};D.prototype.do_tick=function(){if(this.stopping||!this.running)this.stopping=this.running=!1,this.bus.send("emulator-stopped");else{this.idle=!1;var a=this.cpu.main_loop();this.next_tick(a)}}; D.prototype.next_tick=function(a){const b=++this.tick_counter;this.idle=!0;this.yield(a,b)};D.prototype.yield_callback=function(a){a===this.tick_counter&&this.do_tick()};D.prototype.stop=function(){this.running&&(this.stopping=!0)};D.prototype.destroy=function(){this.unregister_yield()};D.prototype.restart=function(){this.cpu.reset_cpu();this.cpu.load_bios()};D.prototype.init=function(a){this.cpu.init(a,this.bus);this.bus.send("emulator-ready")}; if("undefined"!==typeof process)D.prototype.yield=function(a,b){1>a?global.setImmediate(c=>this.yield_callback(c),b):setTimeout(c=>this.yield_callback(c),a,b)},D.prototype.register_yield=function(){},D.prototype.unregister_yield=function(){};else if("undefined"!==typeof Worker){function a(){let b;globalThis.onmessage=function(c){const d=c.data.t;b=b&&clearTimeout(b);1>d?postMessage(c.data.tick):b=setTimeout(()=>postMessage(c.data.tick),d)}}D.prototype.register_yield=function(){const b=URL.createObjectURL(new Blob(["("+ a.toString()+")()"],{type:"text/javascript"}));this.worker=new Worker(b);this.worker.onmessage=c=>this.yield_callback(c.data);URL.revokeObjectURL(b)};D.prototype.yield=function(b,c){this.worker.postMessage({t:b,tick:c})};D.prototype.unregister_yield=function(){this.worker&&this.worker.terminate();this.worker=null}}else D.prototype.yield=function(a){setTimeout(()=>{this.do_tick()},a)},D.prototype.register_yield=function(){},D.prototype.unregister_yield=function(){};D.prototype.save_state=function(){return this.cpu.save_state()}; D.prototype.restore_state=function(a){return this.cpu.restore_state(a)};if("object"===typeof performance&&performance.now)D.microtick=performance.now.bind(performance);else if("function"===typeof require){const {performance:a}=require("perf_hooks");D.microtick=a.now.bind(a)}else D.microtick="object"===typeof process&&process.hrtime?function(){var a=process.hrtime();return 1E3*a[0]+a[1]/1E6}:Date.now;var H=H||{};H.exportSymbol=function(a,b){"undefined"!==typeof module&&"undefined"!==typeof module.exports?module.exports[a]=b:"undefined"!==typeof window?window[a]=b:"function"===typeof importScripts&&(self[a]=b)};H.exportProperty=function(){};var k=k||{};k.pads=function(a,b){return(a||0===a?a+"":"").padEnd(b," ")};k.pad0=function(a,b){return(a||0===a?a+"":"").padStart(b,"0")};k.zeros=function(a){return Array(a).fill(0)};k.range=function(a){return Array.from(Array(a).keys())}; k.view=function(a,b,c,d){return new Proxy({},{get:function(e,g){e=new a(b.buffer,c,d);const f=e[g];if("function"===typeof f)return f.bind(e);/^\d+$/.test(g);return f},set:function(e,g,f){/^\d+$/.test(g);(new a(b.buffer,c,d))[g]=f;return!0}})};function B(a,b){a=a?a.toString(16):"";return"0x"+k.pad0(a.toUpperCase(),b||1)} if("undefined"!==typeof crypto&&crypto.getRandomValues){const a=new Int32Array(1);k.get_rand_int=function(){crypto.getRandomValues(a);return a[0]}}else if("undefined"!==typeof require){const a=require("crypto");k.get_rand_int=function(){return a.randomBytes(4).readInt32LE(0)}} (function(){if("function"===typeof Math.clz32)k.int_log2=function(d){return 31-Math.clz32(d)};else{for(var a=new Int8Array(256),b=0,c=-2;256>b;b++)b&b-1||c++,a[b]=c;k.int_log2=function(d){d>>>=0;var e=d>>>16;if(e){var g=e>>>8;return g?24+a[g]:16+a[e]}return(g=d>>>8)?8+a[g]:a[d]}}})();k.round_up_to_next_power_of_2=function(a){return 1>=a?1:1<<1+k.int_log2(a-1)}; function la(a){var b=new Uint8Array(a),c,d;this.length=0;this.push=function(e){this.length!==a&&this.length++;b[d]=e;d=d+1&a-1};this.shift=function(){if(this.length){var e=b[c];c=c+1&a-1;this.length--;return e}return-1};this.peek=function(){return this.length?b[c]:-1};this.clear=function(){this.length=d=c=0};this.clear()}function oa(a){this.size=a;this.data=new Float32Array(a);this.length=this.end=this.start=0} oa.prototype.push=function(a){this.length===this.size?this.start=this.start+1&this.size-1:this.length++;this.data[this.end]=a;this.end=this.end+1&this.size-1};oa.prototype.shift=function(){if(this.length){var a=this.data[this.start];this.start=this.start+1&this.size-1;this.length--;return a}}; oa.prototype.shift_block=function(a){var b=new Float32Array(a);a>this.length&&(a=this.length);var c=this.start+a,d=this.data.subarray(this.start,c);b.set(d);c>=this.size&&(c-=this.size,b.set(this.data.subarray(0,c),d.length));this.start=c;this.length-=a;return b};oa.prototype.peek=function(){if(this.length)return this.data[this.start]};oa.prototype.clear=function(){this.length=this.end=this.start=0}; k.Bitmap=function(a){"number"===typeof a?this.view=new Uint8Array(a+7>>3):a instanceof ArrayBuffer&&(this.view=new Uint8Array(a))};k.Bitmap.prototype.set=function(a,b){const c=a>>3;a=1<<(a&7);this.view[c]=b?this.view[c]|a:this.view[c]&~a};k.Bitmap.prototype.get=function(a){return this.view[a>>3]>>(a&7)&1};k.Bitmap.prototype.get_buffer=function(){return this.view.buffer};k.load_file="undefined"===typeof XMLHttpRequest?pa:qa; function qa(a,b,c){function d(){const l=c||0;setTimeout(()=>{qa(a,b,l+1)},1E3*([1,1,2,3,5,8,13,21][l]||34))}var e=new XMLHttpRequest;e.open(b.method||"get",a,!0);e.responseType=b.as_json?"json":"arraybuffer";if(b.headers)for(var g=Object.keys(b.headers),f=0;fe.status&&d();else if(e.response){if(b.range){const l=e.getResponseHeader("Content-Encoding");l&&"identity"!==l&&console.error("Server sent Content-Encoding in response to ranged request",{filename:a,enc:l})}b.done&&b.done(e.response, e)}};e.onerror=function(l){console.error("Loading the image "+a+" failed",l);d()};b.progress&&(e.onprogress=function(l){b.progress(l)});e.send(null)} function pa(a,b){const c=require("fs");b.range?c.open(a,"r",(d,e)=>{if(d)throw d;d=b.range.length;var g=Buffer.allocUnsafe(d);c.read(e,g,0,d,b.range.start,f=>{if(f)throw f;b.done&&b.done(new Uint8Array(g));c.close(e,h=>{if(h)throw h;})})}):c.readFile(a,{encoding:b.as_json?"utf-8":null},function(d,e){d?console.log("Could not read file:",a,d):(d=e,d=b.as_json?JSON.parse(d):(new Uint8Array(d)).buffer,b.done(d))})} k.read_sized_string_from_mem=function(a,b,c){return String.fromCharCode(...(new Uint8Array(a.buffer,b>>>0,c>>>0)))};(function(){function a(f){this.buffer=f;this.byteLength=f.byteLength;this.onprogress=this.onload=void 0}function b(f,h,l){this.filename=f;this.byteLength=h;this.block_cache=new Map;this.block_cache_is_write=new Set;this.fixed_chunk_size=l;this.cache_reads=!!l;this.onprogress=this.onload=void 0}function c(f,h,l,m,n){const p=f.match(/\.[^\.]+(\.zst)?$/);this.extension=p?p[0]:"";this.basename=f.substring(0,f.length-this.extension.length);this.is_zstd=this.extension.endsWith(".zst");this.basename.endsWith("/")|| (this.basename+="-");this.block_cache=new Map;this.block_cache_is_write=new Set;this.byteLength=h;this.fixed_chunk_size=l;this.partfile_alt_format=!!m;this.zstd_decompress=n;this.cache_reads=!!l;this.onprogress=this.onload=void 0}function d(f){this.file=f;this.byteLength=f.size;1073741824>20)+" MB ...");this.buffer=new ArrayBuffer(f.size);this.onprogress=this.onload=void 0}function e(f){this.file=f;this.byteLength=f.size;this.block_cache= new Map;this.block_cache_is_write=new Set;this.onprogress=this.onload=void 0}k.SyncBuffer=a;k.AsyncXHRBuffer=b;k.AsyncXHRPartfileBuffer=c;k.AsyncFileBuffer=e;k.SyncFileBuffer=d;k.buffer_from_object=function(f,h){if(f.buffer instanceof ArrayBuffer)return new k.SyncBuffer(f.buffer);if("undefined"!==typeof File&&f.buffer instanceof File)return h=f.async,void 0===h&&(h=268435456<=f.buffer.size),h?new k.AsyncFileBuffer(f.buffer):new k.SyncFileBuffer(f.buffer);if(f.url)return f.use_parts?new k.AsyncXHRPartfileBuffer(f.url, f.size,f.fixed_chunk_size,!1,h):new k.AsyncXHRBuffer(f.url,f.size,f.fixed_chunk_size)};a.prototype.load=function(){this.onload&&this.onload({buffer:this.buffer})};a.prototype.get=function(f,h,l){l(new Uint8Array(this.buffer,f,h))};a.prototype.set=function(f,h,l){(new Uint8Array(this.buffer,f,h.byteLength)).set(h);l()};a.prototype.get_buffer=function(f){f(this.buffer)};a.prototype.get_state=function(){const f=[];f[0]=this.byteLength;f[1]=new Uint8Array(this.buffer);return f};a.prototype.set_state= function(f){this.byteLength=f[0];this.buffer=f[1].slice().buffer};b.prototype.load=function(){void 0!==this.byteLength?this.onload&&this.onload(Object.create(null)):g(this.filename,(f,h)=>{if(f)throw Error("Cannot use: "+this.filename+". "+f);this.byteLength=h;this.onload&&this.onload(Object.create(null))})};b.prototype.get_from_cache=function(f,h){var l=h/256;f/=256;for(var m=0;m{l?h(l):h(null,m.size)})}:function(f,h){k.load_file(f,{done:(l,m)=>{l=m.getResponseHeader("Content-Range")||"";(m=l.match(/\/(\d+)\s*$/))?h(null,+m[1]):h("`Range: bytes=...` header not supported (Got `"+l+"`)")},headers:{Range:"bytes=0-0","X-Accept-Encoding":"identity"}})}})();function ra(a,b,c,d,e,g){this.master=new K(this,a,b,d,e,0,g);this.slave=new K(this,a,c,!1,e,1,g);this.current_interface=this.master;this.cpu=a;0===e?(this.ata_port=496,this.irq=14,this.pci_id=240):1===e&&(this.ata_port=368,this.irq=15,this.pci_id=248);this.ata_port_high=this.ata_port|516;this.master_port=46080;this.pci_space=[134,128,16,112,5,0,160,2,0,128,1,1,0,0,0,0,this.ata_port&255|1,this.ata_port>>8,0,0,this.ata_port_high&255|1,this.ata_port_high>>8,0,0,0,0,0,0,0,0,0,0,this.master_port&255|1, this.master_port>>8,0,0,0,0,0,0,0,0,0,0,67,16,212,130,0,0,0,0,0,0,0,0,0,0,0,0,this.irq,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];this.pci_bars=[{size:8},{size:4},void 0,void 0,{size:16}];this.name="ide"+e;this.device_control=2;a.io.register_read(this.ata_port|7,this,function(){this.cpu.device_lower_irq(this.irq);return this.read_status()});a.io.register_read(this.ata_port_high| 2,this,this.read_status);a.io.register_write(this.ata_port_high|2,this,this.write_control);a.io.register_read(this.ata_port|0,this,function(){return this.current_interface.read_data(1)},function(){return this.current_interface.read_data(2)},function(){return this.current_interface.read_data(4)});a.io.register_read(this.ata_port|1,this,function(){B(this.current_interface.error&255);return this.current_interface.error&255});a.io.register_read(this.ata_port|2,this,function(){B(this.current_interface.bytecount& 255);return this.current_interface.bytecount&255});a.io.register_read(this.ata_port|3,this,function(){B(this.current_interface.sector&255);return this.current_interface.sector&255});a.io.register_read(this.ata_port|4,this,function(){B(this.current_interface.cylinder_low&255);return this.current_interface.cylinder_low&255});a.io.register_read(this.ata_port|5,this,function(){B(this.current_interface.cylinder_high&255);return this.current_interface.cylinder_high&255});a.io.register_read(this.ata_port| 6,this,function(){return this.current_interface.drive_head&255});a.io.register_write(this.ata_port|0,this,function(f){this.current_interface.write_data_port8(f)},function(f){this.current_interface.write_data_port16(f)},function(f){this.current_interface.write_data_port32(f)});a.io.register_write(this.ata_port|1,this,function(f){B(f);this.master.lba_count=(this.master.lba_count<<8|f)&65535;this.slave.lba_count=(this.slave.lba_count<<8|f)&65535});a.io.register_write(this.ata_port|2,this,function(f){B(f); this.master.bytecount=(this.master.bytecount<<8|f)&65535;this.slave.bytecount=(this.slave.bytecount<<8|f)&65535});a.io.register_write(this.ata_port|3,this,function(f){B(f);this.master.sector=(this.master.sector<<8|f)&65535;this.slave.sector=(this.slave.sector<<8|f)&65535});a.io.register_write(this.ata_port|4,this,function(f){B(f);this.master.cylinder_low=(this.master.cylinder_low<<8|f)&65535;this.slave.cylinder_low=(this.slave.cylinder_low<<8|f)&65535});a.io.register_write(this.ata_port|5,this,function(f){B(f); this.master.cylinder_high=(this.master.cylinder_high<<8|f)&65535;this.slave.cylinder_high=(this.slave.cylinder_high<<8|f)&65535});a.io.register_write(this.ata_port|6,this,function(f){var h=f&16;B(f,2);this.current_interface=h?this.slave:this.master;this.master.drive_head=f;this.slave.drive_head=f;this.master.is_lba=this.slave.is_lba=f>>6&1;this.master.head=this.slave.head=f&15});this.dma_command=this.dma_status=this.prdt_addr=0;a.io.register_write(this.ata_port|7,this,function(f){this.cpu.device_lower_irq(this.irq); this.current_interface.ata_command(f)});a.io.register_read(this.master_port|4,this,void 0,void 0,this.dma_read_addr);a.io.register_write(this.master_port|4,this,void 0,void 0,this.dma_set_addr);a.io.register_read(this.master_port,this,this.dma_read_command8,void 0,this.dma_read_command);a.io.register_write(this.master_port,this,this.dma_write_command8,void 0,this.dma_write_command);a.io.register_read(this.master_port|2,this,this.dma_read_status);a.io.register_write(this.master_port|2,this,this.dma_write_status); a.io.register_read(this.master_port|8,this,function(){return 0});a.io.register_read(this.master_port|10,this,function(){return 0});a.devices.pci.register_device(this)}ra.prototype.read_status=function(){if(this.current_interface.buffer){var a=this.current_interface.status;B(a,2);return a}return 0};ra.prototype.write_control=function(a){B(a,2);a&4&&(this.cpu.device_lower_irq(this.irq),this.master.device_reset(),this.slave.device_reset());this.device_control=a}; ra.prototype.dma_read_addr=function(){B(this.prdt_addr,8);return this.prdt_addr};ra.prototype.dma_set_addr=function(a){B(a,8);this.prdt_addr=a};ra.prototype.dma_read_status=function(){B(this.dma_status);return this.dma_status};ra.prototype.dma_write_status=function(a){B(a);this.dma_status&=~(a&6)};ra.prototype.dma_read_command=function(){return this.dma_read_command8()|this.dma_read_status()<<16};ra.prototype.dma_read_command8=function(){B(this.dma_command);return this.dma_command}; ra.prototype.dma_write_command=function(a){B(a);this.dma_write_command8(a&255);this.dma_write_status(a>>16&255)}; ra.prototype.dma_write_command8=function(a){B(a);const b=this.dma_command;this.dma_command=a&9;if((b&1)!==(a&1))if(0===(a&1))this.dma_status&=-2;else switch(this.dma_status|=1,this.current_interface.current_command){case 37:case 200:this.current_interface.do_ata_read_sectors_dma();break;case 202:case 53:this.current_interface.do_ata_write_sectors_dma();break;case 160:this.current_interface.do_atapi_dma();break;default:B(this.current_interface.current_command)}}; ra.prototype.push_irq=function(){0===(this.device_control&2)&&(this.dma_status|=4,this.cpu.device_raise_irq(this.irq))};ra.prototype.get_state=function(){var a=[];a[0]=this.master;a[1]=this.slave;a[2]=this.ata_port;a[3]=this.irq;a[4]=this.pci_id;a[5]=this.ata_port_high;a[6]=this.master_port;a[7]=this.name;a[8]=this.device_control;a[9]=this.prdt_addr;a[10]=this.dma_status;a[11]=this.current_interface===this.master;a[12]=this.dma_command;return a}; ra.prototype.set_state=function(a){this.master.set_state(a[0]);this.slave.set_state(a[1]);this.ata_port=a[2];this.irq=a[3];this.pci_id=a[4];this.ata_port_high=a[5];this.master_port=a[6];this.name=a[7];this.device_control=a[8];this.prdt_addr=a[9];this.dma_status=a[10];this.current_interface=a[11]?this.master:this.slave;this.dma_command=a[12]}; function K(a,b,c,d,e,g,f){this.device=a;this.bus=f;this.nr=e;this.cpu=b;this.buffer=c;this.sector_size=d?2048:512;this.is_atapi=d;this.cylinder_count=this.sectors_per_track=this.head_count=this.sector_count=0;this.buffer&&(this.sector_count=this.buffer.byteLength/this.sector_size,this.sector_count!==(this.sector_count|0)&&(this.sector_count=Math.ceil(this.sector_count)),d?(this.head_count=1,this.sectors_per_track=0):(this.head_count=16,this.sectors_per_track=63),this.cylinder_count=this.sector_count/ this.head_count/this.sectors_per_track,this.cylinder_count!==(this.cylinder_count|0)&&(this.cylinder_count=Math.floor(this.cylinder_count)),a=b.devices.rtc,a.cmos_write(57,a.cmos_read(57)|1<<4*this.nr),a.cmos_write(18,a.cmos_read(18)&15|240),a.cmos_write(27,this.cylinder_count&255),a.cmos_write(28,this.cylinder_count>>8&255),a.cmos_write(29,this.head_count&255),a.cmos_write(30,255),a.cmos_write(31,255),a.cmos_write(32,200),a.cmos_write(33,this.cylinder_count&255),a.cmos_write(34,this.cylinder_count>> 8&255),a.cmos_write(35,this.sectors_per_track&255));this.buffer=c;this.drive_head=this.head=this.cylinder_high=this.cylinder_low=this.lba_count=this.sector=this.bytecount=this.is_lba=0;this.status=80;this.sectors_per_drq=128;this.data_pointer=this.error=0;this.data=new Uint8Array(65536);this.data16=new Uint16Array(this.data.buffer);this.data32=new Int32Array(this.data.buffer);this.data_end=this.data_length=0;this.current_atapi_command=this.current_command=-1;this.last_io_id=this.write_dest=0;this.in_progress_io_ids= new Set;this.cancelled_io_ids=new Set;Object.seal(this)}K.prototype.device_reset=function(){this.is_atapi?(this.status=0,this.sector=this.error=this.bytecount=1,this.cylinder_low=20,this.cylinder_high=235):(this.status=81,this.sector=this.error=this.bytecount=1,this.cylinder_high=this.cylinder_low=0);this.cancel_io_operations()};K.prototype.push_irq=function(){this.device.push_irq()}; K.prototype.ata_command=function(a){B(a);if(this.buffer)switch(this.current_command=a,this.error=0,a){case 8:this.data_length=this.data_end=this.data_pointer=0;this.device_reset();this.push_irq();break;case 16:this.status=80;this.cylinder_low=0;this.push_irq();break;case 248:this.status=80;a=this.sector_count-1;this.sector=a&255;this.cylinder_low=a>>8&255;this.cylinder_high=a>>16&255;this.drive_head=this.drive_head&240|a>>24&15;this.push_irq();break;case 39:this.status=80;a=this.sector_count-1;this.sector= a&255;this.cylinder_low=a>>8&255;this.cylinder_high=a>>16&255;this.sector|=a>>24<<8&65280;this.push_irq();break;case 32:case 36:case 41:case 196:this.ata_read_sectors(a);break;case 48:case 52:case 57:case 197:this.ata_write_sectors(a);break;case 144:this.push_irq();this.error=257;this.status=80;break;case 145:this.status=80;this.push_irq();break;case 160:this.is_atapi&&(this.status=88,this.data_allocate(12),this.data_end=12,this.bytecount=1,this.push_irq());break;case 161:this.is_atapi?(this.create_identify_packet(), this.status=88,this.cylinder_low=20,this.cylinder_high=235):this.status=65;this.push_irq();break;case 198:B(this.bytecount&255);this.sectors_per_drq=this.bytecount&255;this.status=80;this.push_irq();break;case 37:case 200:this.ata_read_sectors_dma(a);break;case 53:case 202:this.ata_write_sectors_dma(a);break;case 64:this.status=80;this.push_irq();break;case 218:this.status=65;this.error=4;this.push_irq();break;case 224:this.status=80;this.push_irq();break;case 225:this.status=80;this.push_irq();break; case 231:this.status=80;this.push_irq();break;case 236:if(this.is_atapi){this.status=65;this.error=4;this.push_irq();break}this.create_identify_packet();this.status=88;this.push_irq();break;case 234:this.status=80;this.push_irq();break;case 239:B(this.bytecount&255);this.status=80;this.push_irq();break;case 222:this.status=80;this.push_irq();break;case 245:this.status=80;this.push_irq();break;case 249:this.status=65;this.error=4;break;default:B(a),this.status=65,this.error=4}else this.error=4,this.status= 65,this.push_irq()}; K.prototype.atapi_handle=function(){B(this.data[0]);this.data_pointer=0;this.current_atapi_command=this.data[0];switch(this.current_atapi_command){case 0:this.data_allocate(0);this.data_end=this.data_length;this.status=80;break;case 3:this.data_allocate(this.data[4]);this.data_end=this.data_length;this.status=88;this.data[0]=240;this.data[2]=5;this.data[7]=8;break;case 18:var a=this.data[4];this.status=88;B(this.data[1],2);this.data.set([5,128,1,49,31,0,0,0,83,79,78,89,32,32,32,32,67,68,45,82,79, 77,32,67,68,85,45,49,48,48,48,32,49,46,49,97]);this.data_end=this.data_length=Math.min(36,a);break;case 26:this.data_allocate(this.data[4]);this.data_end=this.data_length;this.status=88;break;case 30:this.data_allocate(0);this.data_end=this.data_length;this.status=80;break;case 37:a=this.sector_count-1;this.data_set(new Uint8Array([a>>24&255,a>>16&255,a>>8&255,a&255,0,0,this.sector_size>>8&255,this.sector_size&255]));this.data_end=this.data_length;this.status=88;break;case 40:this.lba_count&1?this.atapi_read_dma(this.data): this.atapi_read(this.data);break;case 66:a=this.data[8];this.data_allocate(Math.min(8,a));this.data_end=this.data_length;this.status=88;break;case 67:a=this.data[8]|this.data[7]<<8;var b=this.data[9]>>6;this.data_allocate(a);this.data_end=this.data_length;B(b,2);B(this.data[6]);0===b?(a=this.sector_count,this.data.set(new Uint8Array([0,18,1,1,0,20,1,0,0,0,0,0,0,22,170,0,a>>24,a>>16&255,a>>8&255,a&255]))):1===b&&this.data.set(new Uint8Array([0,10,1,1,0,0,0,0,0,0,0,0]));this.status=88;break;case 70:a= this.data[8]|this.data[7]<<8;a=Math.min(a,32);this.data_allocate(a);this.data_end=this.data_length;this.data[0]=a-4>>24&255;this.data[1]=a-4>>16&255;this.data[2]=a-4>>8&255;this.data[3]=a-4&255;this.data[6]=8;this.data[10]=3;this.status=88;break;case 81:this.data_allocate(0);this.data_end=this.data_length;this.status=80;break;case 82:B(this.data[0]);this.status=81;this.data_length=0;this.error=80;break;case 90:a=this.data[8]|this.data[7]<<8;b=this.data[2];B(b);42===b&&this.data_allocate(Math.min(30, a));this.data_end=this.data_length;this.status=88;break;case 189:this.data_allocate(this.data[9]|this.data[8]<<8);this.data_end=this.data_length;this.data[5]=1;this.status=88;break;case 74:this.status=81;this.data_length=0;this.error=80;B(this.data[0]);break;case 190:B(this.data[0]);this.data_allocate(0);this.data_end=this.data_length;this.status=80;break;default:this.status=81,this.data_length=0,this.error=80,B(this.data[0])}this.bytecount=this.bytecount&-8|2;0===(this.status&128)&&this.push_irq(); 0===(this.status&128)&&0===this.data_length&&(this.bytecount|=1,this.status&=-9)};K.prototype.do_write=function(){this.status=80;var a=this.data.subarray(0,this.data_length);this.ata_advance(this.current_command,this.data_length/512);this.push_irq();this.buffer.set(this.write_dest,a,function(){});this.report_write(this.data_length)}; K.prototype.atapi_read=function(a){var b=a[2]<<24|a[3]<<16|a[4]<<8|a[5],c=a[7]<<8|a[8];a=a[1];var d=c*this.sector_size,e=b*this.sector_size;ta("CD read lba="+B(b)+" lbacount="+B(c)+" bytecount="+B(d)+" flags="+B(a),32768);this.data_length=0;var g=this.cylinder_high<<8&65280|this.cylinder_low&255;ta(B(this.cylinder_high,2)+" "+B(this.cylinder_low,2),32768);this.cylinder_low=this.cylinder_high=0;65535===g&&g--;g>d&&(g=d);e>=this.buffer.byteLength?(ua(!1,"CD read: Outside of disk end="+B(e+d)+" size="+ B(this.buffer.byteLength),32768),this.status=255,this.push_irq()):0===d?(this.status=80,this.data_pointer=0):(d=Math.min(d,this.buffer.byteLength-e),this.status=208,this.report_read_start(),this.read_buffer(e,d,f=>{this.data_set(f);this.status=88;this.bytecount=this.bytecount&-8|2;this.push_irq();this.data_end=g&=-4;this.data_end>this.data_length&&(this.data_end=this.data_length);this.cylinder_low=this.data_end&255;this.cylinder_high=this.data_end>>8&255;this.report_read_end(d)}))}; K.prototype.atapi_read_dma=function(a){var b=a[2]<<24|a[3]<<16|a[4]<<8|a[5],c=a[7]<<8|a[8];a=a[1];var d=c*this.sector_size,e=b*this.sector_size;ta("CD read DMA lba="+B(b)+" lbacount="+B(c)+" bytecount="+B(d)+" flags="+B(a),32768);e>=this.buffer.byteLength?(ua(!1,"CD read: Outside of disk end="+B(e+d)+" size="+B(this.buffer.byteLength),32768),this.status=255,this.push_irq()):(this.status=208,this.report_read_start(),this.read_buffer(e,d,g=>{this.report_read_end(d);this.status=88;this.bytecount=this.bytecount& -8|2;this.data_set(g);this.do_atapi_dma()}))}; K.prototype.do_atapi_dma=function(){if(0!==(this.device.dma_status&1)&&0!==(this.status&8)){var a=this.device.prdt_addr,b=0,c=this.data;do{var d=this.cpu.read32s(a),e=this.cpu.read16(a+4),g=this.cpu.read8(a+7)&128;e||(e=65536);B(d);B(e);B(this.data_length);this.cpu.write_blob(c.subarray(b,Math.min(b+e,this.data_length)),d);b+=e;a+=8;if(b>=this.data_length&&!g){B(b);B(this.data_length);B(this.current_command);break}}while(!g);this.status=80;this.device.dma_status&=-2;this.bytecount=this.bytecount& -8|3;this.push_irq()}};K.prototype.read_data=function(a){if(this.data_pointer>>1]:this.data32[this.data_pointer>>>2];this.data_pointer+=a;0===(this.data_pointer&(0===(this.data_end&4095)?4095:255))&&(B(this.data[this.data_pointer],2),B(this.data_pointer),B(this.data_length));this.data_pointer>=this.data_end&&this.read_end();return b}this.data_pointer+=a;return 0}; K.prototype.read_end=function(){B(this.current_command);B(this.data_pointer);B(this.data_end);B(this.data_length);if(160===this.current_command)if(this.data_end===this.data_length)this.status=80,this.bytecount=this.bytecount&-8|3,this.push_irq();else{this.status=88;this.bytecount=this.bytecount&-8|2;this.push_irq();var a=this.cylinder_high<<8&65280|this.cylinder_low&255;this.data_end+a>this.data_length?(this.cylinder_low=this.data_length-this.data_end&255,this.cylinder_high=this.data_length-this.data_end>> 8&255,this.data_end=this.data_length):this.data_end+=a;B(this.data_end)}else this.error=0,this.data_pointer>=this.data_length?this.status=80:(a=196===this.current_command||41===this.current_command?Math.min(this.sectors_per_drq,(this.data_length-this.data_end)/512):1,this.ata_advance(this.current_command,a),this.data_end+=512*a,this.status=88,this.push_irq())}; K.prototype.write_data_port=function(a,b){if(this.data_pointer>=this.data_end)B(a),B(this.data_end),B(this.data_pointer);else{if(0===(this.data_pointer+b&(0===(this.data_end&4095)?4095:255))||20>this.data_end)B(a>>>0),B(this.data_end),B(this.data_pointer);1===b?this.data[this.data_pointer++]=a:2===b?(this.data16[this.data_pointer>>>1]=a,this.data_pointer+=2):(this.data32[this.data_pointer>>>2]=a,this.data_pointer+=4);this.data_pointer===this.data_end&&this.write_end()}}; K.prototype.write_data_port8=function(a){this.write_data_port(a,1)};K.prototype.write_data_port16=function(a){this.write_data_port(a,2)};K.prototype.write_data_port32=function(a){this.write_data_port(a,4)};K.prototype.write_end=function(){160===this.current_command?this.atapi_handle():(B(this.data_pointer),B(this.data_length),this.data_pointer>=this.data_length?this.do_write():(B(this.current_command),this.status=88,this.data_end+=512,this.push_irq()))}; K.prototype.ata_advance=function(a,b){this.bytecount-=b;36===a||41===a||52===a||57===a||37===a||53===a?(a=b+this.get_lba48(),this.sector=a&255|a>>16&65280,this.cylinder_low=a>>8&255,this.cylinder_high=a>>16&255):this.is_lba?(a=b+this.get_lba28(),this.sector=a&255,this.cylinder_low=a>>8&255,this.cylinder_high=a>>16&255,this.head=this.head&-16|a&15):(a=b+this.get_chs(),b=a/(this.head_count*this.sectors_per_track)|0,this.cylinder_low=b&255,this.cylinder_high=b>>8&255,this.head=(a/this.sectors_per_track| 0)%this.head_count&15,this.sector=a%this.sectors_per_track+1&255,this.get_chs())}; K.prototype.ata_read_sectors=function(a){var b=36===a||41===a,c=this.get_count(b);b=this.get_lba(b);var d=32===a||36===a,e=c*this.sector_size,g=b*this.sector_size;ta("ATA read cmd="+B(a)+" mode="+(this.is_lba?"lba":"chs")+" lba="+B(b)+" lbacount="+B(c)+" bytecount="+B(e),32768);g+e>this.buffer.byteLength?(this.status=255,this.push_irq()):(this.status=192,this.report_read_start(),this.read_buffer(g,e,f=>{this.data_set(f);this.status=88;this.data_end=d?512:Math.min(e,512*this.sectors_per_drq);this.ata_advance(a, d?1:Math.min(c,this.sectors_per_track));this.push_irq();this.report_read_end(e)}))};K.prototype.ata_read_sectors_dma=function(a){var b=37===a;a=this.get_count(b);b=this.get_lba(b);var c=a*this.sector_size,d=b*this.sector_size;B(b);B(a);B(c);d+c>this.buffer.byteLength?(this.status=255,this.push_irq()):(this.status=88,this.device.dma_status|=1)}; K.prototype.do_ata_read_sectors_dma=function(){var a=37===this.current_command,b=this.get_count(a);a=this.get_lba(a);var c=b*this.sector_size;a*=this.sector_size;this.report_read_start();this.read_buffer(a,c,d=>{var e=this.device.prdt_addr,g=0;do{var f=this.cpu.read32s(e),h=this.cpu.read16(e+4),l=this.cpu.read8(e+7)&128;h||(h=65536);B(f);B(h);this.cpu.write_blob(d.subarray(g,g+h),f);g+=h;e+=8}while(!l);this.ata_advance(this.current_command,b);this.status=80;this.device.dma_status&=-2;this.current_command= -1;this.push_irq();this.report_read_end(c)})};K.prototype.ata_write_sectors=function(a){var b=52===a||57===a,c=this.get_count(b);b=this.get_lba(b);a=48===a||52===a;var d=c*this.sector_size,e=b*this.sector_size;B(b);B(c);B(d);e+d>this.buffer.byteLength?(this.status=255,this.push_irq()):(this.status=88,this.data_allocate_noclear(d),this.data_end=a?512:Math.min(d,512*this.sectors_per_drq),this.write_dest=e)}; K.prototype.ata_write_sectors_dma=function(a){var b=53===a;a=this.get_count(b);b=this.get_lba(b);var c=a*this.sector_size,d=b*this.sector_size;B(b);B(a);B(c);d+c>this.buffer.byteLength?(this.status=255,this.push_irq()):(this.status=88,this.device.dma_status|=1)}; K.prototype.do_ata_write_sectors_dma=function(){var a=53===this.current_command,b=this.get_count(a),c=this.get_lba(a);a=b*this.sector_size;c*=this.sector_size;var d=this.device.prdt_addr,e=0;ta("prdt addr: "+B(d,8),32768);const g=new Uint8Array(a);do{var f=this.cpu.read32s(d),h=this.cpu.read16(d+4),l=this.cpu.read8(d+7)&128;h||(h=65536);ta("dma write transfer dest="+B(f)+" prd_count="+B(h),32768);f=this.cpu.mem8.subarray(f,f+h);g.set(f,e);e+=h;d+=8}while(!l);this.buffer.set(c,g,()=>{this.ata_advance(this.current_command, b);this.status=80;this.push_irq();this.device.dma_status&=-2;this.current_command=-1});this.report_write(a)};K.prototype.get_chs=function(){return((this.cylinder_low&255|this.cylinder_high<<8&65280)*this.head_count+this.head)*this.sectors_per_track+(this.sector&255)-1};K.prototype.get_lba28=function(){return this.sector&255|this.cylinder_low<<8&65280|this.cylinder_high<<16&16711680|(this.head&15)<<24}; K.prototype.get_lba48=function(){return(this.sector&255|this.cylinder_low<<8&65280|this.cylinder_high<<16&16711680|this.sector>>8<<24&4278190080)>>>0};K.prototype.get_lba=function(a){return a?this.get_lba48():this.is_lba?this.get_lba28():this.get_chs()};K.prototype.get_count=function(a){a?(a=this.bytecount,0===a&&(a=65536)):(a=this.bytecount&255,0===a&&(a=256));return a}; K.prototype.create_identify_packet=function(){if(this.drive_head&16)this.data_allocate(0);else{for(var a=0;512>a;a++)this.data[a]=0;a=Math.min(16383,this.cylinder_count);this.data_set([64,this.is_atapi?133:0,a,a>>8,0,0,this.head_count,this.head_count>>8,this.sectors_per_track/512,this.sectors_per_track/512>>8,0,2,this.sectors_per_track,this.sectors_per_track>>8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,4,0,0,0,0,0,0,0,0,0,56,118,32,54,68,72,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,128,0,1,0,0,2,0,0,0,2,0,2,7,0,a,a>>8,this.head_count,this.head_count>>8,this.sectors_per_track,0,this.sector_count&255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255,0,0,this.sector_count&255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255,0,0,160===this.current_command?0:7,160===this.current_command?0:4,0,0,30,0,30,0,30,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0, 0,0,0,0,0,116,0,64,0,64,0,116,0,64,0,0,0,0,0,0,0,0,0,0,1,96,0,0,0,0,0,0,0,0,0,0,0,0,this.sector_count&255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255]);this.data_end=this.data_length=512}};K.prototype.data_allocate=function(a){this.data_allocate_noclear(a);for(var b=0;b>2;b++)this.data32[b]=0}; K.prototype.data_allocate_noclear=function(a){this.data.length{this.cancelled_io_ids.delete(d)?this.in_progress_io_ids.has(d):(this.in_progress_io_ids.delete(d),c(e))})};K.prototype.cancel_io_operations=function(){for(const a of this.in_progress_io_ids)this.cancelled_io_ids.add(a);this.in_progress_io_ids.clear()}; K.prototype.get_state=function(){var a=[];a[0]=this.bytecount;a[1]=this.cylinder_count;a[2]=this.cylinder_high;a[3]=this.cylinder_low;a[4]=this.data_pointer;a[5]=0;a[6]=0;a[7]=0;a[8]=0;a[9]=this.drive_head;a[10]=this.error;a[11]=this.head;a[12]=this.head_count;a[13]=this.is_atapi;a[14]=this.is_lba;a[15]=this.lba_count;a[16]=this.data;a[17]=this.data_length;a[18]=this.sector;a[19]=this.sector_count;a[20]=this.sector_size;a[21]=this.sectors_per_drq;a[22]=this.sectors_per_track;a[23]=this.status;a[24]= this.write_dest;a[25]=this.current_command;a[26]=this.data_end;a[27]=this.current_atapi_command;a[28]=this.buffer;return a}; K.prototype.set_state=function(a){this.bytecount=a[0];this.cylinder_count=a[1];this.cylinder_high=a[2];this.cylinder_low=a[3];this.data_pointer=a[4];this.drive_head=a[9];this.error=a[10];this.head=a[11];this.head_count=a[12];this.is_atapi=a[13];this.is_lba=a[14];this.lba_count=a[15];this.data=a[16];this.data_length=a[17];this.sector=a[18];this.sector_count=a[19];this.sector_size=a[20];this.sectors_per_drq=a[21];this.sectors_per_track=a[22];this.status=a[23];this.write_dest=a[24];this.current_command= a[25];this.data_end=a[26];this.current_atapi_command=a[27];this.data16=new Uint16Array(this.data.buffer);this.data32=new Int32Array(this.data.buffer);this.buffer&&this.buffer.set_state(a[28])};function va(a){this.pci_addr=new Uint8Array(4);this.pci_value=new Uint8Array(4);this.pci_response=new Uint8Array(4);this.pci_status=new Uint8Array(4);this.pci_addr32=new Int32Array(this.pci_addr.buffer);this.pci_value32=new Int32Array(this.pci_value.buffer);this.pci_response32=new Int32Array(this.pci_response.buffer);this.pci_status32=new Int32Array(this.pci_status.buffer);this.device_spaces=[];this.devices=[];this.cpu=a;for(var b=0;256>b;b++)this.device_spaces[b]=void 0,this.devices[b]=void 0;this.io= a.io;a.io.register_write(3324,this,function(c){this.pci_write8(this.pci_addr32[0],c)},function(c){this.pci_write16(this.pci_addr32[0],c)},function(c){this.pci_write32(this.pci_addr32[0],c)});a.io.register_write(3325,this,function(c){this.pci_write8(this.pci_addr32[0]+1|0,c)});a.io.register_write(3326,this,function(c){this.pci_write8(this.pci_addr32[0]+2|0,c)},function(c){this.pci_write16(this.pci_addr32[0]+2|0,c)});a.io.register_write(3327,this,function(c){this.pci_write8(this.pci_addr32[0]+3|0,c)}); a.io.register_read_consecutive(3324,this,function(){return this.pci_response[0]},function(){return this.pci_response[1]},function(){return this.pci_response[2]},function(){return this.pci_response[3]});a.io.register_read_consecutive(3320,this,function(){return this.pci_status[0]},function(){return this.pci_status[1]},function(){return this.pci_status[2]},function(){return this.pci_status[3]});a.io.register_write_consecutive(3320,this,function(c){this.pci_addr[0]=c&252},function(c){2===(this.pci_addr[1]& 6)&&6===(c&6)?a.reboot_internal():this.pci_addr[1]=c},function(c){this.pci_addr[2]=c},function(c){this.pci_addr[3]=c;this.pci_query()});this.register_device({pci_id:0,pci_space:[134,128,55,18,0,0,0,0,2,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0],pci_bars:[],name:"82441FX PMC"});this.isa_bridge={pci_id:8,pci_space:[134,128,0,112,7,0,0,2,0,0,1,6,0,0,128,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],pci_bars:[],name:"82371SB PIIX3 ISA"};this.isa_bridge_space=this.register_device(this.isa_bridge);this.isa_bridge_space8=new Uint8Array(this.isa_bridge_space.buffer)}va.prototype.get_state=function(){for(var a=[],b=0;256>b;b++)a[b]=this.device_spaces[b];a[256]=this.pci_addr;a[257]=this.pci_value;a[258]=this.pci_response;a[259]=this.pci_status;return a}; va.prototype.set_state=function(a){for(var b=0;256>b;b++){var c=this.devices[b],d=a[b];if(c&&d){for(var e=0;e>3&31;var d="query enabled="+(this.pci_addr[3]>>7)+(" bdf="+B(a,4));d+=" dev="+B(c,2);d+=" addr="+B(b,2);a=this.device_spaces[a];void 0!==a?(this.pci_status32[0]=-2147483648,this.pci_response32[0]=b>2]:0,d+=" "+B(this.pci_addr32[0]>>>0,8)+" -> "+B(this.pci_response32[0]>>>0,8)):(this.pci_response32[0]=-1,this.pci_status32[0]=0)}; va.prototype.pci_write8=function(a,b){var c=a>>8&65535;a&=255;var d=new Uint8Array(this.device_spaces[c].buffer);B(a);B(c>>3,2);B(a,4);B(b,2);d[a]=b};va.prototype.pci_write16=function(a,b){var c=a>>8&65535;a&=255;var d=new Uint16Array(this.device_spaces[c].buffer);16<=a&&44>a?B(a):(B(a),B(c>>3,2),B(a,4),B(b,4),d[a>>>1]=b)}; va.prototype.pci_write32=function(a,b){var c=a>>8&65535;a&=255;var d=this.device_spaces[c],e=this.devices[c];if(d)if(16<=a&&40>a){e=e.pci_bars[a-16>>2];B(b>>>0);B(c>>3,2);if(e){c=a>>2;var g=d[c]&1;-1===(b|3|e.size-1)?(b=~(e.size-1)|g,0===g&&(d[c]=b)):0===g&&(d[c]=e.original_bar);if(1===g){g=d[c]&65534;var f=b&65534;B(g>>>0,8);B(f>>>0,8);this.set_io_bars(e,g,f);d[c]=b|1}}else d[a>>2]=0;B(d[a>>2]>>>0)}else 48===a?(B(c>>3,2),B(b>>>0,8),d[a>>2]=e.pci_rom_size?-1===(b|2047)?-e.pci_rom_size|0:e.pci_rom_address| 0:0):4===a?(B(c>>3,2),B(a,4),B(b>>>0,8)):(B(c>>3,2),B(a,4),B(b>>>0,8),d[a>>>2]=b)};va.prototype.register_device=function(a){var b=a.pci_id;B(b);var c=new Int32Array(64);c.set(new Int32Array((new Uint8Array(a.pci_space)).buffer));this.device_spaces[b]=c;this.devices[b]=a;b=c.slice(4,10);for(var d=0;d>8&255)-1+((a>>3)-1&255)&3)])};va.prototype.lower_irq=function(a){this.cpu.device_lower_irq(this.isa_bridge_space8[96+((this.device_spaces[a][15]>>8&255)+(a>>3&255)-2&3)])};function L(a,b){this.io=a.io;this.cpu=a;this.dma=a.devices.dma;this.bytes_expecting=0;this.receiving_command=new Uint8Array(10);this.receiving_index=0;this.next_command=null;this.response_data=new Uint8Array(10);this.last_head=this.last_cylinder=this.drive=this.status_reg2=this.status_reg1=this.status_reg0=this.response_length=this.response_index=0;this.last_sector=1;this.dir=this.dor=0;this.fdb_image=this.fda_image=null;b?this.set_fda(b):(this.eject_fda(),this.cpu.devices.rtc.cmos_write(16,64)); this.io.register_read(1008,this,this.port3F0_read);this.io.register_read(1010,this,this.port3F2_read);this.io.register_read(1012,this,this.port3F4_read);this.io.register_read(1013,this,this.port3F5_read);this.io.register_read(1015,this,this.port3F7_read);this.io.register_write(1010,this,this.port3F2_write);this.io.register_write(1012,this,this.port3F4_write);this.io.register_write(1013,this,this.port3F5_write)} L.prototype.eject_fda=function(){this.fda_image=null;this.number_of_cylinders=this.number_of_heads=this.sectors_per_track=0;this.dir=128}; L.prototype.set_fda=function(a){var b={[163840]:{type:1,tracks:40,sectors:8,heads:1},[184320]:{type:1,tracks:40,sectors:9,heads:1},[204800]:{type:1,tracks:40,sectors:10,heads:1},[327680]:{type:1,tracks:40,sectors:8,heads:2},[368640]:{type:1,tracks:40,sectors:9,heads:2},[409600]:{type:1,tracks:40,sectors:10,heads:2},[737280]:{type:3,tracks:80,sectors:9,heads:2},[1228800]:{type:2,tracks:80,sectors:15,heads:2},[1474560]:{type:4,tracks:80,sectors:18,heads:2},[1763328]:{type:5,tracks:82,sectors:21,heads:2}, [2949120]:{type:5,tracks:80,sectors:36,heads:2},512:{type:1,tracks:1,sectors:1,heads:1}};let c=a.byteLength,d=b[c];d||(c=1474560>4);B(a);this.dor=a};L.prototype.check_drive_status=function(){this.status_reg1=this.fda_image?0:5;this.response_index=0;this.response_length=1;this.response_data[0]=0}; L.prototype.seek=function(a){if(0===(a[0]&3)){var b=a[1];a=a[0]>>2&1;b!==this.last_cylinder&&(this.dir=0);this.status_reg1=this.fda_image?0:5;this.status_reg0=32;this.last_cylinder=b;this.last_head=a}this.raise_irq()};L.prototype.calibrate=function(a){this.seek([a[0],0])};L.prototype.check_interrupt_status=function(){this.response_index=0;this.response_length=2;this.response_data[0]=this.status_reg0;this.response_data[1]=this.last_cylinder}; L.prototype.do_sector=function(a,b){var c=b[2],d=b[1],e=b[3],g=128<this.sectors_per_track&&(d=1,c++,c>=this.number_of_heads&&(c=0,b++)),b!==this.last_cylinder&&(this.dir=0),this.status_reg0=32,this.last_cylinder=b,this.last_head=c,this.last_sector=d,this.response_index=0,this.response_length=7,this.response_data[0]=c<<2|32,this.response_data[1]=0,this.response_data[2]=0,this.response_data[3]=b,this.response_data[4]=c,this.response_data[5]=d,this.response_data[6]=a[4],this.raise_irq())}; L.prototype.fix_drive_data=function(a){a.slice(0,this.bytes_expecting)};L.prototype.configure=function(a){a.slice(0,this.bytes_expecting)};L.prototype.read_sector_id=function(){this.response_index=0;this.response_length=7;this.response_data[0]=0;this.response_data[1]=0;this.response_data[2]=0;this.response_data[3]=0;this.response_data[4]=0;this.response_data[5]=0;this.response_data[6]=0;this.raise_irq()};L.prototype.raise_irq=function(){this.dor&8&&this.cpu.device_raise_irq(6)};E.prototype.mmap_read8=function(a){return this.memory_map_read8[a>>>17](a)};E.prototype.mmap_write8=function(a,b){this.memory_map_write8[a>>>17](a,b)};E.prototype.mmap_read16=function(a){var b=this.memory_map_read8[a>>>17];return b(a)|b(a+1|0)<<8};E.prototype.mmap_write16=function(a,b){var c=this.memory_map_write8[a>>>17];c(a,b&255);c(a+1|0,b>>8)};E.prototype.mmap_read32=function(a){return this.memory_map_read32[a>>>17](a)}; E.prototype.mmap_write32=function(a,b){this.memory_map_write32[a>>>17](a,b)};E.prototype.mmap_write64=function(a,b,c){var d=this.memory_map_write32[a>>>17];d(a,b);d(a+4,c)};E.prototype.mmap_write128=function(a,b,c,d,e){var g=this.memory_map_write32[a>>>17];g(a,b);g(a+4,c);g(a+8,d);g(a+12,e)};E.prototype.write_blob=function(a,b){a.length&&(this.in_mapped_range(b),this.in_mapped_range(b+a.length-1),this.jit_dirty_cache(b,b+a.length),this.mem8.set(a,b))}; E.prototype.read_blob=function(a,b){b&&(this.in_mapped_range(a),this.in_mapped_range(a+b-1));return this.mem8.subarray(a,a+b)};function M(a){this.cpu=a;this.channel_page=new Uint8Array(8);this.channel_pagehi=new Uint8Array(8);this.channel_addr=new Uint16Array(8);this.channel_addr_init=new Uint16Array(8);this.channel_count=new Uint16Array(8);this.channel_count_init=new Uint16Array(8);this.channel_mask=new Uint8Array(8);this.channel_mode=new Uint8Array(8);this.unmask_listeners=[];this.lsb_msb_flipflop=0;a=a.io;a.register_write(0,this,this.port_addr_write.bind(this,0));a.register_write(2,this,this.port_addr_write.bind(this, 1));a.register_write(4,this,this.port_addr_write.bind(this,2));a.register_write(6,this,this.port_addr_write.bind(this,3));a.register_write(1,this,this.port_count_write.bind(this,0));a.register_write(3,this,this.port_count_write.bind(this,1));a.register_write(5,this,this.port_count_write.bind(this,2));a.register_write(7,this,this.port_count_write.bind(this,3));a.register_read(0,this,this.port_addr_read.bind(this,0));a.register_read(2,this,this.port_addr_read.bind(this,1));a.register_read(4,this,this.port_addr_read.bind(this, 2));a.register_read(6,this,this.port_addr_read.bind(this,3));a.register_read(1,this,this.port_count_read.bind(this,0));a.register_read(3,this,this.port_count_read.bind(this,1));a.register_read(5,this,this.port_count_read.bind(this,2));a.register_read(7,this,this.port_count_read.bind(this,3));a.register_write(192,this,this.port_addr_write.bind(this,4));a.register_write(196,this,this.port_addr_write.bind(this,5));a.register_write(200,this,this.port_addr_write.bind(this,6));a.register_write(204,this, this.port_addr_write.bind(this,7));a.register_write(194,this,this.port_count_write.bind(this,4));a.register_write(198,this,this.port_count_write.bind(this,5));a.register_write(202,this,this.port_count_write.bind(this,6));a.register_write(206,this,this.port_count_write.bind(this,7));a.register_read(192,this,this.port_addr_read.bind(this,4));a.register_read(196,this,this.port_addr_read.bind(this,5));a.register_read(200,this,this.port_addr_read.bind(this,6));a.register_read(204,this,this.port_addr_read.bind(this, 7));a.register_read(194,this,this.port_count_read.bind(this,4));a.register_read(198,this,this.port_count_read.bind(this,5));a.register_read(202,this,this.port_count_read.bind(this,6));a.register_read(206,this,this.port_count_read.bind(this,7));a.register_write(135,this,this.port_page_write.bind(this,0));a.register_write(131,this,this.port_page_write.bind(this,1));a.register_write(129,this,this.port_page_write.bind(this,2));a.register_write(130,this,this.port_page_write.bind(this,3));a.register_write(143, this,this.port_page_write.bind(this,4));a.register_write(139,this,this.port_page_write.bind(this,5));a.register_write(137,this,this.port_page_write.bind(this,6));a.register_write(138,this,this.port_page_write.bind(this,7));a.register_read(135,this,this.port_page_read.bind(this,0));a.register_read(131,this,this.port_page_read.bind(this,1));a.register_read(129,this,this.port_page_read.bind(this,2));a.register_read(130,this,this.port_page_read.bind(this,3));a.register_read(143,this,this.port_page_read.bind(this, 4));a.register_read(139,this,this.port_page_read.bind(this,5));a.register_read(137,this,this.port_page_read.bind(this,6));a.register_read(138,this,this.port_page_read.bind(this,7));a.register_write(1159,this,this.port_pagehi_write.bind(this,0));a.register_write(1155,this,this.port_pagehi_write.bind(this,1));a.register_write(1153,this,this.port_pagehi_write.bind(this,2));a.register_write(1154,this,this.port_pagehi_write.bind(this,3));a.register_write(1163,this,this.port_pagehi_write.bind(this,5)); a.register_write(1161,this,this.port_pagehi_write.bind(this,6));a.register_write(1162,this,this.port_pagehi_write.bind(this,7));a.register_read(1159,this,this.port_pagehi_read.bind(this,0));a.register_read(1155,this,this.port_pagehi_read.bind(this,1));a.register_read(1153,this,this.port_pagehi_read.bind(this,2));a.register_read(1154,this,this.port_pagehi_read.bind(this,3));a.register_read(1163,this,this.port_pagehi_read.bind(this,5));a.register_read(1161,this,this.port_pagehi_read.bind(this,6));a.register_read(1162, this,this.port_pagehi_read.bind(this,7));a.register_write(10,this,this.port_singlemask_write.bind(this,0));a.register_write(212,this,this.port_singlemask_write.bind(this,4));a.register_write(15,this,this.port_multimask_write.bind(this,0));a.register_write(222,this,this.port_multimask_write.bind(this,4));a.register_read(15,this,this.port_multimask_read.bind(this,0));a.register_read(222,this,this.port_multimask_read.bind(this,4));a.register_write(11,this,this.port_mode_write.bind(this,0));a.register_write(214, this,this.port_mode_write.bind(this,4));a.register_write(12,this,this.portC_write);a.register_write(216,this,this.portC_write)}M.prototype.get_state=function(){return[this.channel_page,this.channel_pagehi,this.channel_addr,this.channel_addr_init,this.channel_count,this.channel_count_init,this.channel_mask,this.channel_mode,this.lsb_msb_flipflop]}; M.prototype.set_state=function(a){this.channel_page=a[0];this.channel_pagehi=a[1];this.channel_addr=a[2];this.channel_addr_init=a[3];this.channel_count=a[4];this.channel_count_init=a[5];this.channel_mask=a[6];this.channel_mode=a[7];this.lsb_msb_flipflop=a[8]};M.prototype.port_count_write=function(a,b){B(b);this.channel_count[a]=this.flipflop_get(this.channel_count[a],b,!1);this.channel_count_init[a]=this.flipflop_get(this.channel_count_init[a],b,!0)}; M.prototype.port_count_read=function(a){B(this.channel_count[a]);return this.flipflop_read(this.channel_count[a])};M.prototype.port_addr_write=function(a,b){B(b);this.channel_addr[a]=this.flipflop_get(this.channel_addr[a],b,!1);this.channel_addr_init[a]=this.flipflop_get(this.channel_addr_init[a],b,!0)};M.prototype.port_addr_read=function(a){B(this.channel_addr[a]);return this.flipflop_read(this.channel_addr[a])};M.prototype.port_pagehi_write=function(a,b){B(b);this.channel_pagehi[a]=b}; M.prototype.port_pagehi_read=function(a){return this.channel_pagehi[a]};M.prototype.port_page_write=function(a,b){B(b);this.channel_page[a]=b};M.prototype.port_page_read=function(a){return this.channel_page[a]};M.prototype.port_singlemask_write=function(a,b){this.update_mask((b&3)+a,b&4?1:0)};M.prototype.port_multimask_write=function(a,b){B(b);for(var c=0;4>c;c++)this.update_mask(a+c,b&1<a.byteLength)e(!0);else{var h=this.cpu;this.channel_addr[d]+=g;a.get(b,g,function(l){h.write_blob(l,f);e(!1)})}}; M.prototype.do_write=function(a,b,c,d,e){var g=this.channel_count[d]+1&65535,f=5<=d?2:1,h=g*f,l=this.address_get_8bit(d),m=!1,n=!1,p=this.channel_mode[d]&16;ta("to "+B(l)+" len "+B(h),16);ch&&(n=!0);b+h>a.byteLength?e(!0):(this.channel_addr[d]+=g,this.channel_count[d]-=g,!m&&p&&(this.channel_addr[d]=this.channel_addr_init[d],this.channel_count[d]=this.channel_count_init[d]),a.set(b,this.cpu.mem8.subarray(l,l+h),()=>{n&&p?this.do_write(a,b+h,c-h,d,e):e(!1)}))}; M.prototype.address_get_8bit=function(a){var b=this.channel_addr[a];5<=a&&(b<<=1);b=b&65535|this.channel_page[a]<<16;return b|=this.channel_pagehi[a]<<24};M.prototype.count_get_8bit=function(a){var b=this.channel_count[a]+1;5<=a&&(b*=2);return b};M.prototype.flipflop_get=function(a,b,c){c||(this.lsb_msb_flipflop^=1);return this.lsb_msb_flipflop?a&-256|b:a&-65281|b<<8};M.prototype.flipflop_read=function(a){return(this.lsb_msb_flipflop^=1)?a&255:a>>8&255};function wa(a,b){this.cpu=a;this.bus=b;this.counter_start_time=new Float64Array(3);this.counter_start_value=new Uint16Array(3);this.counter_next_low=new Uint8Array(4);this.counter_enabled=new Uint8Array(4);this.counter_mode=new Uint8Array(4);this.counter_read_mode=new Uint8Array(4);this.counter_latch=new Uint8Array(4);this.counter_latch_value=new Uint16Array(3);this.counter_reload=new Uint16Array(3);a.io.register_read(97,this,function(){var c=D.microtick(),d=66.66666666666667*c&1;c=this.did_rollover(2, c);return d<<4|c<<5});a.io.register_write(97,this,function(c){c&1?this.bus.send("pcspeaker-enable"):this.bus.send("pcspeaker-disable")});a.io.register_read(64,this,function(){return this.counter_read(0)});a.io.register_read(65,this,function(){return this.counter_read(1)});a.io.register_read(66,this,function(){return this.counter_read(2)});a.io.register_write(64,this,function(c){this.counter_write(0,c)});a.io.register_write(65,this,function(c){this.counter_write(1,c)});a.io.register_write(66,this, function(c){this.counter_write(2,c);this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]])});a.io.register_write(67,this,this.port43_write)}wa.prototype.get_state=function(){var a=[];a[0]=this.counter_next_low;a[1]=this.counter_enabled;a[2]=this.counter_mode;a[3]=this.counter_read_mode;a[4]=this.counter_latch;a[5]=this.counter_latch_value;a[6]=this.counter_reload;a[7]=this.counter_start_time;a[8]=this.counter_start_value;return a}; wa.prototype.set_state=function(a){this.counter_next_low=a[0];this.counter_enabled=a[1];this.counter_mode=a[2];this.counter_read_mode=a[3];this.counter_latch=a[4];this.counter_latch_value=a[5];this.counter_reload=a[6];this.counter_start_time=a[7];this.counter_start_value=a[8]}; wa.prototype.timer=function(a,b){var c=100;b||(this.counter_enabled[0]&&this.did_rollover(0,a)?(this.counter_start_value[0]=this.get_counter_value(0,a),this.counter_start_time[0]=a,this.cpu.device_lower_irq(0),this.cpu.device_raise_irq(0),0===this.counter_mode[0]&&(this.counter_enabled[0]=0)):this.cpu.device_lower_irq(0),this.counter_enabled[0]&&(c=(this.counter_start_value[0]-Math.floor(1193.1816666*(a-this.counter_start_time[0])))/1193.1816666));return c}; wa.prototype.get_counter_value=function(a,b){if(!this.counter_enabled[a])return 0;b=this.counter_start_value[a]-Math.floor(1193.1816666*(b-this.counter_start_time[a]));a=this.counter_reload[a];b>=a?b%=a:0>b&&(b=b%a+a);return b};wa.prototype.did_rollover=function(a,b){b-=this.counter_start_time[a];return 0>b?!0:this.counter_start_value[a]>8;b=this.counter_next_low[a];3===this.counter_mode[a]&&(this.counter_next_low[a]^=1);a=this.get_counter_value(a,D.microtick());return b?a&255:a>>8}; wa.prototype.counter_write=function(a,b){this.counter_reload[a]=this.counter_next_low[a]?this.counter_reload[a]&-256|b:this.counter_reload[a]&255|b<<8;3===this.counter_read_mode[a]&&this.counter_next_low[a]||(this.counter_reload[a]||(this.counter_reload[a]=65535),this.counter_start_value[a]=this.counter_reload[a],this.counter_enabled[a]=!0,this.counter_start_time[a]=D.microtick(),B(this.counter_reload[a]));3===this.counter_read_mode[a]&&(this.counter_next_low[a]^=1)}; wa.prototype.port43_write=function(a){var b=a>>1&7,c=a>>6&3;a=a>>4&3;3!==c&&(0===a?(this.counter_latch[c]=2,b=this.get_counter_value(c,D.microtick()),this.counter_latch_value[c]=b?b-1:0):(6<=b&&(b&=-5),this.counter_next_low[c]=1===a?0:1,0===c&&this.cpu.device_lower_irq(0),0!==b&&3!==b&&2!==b&&B(b),this.counter_mode[c]=b,this.counter_read_mode[c]=a,2===c&&this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]])))};wa.prototype.dump=function(){};const xa=Uint32Array.from([655360,655360,720896,753664]),ya=Uint32Array.from([131072,65536,32768,32768]); function N(a,b,c,d){this.cpu=a;this.bus=b;this.screen=c;this.vga_memory_size=d;this.cursor_address=0;this.cursor_scanline_start=14;this.cursor_scanline_end=15;this.max_cols=80;this.max_rows=25;this.virtual_height=this.virtual_width=this.screen_height=this.screen_width=0;this.layers=[];this.start_address_latched=this.start_address=0;this.crtc=new Uint8Array(25);this.line_compare=this.offset_register=this.preset_row_scan=this.underline_location_register=this.vertical_blank_start=this.vertical_display_enable_end= this.horizontal_blank_start=this.horizontal_display_enable_end=this.crtc_mode=0;this.graphical_mode=!1;this.vga256_palette=new Int32Array(256);this.latch_dword=0;this.svga_version=45253;this.svga_height=this.svga_width=0;this.svga_enabled=!1;this.svga_bpp=32;this.svga_offset_y=this.svga_offset_x=this.svga_offset=this.svga_bank_offset=0;this.vga_memory_size=void 0===this.vga_memory_size||262144>this.vga_memory_size?262144:268435456>>0;this.svga_memory=k.view(Uint8Array,a.wasm_memory,c,this.vga_memory_size);this.diff_addr_min=this.vga_memory_size;this.diff_addr_max=0;this.diff_plot_min=this.vga_memory_size;this.diff_plot_max= 0;this.image_data=null;this.vga_memory=new Uint8Array(262144);this.plane0=new Uint8Array(this.vga_memory.buffer,0,65536);this.plane1=new Uint8Array(this.vga_memory.buffer,65536,65536);this.plane2=new Uint8Array(this.vga_memory.buffer,131072,65536);this.plane3=new Uint8Array(this.vga_memory.buffer,196608,65536);this.pixel_buffer=new Uint8Array(524288);b.mmap_register(655360,131072,e=>this.vga_memory_read(e),(e,g)=>this.vga_memory_write(e,g));a.devices.pci.register_device(this)} N.prototype.get_state=function(){var a=[];a[0]=this.vga_memory_size;a[1]=this.cursor_address;a[2]=this.cursor_scanline_start;a[3]=this.cursor_scanline_end;a[4]=this.max_cols;a[5]=this.max_rows;a[6]=this.vga_memory;a[7]=this.dac_state;a[8]=this.start_address;a[9]=this.graphical_mode;a[10]=this.vga256_palette;a[11]=this.latch_dword;a[12]=this.color_compare;a[13]=this.color_dont_care;a[14]=this.miscellaneous_graphics_register;a[15]=this.svga_width;a[16]=this.svga_height;a[17]=this.crtc_mode;a[18]=this.svga_enabled; a[19]=this.svga_bpp;a[20]=this.svga_bank_offset;a[21]=this.svga_offset;a[22]=this.index_crtc;a[23]=this.dac_color_index_write;a[24]=this.dac_color_index_read;a[25]=this.dac_map;a[26]=this.sequencer_index;a[27]=this.plane_write_bm;a[28]=this.sequencer_memory_mode;a[29]=this.graphics_index;a[30]=this.plane_read;a[31]=this.planar_mode;a[32]=this.planar_rotate_reg;a[33]=this.planar_bitmap;a[34]=this.max_scan_line;a[35]=this.miscellaneous_output_register;a[36]=this.port_3DA_value;a[37]=this.dispi_index; a[38]=this.dispi_enable_value;a[39]=this.svga_memory;a[41]=this.attribute_controller_index;a[42]=this.offset_register;a[43]=this.planar_setreset;a[44]=this.planar_setreset_enable;a[45]=this.start_address_latched;a[46]=this.crtc;a[47]=this.horizontal_display_enable_end;a[48]=this.horizontal_blank_start;a[49]=this.vertical_display_enable_end;a[50]=this.vertical_blank_start;a[51]=this.underline_location_register;a[52]=this.preset_row_scan;a[53]=this.offset_register;a[54]=this.palette_source;a[55]=this.attribute_mode; a[56]=this.color_plane_enable;a[57]=this.horizontal_panning;a[58]=this.color_select;a[59]=this.clocking_mode;a[60]=this.line_compare;a[61]=this.pixel_buffer;a[62]=this.dac_mask;a[63]=this.character_map_select;a[64]=this.font_page_ab_enabled;return a}; N.prototype.set_state=function(a){this.vga_memory_size=a[0];this.cursor_address=a[1];this.cursor_scanline_start=a[2];this.cursor_scanline_end=a[3];this.max_cols=a[4];this.max_rows=a[5];a[6]&&this.vga_memory.set(a[6]);this.dac_state=a[7];this.start_address=a[8];this.graphical_mode=a[9];this.vga256_palette=a[10];this.latch_dword=a[11];this.color_compare=a[12];this.color_dont_care=a[13];this.miscellaneous_graphics_register=a[14];this.svga_width=a[15];this.svga_height=a[16];this.crtc_mode=a[17];this.svga_enabled= a[18];this.svga_bpp=a[19];this.svga_bank_offset=a[20];this.svga_offset=a[21];this.index_crtc=a[22];this.dac_color_index_write=a[23];this.dac_color_index_read=a[24];this.dac_map=a[25];this.sequencer_index=a[26];this.plane_write_bm=a[27];this.sequencer_memory_mode=a[28];this.graphics_index=a[29];this.plane_read=a[30];this.planar_mode=a[31];this.planar_rotate_reg=a[32];this.planar_bitmap=a[33];this.max_scan_line=a[34];this.miscellaneous_output_register=a[35];this.port_3DA_value=a[36];this.dispi_index= a[37];this.dispi_enable_value=a[38];this.svga_memory.set(a[39]);this.attribute_controller_index=a[41];this.offset_register=a[42];this.planar_setreset=a[43];this.planar_setreset_enable=a[44];this.start_address_latched=a[45];this.crtc.set(a[46]);this.horizontal_display_enable_end=a[47];this.horizontal_blank_start=a[48];this.vertical_display_enable_end=a[49];this.vertical_blank_start=a[50];this.underline_location_register=a[51];this.preset_row_scan=a[52];this.offset_register=a[53];this.palette_source= a[54];this.attribute_mode=a[55];this.color_plane_enable=a[56];this.horizontal_panning=a[57];this.color_select=a[58];this.clocking_mode=a[59];this.line_compare=a[60];a[61]&&this.pixel_buffer.set(a[61]);this.dac_mask=void 0===a[62]?255:a[62];this.character_map_select=void 0===a[63]?0:a[63];this.font_page_ab_enabled=void 0===a[64]?0:a[64];this.screen.set_mode(this.graphical_mode);this.graphical_mode?(this.screen_height=this.screen_width=0,this.svga_enabled?(this.set_size_graphical(this.svga_width,this.svga_height, this.svga_width,this.svga_height,this.svga_bpp),this.update_layers()):(this.update_vga_size(),this.update_layers(),this.complete_replot())):(this.set_font_bitmap(!0),this.set_size_text(this.max_cols,this.max_rows),this.set_font_page(),this.update_cursor_scanline(),this.update_cursor());this.complete_redraw()}; N.prototype.vga_memory_read=function(a){if(this.svga_enabled)return this.cpu.read8((a-655360|this.svga_bank_offset)+3758096384|0);var b=this.miscellaneous_graphics_register>>2&3;a-=xa[b];if(0>a||a>=ya[b])return B(a),0;this.latch_dword=this.plane0[a];this.latch_dword|=this.plane1[a]<<8;this.latch_dword|=this.plane2[a]<<16;this.latch_dword|=this.plane3[a]<<24;if(this.planar_mode&8)return b=255,this.color_dont_care&1&&(b&=this.plane0[a]^~(this.color_compare&1?255:0)),this.color_dont_care&2&&(b&=this.plane1[a]^ ~(this.color_compare&2?255:0)),this.color_dont_care&4&&(b&=this.plane2[a]^~(this.color_compare&4?255:0)),this.color_dont_care&8&&(b&=this.plane3[a]^~(this.color_compare&8?255:0)),b;b=this.plane_read;this.graphical_mode?this.sequencer_memory_mode&8?(b=a&3,a&=-4):this.planar_mode&16&&(b=a&1,a&=-2):b&=3;return this.vga_memory[b<<16|a]}; N.prototype.vga_memory_write=function(a,b){if(this.svga_enabled)this.cpu.write8((a-655360|this.svga_bank_offset)+3758096384|0,b);else{var c=this.miscellaneous_graphics_register>>2&3;a-=xa[c];0>a||a>=ya[c]?(B(a),B(b)):this.graphical_mode?this.vga_memory_write_graphical(a,b):this.plane_write_bm&3?this.vga_memory_write_text_mode(a,b):this.plane_write_bm&4&&(this.plane2[a]=b)}}; N.prototype.vga_memory_write_graphical=function(a,b){var c=this.planar_mode&3,d=this.apply_feed(this.planar_bitmap),e=this.apply_expand(this.planar_setreset),g=this.apply_expand(this.planar_setreset_enable);switch(c){case 0:b=this.apply_rotate(b);var f=this.apply_feed(b);f=this.apply_setreset(f,g);f=this.apply_logical(f,this.latch_dword);f=this.apply_bitmask(f,d);break;case 1:f=this.latch_dword;break;case 2:f=this.apply_expand(b);f=this.apply_logical(f,this.latch_dword);f=this.apply_bitmask(f,d); break;case 3:b=this.apply_rotate(b),d&=this.apply_feed(b),f=this.apply_bitmask(e,d)}b=15;switch(this.sequencer_memory_mode&12){case 0:b=5<<(a&1);a&=-2;break;case 8:case 12:b=1<<(a&3),a&=-4}b&=this.plane_write_bm;b&1&&(this.plane0[a]=f>>0&255);b&2&&(this.plane1[a]=f>>8&255);b&4&&(this.plane2[a]=f>>16&255);b&8&&(this.plane3[a]=f>>24&255);a=this.vga_addr_to_pixel(a);this.partial_replot(a,a+7)};N.prototype.apply_feed=function(a){return a|a<<8|a<<16|a<<24}; N.prototype.apply_expand=function(a){return(a&1?255:0)|(a&2?255:0)<<8|(a&4?255:0)<<16|(a&8?255:0)<<24};N.prototype.apply_rotate=function(a){return(a|a<<8)>>>(this.planar_rotate_reg&7)&255};N.prototype.apply_setreset=function(a,b){var c=this.apply_expand(this.planar_setreset);return(a|b&c)&(~b|c)};N.prototype.apply_logical=function(a,b){switch(this.planar_rotate_reg&24){case 8:return a&b;case 16:return a|b;case 24:return a^b}return a};N.prototype.apply_bitmask=function(a,b){return b&a|~b&this.latch_dword}; N.prototype.text_mode_redraw=function(){const a=this.scan_line_to_screen_row(this.line_compare),b=Math.max(0,2*(2*this.offset_register-this.max_cols)),c=this.attribute_mode&8,d=this.font_page_ab_enabled?7:15,e=c?7:15,g=this.screen.FLAG_BLINKING,f=this.screen.FLAG_FONT_PAGE_B;let h=this.start_address<<1;for(let l=0;l>4&e]],this.vga256_palette[this.dac_mask&this.dac_map[p&d]]);h+=2}h+=b}}; N.prototype.vga_memory_write_text_mode=function(a,b){this.vga_memory[a]=b;var c=Math.max(this.max_cols,2*this.offset_register);let d;if(a>>1>=this.start_address){var e=(a>>1)-this.start_address;d=e/c|0;c=e%c}else e=a>>1,d=(e/c|0)+this.scan_line_to_screen_row(this.line_compare),c=e%c;if(!(c>=this.max_cols||d>=this.max_rows)){a&1?(e=b,b=this.vga_memory[a&-2]):e=this.vga_memory[a|1];var g=this.attribute_mode&8;a=(g&&e&128?this.screen.FLAG_BLINKING:0)|(!this.font_page_ab_enabled||e&8?0:this.screen.FLAG_FONT_PAGE_B); var f=this.font_page_ab_enabled?7:15;g=g?7:15;this.bus.send("screen-put-char",[d,c,b]);this.screen.put_char(d,c,b,a,this.vga256_palette[this.dac_mask&this.dac_map[e>>4&g]],this.vga256_palette[this.dac_mask&this.dac_map[e&f]])}}; N.prototype.update_cursor=function(){var a=Math.max(this.max_cols,2*this.offset_register);let b;this.cursor_address>=this.start_address?(b=(this.cursor_address-this.start_address)/a|0,a=(this.cursor_address-this.start_address)%a):(b=(this.cursor_address/a|0)+this.scan_line_to_screen_row(this.line_compare),a=this.cursor_address%a);this.screen.update_cursor(b,a)}; N.prototype.complete_redraw=function(){this.graphical_mode?this.svga_enabled?this.cpu.svga_mark_dirty():(this.diff_addr_min=0,this.diff_addr_max=524288):this.text_mode_redraw()};N.prototype.complete_replot=function(){this.graphical_mode&&!this.svga_enabled&&(this.diff_plot_min=0,this.diff_plot_max=524288,this.complete_redraw())};N.prototype.partial_redraw=function(a,b){athis.diff_addr_max&&(this.diff_addr_max=b)}; N.prototype.partial_replot=function(a,b){athis.diff_plot_max&&(this.diff_plot_max=b);this.partial_redraw(a,b)};N.prototype.reset_diffs=function(){this.diff_addr_min=this.vga_memory_size;this.diff_addr_max=0;this.diff_plot_min=this.vga_memory_size;this.diff_plot_max=0};N.prototype.destroy=function(){};N.prototype.vga_bytes_per_line=function(){var a=this.offset_register<<2;this.underline_location_register&64?a<<=1:this.crtc_mode&64&&(a>>>=1);return a}; N.prototype.vga_addr_shift_count=function(){var a=128+(~this.underline_location_register&this.crtc_mode&64);a-=this.underline_location_register&64;a-=this.attribute_mode&64;return a>>>6}; N.prototype.vga_addr_to_pixel=function(a){var b=this.vga_addr_shift_count();if(~this.crtc_mode&3){var c=a-this.start_address;c&=this.crtc_mode<<13|-24577;c<<=b;var d=c/this.virtual_width|0;c%=this.virtual_width;switch(this.crtc_mode&3){case 2:d=d<<1|a>>13&1;break;case 1:d=d<<1|a>>14&1;break;case 0:d=d<<2|a>>13&3}return d*this.virtual_width+c+(this.start_address<>>=1);a=Math.ceil(a/(1+(this.max_scan_line&31)));this.crtc_mode&1||(a<<=1);this.crtc_mode&2||(a<<=1);return a};N.prototype.set_size_text=function(a,b){this.max_cols=a;this.max_rows=b;this.screen.set_size_text(a,b);this.bus.send("screen-set-size",[a,b,0])}; N.prototype.set_size_graphical=function(a,b,c,d,e){c=Math.max(c,1);d=Math.max(d,1);if(this.screen_width!==a||this.screen_height!==b||this.virtual_width!==c||this.virtual_height!==d){this.screen_width=a;this.screen_height=b;this.virtual_width=c;this.virtual_height=d;if("undefined"!==typeof ImageData){const g=c*d,f=this.cpu.svga_allocate_dest_buffer(g)>>>0;this.dest_buffet_offset=f;this.image_data=new ImageData(new Uint8ClampedArray(this.cpu.wasm_memory.buffer,f,4*g),c,d);this.cpu.svga_mark_dirty()}this.screen.set_size_graphical(a, b,c,d);this.bus.send("screen-set-size",[a,b,e])}}; N.prototype.update_vga_size=function(){if(!this.svga_enabled){var a=Math.min(1+this.horizontal_display_enable_end,this.horizontal_blank_start),b=Math.min(1+this.vertical_display_enable_end,this.vertical_blank_start);if(a&&b)if(this.graphical_mode){a<<=3;var c=this.offset_register<<4;this.attribute_mode&64&&(a>>>=1,c>>>=1);b=this.scan_line_to_screen_row(b);var d=ya[0];const e=this.vga_bytes_per_line();this.set_size_graphical(a,b,c,e?Math.ceil(d/e):b,8);this.update_vertical_retrace();this.update_layers()}else this.max_scan_line& 128&&(b>>>=1),c=b/(1+(this.max_scan_line&31))|0,a&&c&&this.set_size_text(a,c)}}; N.prototype.update_layers=function(){this.graphical_mode||this.text_mode_redraw();if(this.svga_enabled)this.layers=[];else if(this.virtual_width&&this.screen_width)if(!this.palette_source||this.clocking_mode&32)this.layers=[],this.screen.clear_screen();else{var a=this.start_address_latched,b=this.horizontal_panning;this.attribute_mode&64&&(b>>>=1);var c=this.preset_row_scan>>5&3,d=this.vga_addr_to_pixel(a+c);a=d/this.virtual_width|0;var e=d%this.virtual_width+b;d=this.scan_line_to_screen_row(1+this.line_compare); d=Math.min(d,this.screen_height);var g=this.screen_height-d;this.layers=[];e=-e;for(var f=0;ethis.attribute_controller_index)B(this.attribute_controller_index),B(a),this.dac_map[this.attribute_controller_index]=a,this.attribute_mode&64||this.complete_redraw();else switch(this.attribute_controller_index){case 16:B(a);if(this.attribute_mode!==a){var b= this.attribute_mode;this.attribute_mode=a;const c=0!==(a&1);this.svga_enabled||this.graphical_mode===c||(this.graphical_mode=c,this.screen.set_mode(this.graphical_mode));(b^a)&64&&this.complete_replot();this.update_vga_size();this.complete_redraw();this.set_font_bitmap(!1)}break;case 18:B(a);this.color_plane_enable!==a&&(this.color_plane_enable=a,this.complete_redraw());break;case 19:B(a);this.horizontal_panning!==a&&(this.horizontal_panning=a&15,this.update_layers());break;case 20:B(a);this.color_select!== a&&(this.color_select=a,this.complete_redraw());break;default:B(this.attribute_controller_index),B(a)}this.attribute_controller_index=-1}};N.prototype.port3C0_read=function(){return(this.attribute_controller_index|this.palette_source)&255};N.prototype.port3C0_read16=function(){return this.port3C0_read()|this.port3C1_read()<<8&65280}; N.prototype.port3C1_read=function(){if(16>this.attribute_controller_index)return B(this.attribute_controller_index),B(this.dac_map[this.attribute_controller_index]),this.dac_map[this.attribute_controller_index]&255;switch(this.attribute_controller_index){case 16:return B(this.attribute_mode),this.attribute_mode;case 18:return B(this.color_plane_enable),this.color_plane_enable;case 19:return B(this.horizontal_panning),this.horizontal_panning;case 20:return B(this.color_select),this.color_select;default:B(this.attribute_controller_index)}return 255}; N.prototype.port3C2_write=function(a){B(a);this.miscellaneous_output_register=a};N.prototype.port3C4_write=function(a){this.sequencer_index=a};N.prototype.port3C4_read=function(){return this.sequencer_index}; N.prototype.port3C5_write=function(a){switch(this.sequencer_index){case 1:B(a);var b=this.clocking_mode;this.clocking_mode=a;(b^a)&32&&this.update_layers();this.set_font_bitmap(!1);break;case 2:B(a);b=this.plane_write_bm;this.plane_write_bm=a;this.graphical_mode||!(b&4)||this.plane_write_bm&4||this.set_font_bitmap(!0);break;case 3:B(a);b=this.character_map_select;this.character_map_select=a;this.graphical_mode||b===a||this.set_font_page();break;case 4:B(a);this.sequencer_memory_mode=a;break;default:B(this.sequencer_index), B(a)}};N.prototype.port3C5_read=function(){B(this.sequencer_index);switch(this.sequencer_index){case 1:return this.clocking_mode;case 2:return this.plane_write_bm;case 3:return this.character_map_select;case 4:return this.sequencer_memory_mode;case 6:return 18}return 0};N.prototype.port3C6_write=function(a){this.dac_mask!==a&&(this.dac_mask=a,this.complete_redraw())};N.prototype.port3C6_read=function(){return this.dac_mask}; N.prototype.port3C7_write=function(a){B(a);this.dac_color_index_read=3*a;this.dac_state&=0};N.prototype.port3C7_read=function(){return this.dac_state};N.prototype.port3C8_write=function(a){this.dac_color_index_write=3*a;this.dac_state|=3};N.prototype.port3C8_read=function(){return this.dac_color_index_write/3&255}; N.prototype.port3C9_write=function(a){var b=this.dac_color_index_write/3|0,c=this.dac_color_index_write%3,d=this.vga256_palette[b];if(0===(this.dispi_enable_value&32)){a&=63;const e=a&1;a=a<<2|e<<1|e}0===c?d=d&-16711681|a<<16:1===c?d=d&-65281|a<<8:(d=d&-256|a,B(b),B(d));this.vga256_palette[b]!==d&&(this.vga256_palette[b]=d,this.complete_redraw());this.dac_color_index_write++}; N.prototype.port3C9_read=function(){var a=this.vga256_palette[this.dac_color_index_read/3|0]>>8*(2-this.dac_color_index_read%3)&255;this.dac_color_index_read++;return this.dispi_enable_value&32?a:a>>2};N.prototype.port3CC_read=function(){return this.miscellaneous_output_register};N.prototype.port3CE_write=function(a){this.graphics_index=a};N.prototype.port3CE_read=function(){return this.graphics_index}; N.prototype.port3CF_write=function(a){switch(this.graphics_index){case 0:this.planar_setreset=a;B(a);break;case 1:this.planar_setreset_enable=a;B(a);break;case 2:this.color_compare=a;B(a);break;case 3:this.planar_rotate_reg=a;B(a);break;case 4:this.plane_read=a;B(a);break;case 5:var b=this.planar_mode;this.planar_mode=a;B(a);(b^a)&96&&this.complete_replot();break;case 6:B(a);this.miscellaneous_graphics_register!==a&&(this.miscellaneous_graphics_register=a,this.update_vga_size());break;case 7:this.color_dont_care= a;B(a);break;case 8:this.planar_bitmap=a;B(a);break;default:B(this.graphics_index),B(a)}};N.prototype.port3CF_read=function(){B(this.graphics_index);switch(this.graphics_index){case 0:return this.planar_setreset;case 1:return this.planar_setreset_enable;case 2:return this.color_compare;case 3:return this.planar_rotate_reg;case 4:return this.plane_read;case 5:return this.planar_mode;case 6:return this.miscellaneous_graphics_register;case 7:return this.color_dont_care;case 8:return this.planar_bitmap}return 0}; N.prototype.port3D4_write=function(a){this.index_crtc=a};N.prototype.port3D4_write16=function(a){this.port3D4_write(a&255);this.port3D5_write(a>>8&255)};N.prototype.port3D4_read=function(){return this.index_crtc}; N.prototype.port3D5_write=function(a){switch(this.index_crtc){case 1:B(a);this.horizontal_display_enable_end!==a&&(this.horizontal_display_enable_end=a,this.update_vga_size());break;case 2:this.horizontal_blank_start!==a&&(this.horizontal_blank_start=a,this.update_vga_size());break;case 7:B(a);var b=this.vertical_display_enable_end;this.vertical_display_enable_end&=255;this.vertical_display_enable_end=this.vertical_display_enable_end|a<<3&512|a<<7&256;b!==this.vertical_display_enable_end&&this.update_vga_size(); this.line_compare=this.line_compare&767|a<<4&256;b=this.vertical_blank_start;this.vertical_blank_start=this.vertical_blank_start&767|a<<5&256;b!==this.vertical_blank_start&&this.update_vga_size();this.update_layers();break;case 8:B(a);this.preset_row_scan=a;this.update_layers();break;case 9:B(a);var c=this.max_scan_line;this.max_scan_line=a;this.line_compare=this.line_compare&511|a<<3&512;b=this.vertical_blank_start;this.vertical_blank_start=this.vertical_blank_start&511|a<<4&512;((c^this.max_scan_line)& 159||b!==this.vertical_blank_start)&&this.update_vga_size();this.update_cursor_scanline();this.update_layers();this.set_font_bitmap(!1);break;case 10:B(a);this.cursor_scanline_start=a;this.update_cursor_scanline();break;case 11:B(a);this.cursor_scanline_end=a;this.update_cursor_scanline();break;case 12:(this.start_address>>8&255)!==a&&(this.start_address=this.start_address&255|a<<8,this.update_layers(),~this.crtc_mode&3&&this.complete_replot());B(a);B(this.start_address,4);break;case 13:(this.start_address& 255)!==a&&(this.start_address=this.start_address&65280|a,this.update_layers(),~this.crtc_mode&3&&this.complete_replot());B(a);B(this.start_address,4);break;case 14:B(a);this.cursor_address=this.cursor_address&255|a<<8;this.update_cursor();break;case 15:B(a);this.cursor_address=this.cursor_address&65280|a;this.update_cursor();break;case 18:B(a);(this.vertical_display_enable_end&255)!==a&&(this.vertical_display_enable_end=this.vertical_display_enable_end&768|a,this.update_vga_size());break;case 19:B(a); this.offset_register!==a&&(this.offset_register=a,this.update_vga_size(),~this.crtc_mode&3&&this.complete_replot());break;case 20:B(a);this.underline_location_register!==a&&(b=this.underline_location_register,this.underline_location_register=a,this.update_vga_size(),(b^a)&64&&this.complete_replot());break;case 21:B(a);(this.vertical_blank_start&255)!==a&&(this.vertical_blank_start=this.vertical_blank_start&768|a,this.update_vga_size());break;case 23:B(a);this.crtc_mode!==a&&(b=this.crtc_mode,this.crtc_mode= a,this.update_vga_size(),(b^a)&67&&this.complete_replot());break;case 24:B(a);this.line_compare=this.line_compare&768|a;this.update_layers();break;default:this.index_crtc>7&2|this.vertical_blank_start>>5&8|this.line_compare>>4&16|this.vertical_display_enable_end>>3&64;case 8:return this.preset_row_scan;case 9:return this.max_scan_line;case 10:return this.cursor_scanline_start;case 11:return this.cursor_scanline_end;case 12:return this.start_address&255; case 13:return this.start_address>>8;case 14:return this.cursor_address>>8;case 15:return this.cursor_address&255;case 18:return this.vertical_display_enable_end&255;case 19:return this.offset_register;case 20:return this.underline_location_register;case 21:return this.vertical_blank_start&255;case 23:return this.crtc_mode;case 24:return this.line_compare&255}return this.index_crtc=a?this.svga_version=a:B(a);break;case 1:this.svga_width=a;2560>>16;case 6:return this.screen_width?this.screen_width:1;case 8:return this.svga_offset_x;case 9:return this.svga_offset_y;case 10:return this.vga_memory_size/65536| 0;default:B(this.dispi_index)}return 255}; N.prototype.vga_replot=function(){for(var a=this.diff_plot_min&-16,b=Math.min(this.diff_plot_max|15,524287),c=this.vga_addr_shift_count(),d=~this.crtc_mode&3,e=this.planar_mode&96,g=this.attribute_mode&64;a<=b;){var f=a>>>c;if(d){var h=a/this.virtual_width|0,l=a-this.virtual_width*h;switch(d){case 1:f=(h&1)<<13;h>>>=1;break;case 2:f=(h&1)<<14;h>>>=1;break;case 3:f=(h&3)<<13,h>>>=2}f|=(h*this.virtual_width+l>>>c)+this.start_address}h=this.plane0[f];l=this.plane1[f];var m=this.plane2[f],n=this.plane3[f]; f=new Uint8Array(8);switch(e){case 0:h<<=0;l<<=1;m<<=2;n<<=3;for(var p=7;0<=p;p--)f[7-p]=h>>p&1|l>>p&2|m>>p&4|n>>p&8;break;case 32:f[0]=h>>6&3|m>>4&12;f[1]=h>>4&3|m>>2&12;f[2]=h>>2&3|m>>0&12;f[3]=h>>0&3|m<<2&12;f[4]=l>>6&3|n>>4&12;f[5]=l>>4&3|n>>2&12;f[6]=l>>2&3|n>>0&12;f[7]=l>>0&3|n<<2&12;break;case 64:case 96:f[0]=h>>4&15,f[1]=h>>0&15,f[2]=l>>4&15,f[3]=l>>0&15,f[4]=m>>4&15,f[5]=m>>0&15,f[6]=n>>4&15,f[7]=n>>0&15}if(g)for(h=p=0;4>p;p++,a++,h+=2)this.pixel_buffer[a]=f[h]<<4|f[h+1];else for(p=0;8>p;p++, a++)this.pixel_buffer[a]=f[p]}}; N.prototype.vga_redraw=function(){var a=this.diff_addr_min,b=Math.min(this.diff_addr_max,524287);const c=new Int32Array(this.cpu.wasm_memory.buffer,this.dest_buffet_offset,this.virtual_width*this.virtual_height);var d=255,e=0;this.attribute_mode&128&&(d&=207,e|=this.color_select<<4&48);if(this.attribute_mode&64)for(;a<=b;a++){var g=this.pixel_buffer[a]&d|e;g=this.vga256_palette[g];c[a]=g&65280|g<<16|g>>16|4278190080}else for(d&=63,e|=this.color_select<<4&192;a<=b;a++)g=this.dac_map[this.pixel_buffer[a]& this.color_plane_enable]&d|e,g=this.vga256_palette[g],c[a]=g&65280|g<<16|g>>16|4278190080}; N.prototype.screen_fill_buffer=function(){if(this.graphical_mode){if(0===this.image_data.data.byteLength){var a=new Uint8ClampedArray(this.cpu.wasm_memory.buffer,this.dest_buffet_offset,4*this.virtual_width*this.virtual_height);this.image_data=new ImageData(a,this.virtual_width,this.virtual_height);this.update_layers()}if(this.svga_enabled){a=0;let d=this.svga_height;if(8===this.svga_bpp){const e=new Int32Array(this.cpu.wasm_memory.buffer,this.dest_buffet_offset,this.screen_width*this.screen_height), g=new Uint8Array(this.cpu.wasm_memory.buffer,this.svga_memory.byteOffset,this.vga_memory_size);for(var b=0;b>16|4278190080}}else this.cpu.svga_fill_pixel_buffer(this.svga_bpp,this.svga_offset),b=15===this.svga_bpp?2:this.svga_bpp/8,a=((this.cpu.svga_dirty_bitmap_min_offset[0]/b|0)-this.svga_offset)/this.svga_width|0,d=(((this.cpu.svga_dirty_bitmap_max_offset[0]/b|0)-this.svga_offset)/this.svga_width|0)+1;a>2|(this.character_map_select&32)>>3,c=this.character_map_select&3|(this.character_map_select&16)>>2;this.font_page_ab_enabled=b!==c;this.screen.set_font_page(a[b],a[c]);this.complete_redraw()};function za(a,b){this.cpu=a;this.bus=b;this.use_mouse=this.enable_mouse_stream=!1;this.have_mouse=!0;this.mouse_clicks=this.mouse_delta_y=this.mouse_delta_x=0;this.have_keyboard=!0;this.next_read_resolution=this.next_read_rate=this.next_handle_scan_code_set=this.next_read_led=this.next_read_sample=this.next_is_mouse_command=this.enable_keyboard_stream=!1;this.kbd_buffer=new la(1024);this.last_port60_byte=0;this.sample_rate=100;this.mouse_id=this.mouse_detect_state=0;this.mouse_reset_workaround=!1; this.wheel_movement=0;this.resolution=4;this.scaling2=!1;this.last_mouse_packet=-1;this.mouse_buffer=new la(1024);this.next_byte_is_aux=this.next_byte_is_ready=!1;this.bus.register("keyboard-code",function(c){this.kbd_send_code(c)},this);this.bus.register("mouse-click",function(c){this.mouse_send_click(c[0],c[1],c[2])},this);this.bus.register("mouse-delta",function(c){this.mouse_send_delta(c[0],c[1])},this);this.bus.register("mouse-wheel",function(c){this.wheel_movement-=c[0];this.wheel_movement-= 2*c[1];this.wheel_movement=Math.min(7,Math.max(-8,this.wheel_movement));this.send_mouse_packet(0,0)},this);this.command_register=5;this.controller_output_port=0;this.read_controller_output_port=this.read_command_register=this.read_output_register=!1;a.io.register_read(96,this,this.port60_read);a.io.register_read(100,this,this.port64_read);a.io.register_write(96,this,this.port60_write);a.io.register_write(100,this,this.port64_write)} za.prototype.get_state=function(){var a=[];a[0]=this.enable_mouse_stream;a[1]=this.use_mouse;a[2]=this.have_mouse;a[3]=this.mouse_delta_x;a[4]=this.mouse_delta_y;a[5]=this.mouse_clicks;a[6]=this.have_keyboard;a[7]=this.enable_keyboard_stream;a[8]=this.next_is_mouse_command;a[9]=this.next_read_sample;a[10]=this.next_read_led;a[11]=this.next_handle_scan_code_set;a[12]=this.next_read_rate;a[13]=this.next_read_resolution;a[15]=this.last_port60_byte;a[16]=this.sample_rate;a[17]=this.resolution;a[18]=this.scaling2; a[20]=this.command_register;a[21]=this.read_output_register;a[22]=this.read_command_register;a[23]=this.controller_output_port;a[24]=this.read_controller_output_port;a[25]=this.mouse_id;a[26]=this.mouse_detect_state;a[27]=this.mouse_reset_workaround;return a}; za.prototype.set_state=function(a){this.enable_mouse_stream=a[0];this.use_mouse=a[1];this.have_mouse=a[2];this.mouse_delta_x=a[3];this.mouse_delta_y=a[4];this.mouse_clicks=a[5];this.have_keyboard=a[6];this.enable_keyboard_stream=a[7];this.next_is_mouse_command=a[8];this.next_read_sample=a[9];this.next_read_led=a[10];this.next_handle_scan_code_set=a[11];this.next_read_rate=a[12];this.next_read_resolution=a[13];this.last_port60_byte=a[15];this.sample_rate=a[16];this.resolution=a[17];this.scaling2=a[18]; this.command_register=a[20];this.read_output_register=a[21];this.read_command_register=a[22];this.controller_output_port=a[23];this.read_controller_output_port=a[24];this.mouse_id=a[25]||0;this.mouse_detect_state=a[26]||0;this.mouse_reset_workaround=a[27]||!1;this.next_byte_is_aux=this.next_byte_is_ready=!1;this.kbd_buffer.clear();this.mouse_buffer.clear();this.bus.send("mouse-enable",this.use_mouse)}; za.prototype.raise_irq=function(){this.next_byte_is_ready||(this.kbd_buffer.length?this.kbd_irq():this.mouse_buffer.length&&this.mouse_irq())};za.prototype.mouse_irq=function(){this.next_byte_is_aux=this.next_byte_is_ready=!0;this.command_register&2&&(this.cpu.device_lower_irq(12),this.cpu.device_raise_irq(12))};za.prototype.kbd_irq=function(){this.next_byte_is_ready=!0;this.next_byte_is_aux=!1;this.command_register&1&&(this.cpu.device_lower_irq(1),this.cpu.device_raise_irq(1))}; za.prototype.kbd_send_code=function(a){this.enable_keyboard_stream&&(B(a),this.kbd_buffer.push(a),this.raise_irq())};za.prototype.mouse_send_delta=function(a,b){if(this.have_mouse&&this.use_mouse){var c=this.resolution*this.sample_rate/80;this.mouse_delta_x+=a*c;this.mouse_delta_y+=b*c;this.enable_mouse_stream&&(a=this.mouse_delta_x|0,b=this.mouse_delta_y|0,a||b)&&(Date.now(),this.mouse_delta_x-=a,this.mouse_delta_y-=b,this.send_mouse_packet(a,b))}}; za.prototype.mouse_send_click=function(a,b,c){this.have_mouse&&this.use_mouse&&(this.mouse_clicks=a|c<<1|b<<2,this.enable_mouse_stream&&this.send_mouse_packet(0,0))}; za.prototype.send_mouse_packet=function(a,b){var c=(0>b)<<5|(0>a)<<4|8|this.mouse_clicks;this.last_mouse_packet=Date.now();this.mouse_buffer.push(c);this.mouse_buffer.push(a);this.mouse_buffer.push(b);4===this.mouse_id?(this.mouse_buffer.push(0|this.wheel_movement&15),this.wheel_movement=0):3===this.mouse_id&&(this.mouse_buffer.push(this.wheel_movement&255),this.wheel_movement=0);this.raise_irq()}; za.prototype.apply_scaling2=function(a){var b=a>>31;switch(Math.abs(a)){case 0:case 1:case 3:return a;case 2:return b;case 4:return 6*b;case 5:return 9*b;default:return a<<1}}; za.prototype.port60_read=function(){this.next_byte_is_ready=!1;if(!this.kbd_buffer.length&&!this.mouse_buffer.length)return this.last_port60_byte;this.next_byte_is_aux?(this.cpu.device_lower_irq(12),this.last_port60_byte=this.mouse_buffer.shift()):(this.cpu.device_lower_irq(1),this.last_port60_byte=this.kbd_buffer.shift());B(this.last_port60_byte);(this.kbd_buffer.length||this.mouse_buffer.length)&&this.raise_irq();return this.last_port60_byte}; za.prototype.port64_read=function(){var a=16;this.next_byte_is_ready&&(a|=1);this.next_byte_is_aux&&(a|=32);B(a);return a}; za.prototype.port60_write=function(a){B(a);if(this.read_command_register)this.command_register=a,this.read_command_register=!1,B(this.command_register);else if(this.read_output_register)this.read_output_register=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(a),this.mouse_irq();else if(this.next_read_sample){this.next_read_sample=!1;this.mouse_buffer.clear();this.mouse_buffer.push(250);this.sample_rate=a;switch(this.mouse_detect_state){case -1:60===a?(this.mouse_reset_workaround=!0,this.mouse_detect_state= 0):(this.mouse_reset_workaround=!1,this.mouse_detect_state=200===a?1:0);break;case 0:200===a&&(this.mouse_detect_state=1);break;case 1:this.mouse_detect_state=100===a?2:200===a?3:0;break;case 2:80===a&&(this.mouse_id=3);this.mouse_detect_state=-1;break;case 3:80===a&&(this.mouse_id=4),this.mouse_detect_state=-1}B(a);B(this.mouse_id);this.sample_rate||(this.sample_rate=100);this.mouse_irq()}else if(this.next_read_resolution)this.next_read_resolution=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(250), this.resolution=3>7});a.io.register_write(113,this,this.cmos_port_write);a.io.register_read(113,this,this.cmos_port_read)} Ca.prototype.get_state=function(){var a=[];a[0]=this.cmos_index;a[1]=this.cmos_data;a[2]=this.rtc_time;a[3]=this.last_update;a[4]=this.next_interrupt;a[5]=this.next_interrupt_alarm;a[6]=this.periodic_interrupt;a[7]=this.periodic_interrupt_time;a[8]=this.cmos_a;a[9]=this.cmos_b;a[10]=this.cmos_c;a[11]=this.nmi_disabled;return a}; Ca.prototype.set_state=function(a){this.cmos_index=a[0];this.cmos_data=a[1];this.rtc_time=a[2];this.last_update=a[3];this.next_interrupt=a[4];this.next_interrupt_alarm=a[5];this.periodic_interrupt=a[6];this.periodic_interrupt_time=a[7];this.cmos_a=a[8];this.cmos_b=a[9];this.cmos_c=a[10];this.nmi_disabled=a[11]}; Ca.prototype.timer=function(a){a=Date.now();this.rtc_time+=a-this.last_update;this.last_update=a;this.periodic_interrupt&&this.next_interrupt>4&15)};Ca.prototype.encode_time=function(a){return this.cmos_b&4?a:this.bcd_pack(a)};Ca.prototype.decode_time=function(a){return this.cmos_b&4?a:this.bcd_unpack(a)}; Ca.prototype.cmos_port_read=function(){var a=this.cmos_index;switch(a){case 0:return B(this.encode_time((new Date(this.rtc_time)).getUTCSeconds())),this.encode_time((new Date(this.rtc_time)).getUTCSeconds());case 2:return B(this.encode_time((new Date(this.rtc_time)).getUTCMinutes())),this.encode_time((new Date(this.rtc_time)).getUTCMinutes());case 4:return B(this.encode_time((new Date(this.rtc_time)).getUTCHours())),this.encode_time((new Date(this.rtc_time)).getUTCHours());case 6:return B(this.encode_time((new Date(this.rtc_time)).getUTCDay()+ 1)),this.encode_time((new Date(this.rtc_time)).getUTCDay()+1);case 7:return B(this.encode_time((new Date(this.rtc_time)).getUTCDate())),this.encode_time((new Date(this.rtc_time)).getUTCDate());case 8:return B(this.encode_time((new Date(this.rtc_time)).getUTCMonth()+1)),this.encode_time((new Date(this.rtc_time)).getUTCMonth()+1);case 9:return B(this.encode_time((new Date(this.rtc_time)).getUTCFullYear()%100)),this.encode_time((new Date(this.rtc_time)).getUTCFullYear()%100);case 10:return 999<=D.microtick()% 1E3?this.cmos_a|128:this.cmos_a;case 11:return this.cmos_b;case 12:return this.cpu.device_lower_irq(8),a=this.cmos_c,this.cmos_c&=-241,a;case 13:return 0;case 50:case 55:return B(this.encode_time((new Date(this.rtc_time)).getUTCFullYear()/100|0)),this.encode_time((new Date(this.rtc_time)).getUTCFullYear()/100|0);default:return B(a),this.cmos_data[this.cmos_index]}}; Ca.prototype.cmos_port_write=function(a){switch(this.cmos_index){case 10:this.cmos_a=a&127;this.periodic_interrupt_time=1E3/(32768>>(this.cmos_a&15)-1);B(this.cmos_a,2);break;case 11:this.cmos_b=a;this.cmos_b&64&&(this.next_interrupt=Date.now());if(this.cmos_b&32){a=new Date;const b=this.decode_time(this.cmos_data[1]),c=this.decode_time(this.cmos_data[3]),d=this.decode_time(this.cmos_data[5]);this.next_interrupt_alarm=+new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate(),d,c,b))}B(this.cmos_b, 2);break;case 1:case 3:case 5:this.cmos_write(this.cmos_index,a);break;default:B(this.cmos_index),B(a)}this.periodic_interrupt=64===(this.cmos_b&64)&&0<(this.cmos_a&15)};Ca.prototype.cmos_read=function(a){return this.cmos_data[a]};Ca.prototype.cmos_write=function(a,b){B(a);B(b);this.cmos_data[a]=b};function Da(a,b,c){this.bus=c;this.cpu=a;this.ints=4;this.line_control=this.baud_rate=0;this.lsr=96;this.ier=this.fifo_control=0;this.iir=1;this.irq=this.scratch_register=this.modem_status=this.modem_control=0;this.input=[];this.current_line="";switch(b){case 1016:this.com=0;this.irq=4;break;case 760:this.com=1;this.irq=3;break;case 1E3:this.com=2;this.irq=4;break;case 744:this.irq=this.com=3;break;default:ta("Invalid serial port: "+B(b),16384),this.com=0,this.irq=4}this.bus.register("serial"+this.com+ "-input",function(d){this.data_received(d)},this);this.bus.register("serial"+this.com+"-modem-status-input",function(d){this.set_modem_status(d)},this);this.bus.register("serial"+this.com+"-carrier-detect-input",function(d){this.set_modem_status(d?this.modem_status|136:this.modem_status&-137)},this);this.bus.register("serial"+this.com+"-ring-indicator-input",function(d){this.set_modem_status(d?this.modem_status|68:this.modem_status&-69)},this);this.bus.register("serial"+this.com+"-data-set-ready-input", function(d){this.set_modem_status(d?this.modem_status|34:this.modem_status&-35)},this);this.bus.register("serial"+this.com+"-clear-to-send-input",function(d){this.set_modem_status(d?this.modem_status|17:this.modem_status&-18)},this);a=a.io;a.register_write(b,this,function(d){this.write_data(d)},function(d){this.write_data(d&255);this.write_data(d>>8)});a.register_write(b|1,this,function(d){this.line_control&128?(this.baud_rate=this.baud_rate&255|d<<8,B(this.baud_rate)):(0===(this.ier&2)&&d&2&&this.ThrowInterrupt(2), this.ier=d&15,B(d),this.CheckInterrupt())});a.register_read(b,this,function(){if(this.line_control&128)return this.baud_rate&255;let d=0;0!==this.input.length&&(d=this.input.shift(),B(d));0===this.input.length&&(this.lsr&=-2,this.ClearInterrupt(12),this.ClearInterrupt(4));return d});a.register_read(b|1,this,function(){return this.line_control&128?this.baud_rate>>8:this.ier&15});a.register_read(b|2,this,function(){var d=this.iir&15;B(this.iir);2===this.iir&&this.ClearInterrupt(2);this.fifo_control& 1&&(d|=192);return d});a.register_write(b|2,this,function(d){B(d);this.fifo_control=d});a.register_read(b|3,this,function(){B(this.line_control);return this.line_control});a.register_write(b|3,this,function(d){B(d);this.line_control=d});a.register_read(b|4,this,function(){return this.modem_control});a.register_write(b|4,this,function(d){B(d);this.modem_control=d});a.register_read(b|5,this,function(){B(this.lsr);return this.lsr});a.register_write(b|5,this,function(){});a.register_read(b|6,this,function(){B(this.modem_status); return this.modem_status&=240});a.register_write(b|6,this,function(d){B(d);this.set_modem_status(d)});a.register_read(b|7,this,function(){return this.scratch_register});a.register_write(b|7,this,function(d){this.scratch_register=d})}Da.prototype.get_state=function(){var a=[];a[0]=this.ints;a[1]=this.baud_rate;a[2]=this.line_control;a[3]=this.lsr;a[4]=this.fifo_control;a[5]=this.ier;a[6]=this.iir;a[7]=this.modem_control;a[8]=this.modem_status;a[9]=this.scratch_register;a[10]=this.irq;return a}; Da.prototype.set_state=function(a){this.ints=a[0];this.baud_rate=a[1];this.line_control=a[2];this.lsr=a[3];this.fifo_control=a[4];this.ier=a[5];this.iir=a[6];this.modem_control=a[7];this.modem_status=a[8];this.scratch_register=a[9];this.irq=a[10]}; Da.prototype.CheckInterrupt=function(){this.ints&4096&&this.ier&1?(this.iir=12,this.cpu.device_raise_irq(this.irq)):this.ints&16&&this.ier&1?(this.iir=4,this.cpu.device_raise_irq(this.irq)):this.ints&4&&this.ier&2?(this.iir=2,this.cpu.device_raise_irq(this.irq)):this.ints&1&&this.ier&8?(this.iir=0,this.cpu.device_raise_irq(this.irq)):(this.iir=1,this.cpu.device_lower_irq(this.irq))};Da.prototype.ThrowInterrupt=function(a){this.ints|=1<>4;this.modem_status=a;this.modem_status=this.modem_status|c|b};function Ea(a){this.cpu=a;var b=a.io;a.devices.pci.register_device({pci_id:56,pci_space:[134,128,19,113,7,0,128,2,8,0,128,6,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,1,0,0],pci_bars:[],name:"acpi"});this.timer_imprecision_offset=this.timer_last_value=0;this.status=1;this.pm1_enable=this.pm1_status=0;this.last_timer=this.get_timer(D.microtick());this.gpe=new Uint8Array(4);b.register_read(45056,this,void 0,function(){return this.pm1_status}); b.register_write(45056,this,void 0,function(c){B(c,4);this.pm1_status&=~c});b.register_read(45058,this,void 0,function(){return this.pm1_enable});b.register_write(45058,this,void 0,function(c){B(c);this.pm1_enable=c});b.register_read(45060,this,void 0,function(){return this.status});b.register_write(45060,this,void 0,function(c){B(c);this.status=c});b.register_read(45064,this,void 0,void 0,function(){return this.get_timer(D.microtick())&16777215});b.register_read(45024,this,function(){return this.gpe[0]}); b.register_read(45025,this,function(){return this.gpe[1]});b.register_read(45026,this,function(){return this.gpe[2]});b.register_read(45027,this,function(){return this.gpe[3]});b.register_write(45024,this,function(c){B(c);this.gpe[0]=c});b.register_write(45025,this,function(c){B(c);this.gpe[1]=c});b.register_write(45026,this,function(c){B(c);this.gpe[2]=c});b.register_write(45027,this,function(c){B(c);this.gpe[3]=c})} Ea.prototype.timer=function(a){a=this.get_timer(a);var b=0!==((a^this.last_timer)&8388608);this.pm1_enable&1&&b?(this.pm1_status|=1,this.cpu.device_raise_irq(9)):this.cpu.device_lower_irq(9);this.last_timer=a;return 100}; Ea.prototype.get_timer=function(a){a=Math.round(3579.545*a);a===this.timer_last_value?3579.545>this.timer_imprecision_offset&&this.timer_imprecision_offset++:this.timer_last_value+this.timer_imprecision_offset<=a&&(this.timer_imprecision_offset=0,this.timer_last_value=a);return this.timer_last_value+this.timer_imprecision_offset};Ea.prototype.get_state=function(){var a=[];a[0]=this.status;a[1]=this.pm1_status;a[2]=this.pm1_enable;a[3]=this.gpe;return a}; Ea.prototype.set_state=function(a){this.status=a[0];this.pm1_status=a[1];this.pm1_enable=a[2];this.gpe=a[3]};function Fa(a){this.cpu=a;this.timer_divider=this.apic_id=0;this.timer_divider_shift=1;this.timer_current_count=this.timer_initial_count=0;this.next_tick=D.microtick();this.lvt_error=this.lvt_int1=this.lvt_int0=this.lvt_perf_counter=this.lvt_timer=65536;this.icr1=this.icr0=this.tpr=0;this.irr=new Int32Array(8);this.isr=new Int32Array(8);this.tmr=new Int32Array(8);this.spurious_vector=254;this.destination_format=-1;this.read_error=this.error=this.local_destination=0;a.io.mmap_register(4276092928,1048576, b=>{B(b>>>0);var c=b&3;return this.read32(b&-4)>>8*c&255},(b,c)=>{B(b);B(c)},b=>this.read32(b),(b,c)=>this.write32(b,c))} Fa.prototype.read32=function(a){a=a-4276092928|0;switch(a){case 32:return this.apic_id;case 48:return 327700;case 128:return this.tpr;case 208:return this.local_destination;case 224:return this.destination_format;case 240:return this.spurious_vector;case 256:case 272:case 288:case 304:case 320:case 336:case 352:case 368:return a=a-256>>4,B(this.isr[a]>>>0,8),this.isr[a];case 384:case 400:case 416:case 432:case 448:case 464:case 480:case 496:return a=a-384>>4,B(this.tmr[a]>>>0,8),this.tmr[a];case 512:case 528:case 544:case 560:case 576:case 592:case 608:case 624:return a= a-512>>4,B(this.irr[a]>>>0,8),this.irr[a];case 640:return B(this.read_error>>>0,8),this.read_error;case 768:return this.icr0;case 784:return this.icr1;case 800:return this.lvt_timer;case 832:return this.lvt_perf_counter;case 848:return this.lvt_int0;case 864:return this.lvt_int1;case 880:return this.lvt_error;case 992:return this.timer_divider;case 896:return this.timer_initial_count;case 912:return B(this.timer_current_count>>>0,8),this.timer_current_count;default:return B(a),0}}; Fa.prototype.write32=function(a,b){a=a-4276092928|0;switch(a){case 32:B(b>>>8,8);this.apic_id=b;break;case 48:B(b>>>0,8);break;case 128:this.tpr=b&255;this.check_vector();break;case 176:b=this.highest_isr();-1!==b&&(this.register_clear_bit(this.isr,b),this.register_get_bit(this.tmr,b)&&this.cpu.devices.ioapic.remote_eoi(b),this.check_vector());break;case 208:B(b>>>0,8);this.local_destination=b&4278190080;break;case 224:B(b>>>0,8);this.destination_format=b|16777215;break;case 240:B(b>>>0,8);this.spurious_vector= b;break;case 640:B(b>>>0,8);this.read_error=this.error;this.error=0;break;case 768:a=b&255;var c=b>>8&7,d=b>>11&1,e=b>>15&1,g=b>>18&3,f=this.icr1>>>24;B(b,8);B(a,2);this.icr0=b&-4097;0===g?this.route(a,c,e,f,d):1===g?this.deliver(a,0,e):2===g&&this.deliver(a,c,e);break;case 784:B(b>>>0,8);this.icr1=b;break;case 800:B(b>>>0,8);this.lvt_timer=b;break;case 832:B(b>>>0,8);this.lvt_perf_counter=b;break;case 848:B(b>>>0,8);this.lvt_int0=b;break;case 864:B(b>>>0,8);this.lvt_int1=b;break;case 880:B(b>>>0, 8);this.lvt_error=b;break;case 992:B(b>>>0,8);this.timer_divider=b;b=b&3|(b&8)>>1;this.timer_divider_shift=7===b?0:b+1;break;case 896:B(b>>>0,8);this.timer_initial_count=b>>>0;this.timer_current_count=b>>>0;this.next_tick=D.microtick();this.timer_active=!0;break;case 912:B(b>>>0,8);break;default:B(a),B(b>>>0,8)}}; Fa.prototype.timer=function(a){if(0===this.timer_current_count)return 100;const b=1E6/(1<>>0;this.next_tick+=a/b;this.timer_current_count-=a;0>=this.timer_current_count&&(a=this.lvt_timer&393216,131072===a?(this.timer_current_count%=this.timer_initial_count,0>=this.timer_current_count&&(this.timer_current_count+=this.timer_initial_count),0===(this.lvt_timer&65536)&&this.deliver(this.lvt_timer&255,0,!1)):0===a&&(this.timer_current_count=0,0===(this.lvt_timer& 65536)&&this.deliver(this.lvt_timer&255,0,!1)));return Math.max(0,this.timer_current_count/b)};Fa.prototype.route=function(a,b,c){this.deliver(a,b,c)};Fa.prototype.deliver=function(a,b,c){5!==b&&4!==b&&(this.register_get_bit(this.irr,a)?B(a,2):(this.register_set_bit(this.irr,a),c?this.register_set_bit(this.tmr,a):this.register_clear_bit(this.tmr,a),this.check_vector()))};Fa.prototype.highest_irr=function(){return this.register_get_highest_bit(this.irr)};Fa.prototype.highest_isr=function(){return this.register_get_highest_bit(this.isr)}; Fa.prototype.check_vector=function(){var a=this.highest_irr();-1!==a&&(this.highest_isr()>=a||(a&240)<=(this.tpr&240)||this.cpu.handle_irqs())};Fa.prototype.acknowledge_irq=function(){var a=this.highest_irr();if(-1===a||this.highest_isr()>=a||(a&240)<=(this.tpr&240))return-1;this.register_clear_bit(this.irr,a);this.register_set_bit(this.isr,a);this.check_vector();return a}; Fa.prototype.get_state=function(){var a=[];a[0]=this.apic_id;a[1]=this.timer_divider;a[2]=this.timer_divider_shift;a[3]=this.timer_initial_count;a[4]=this.timer_current_count;a[5]=this.next_tick;a[6]=this.lvt_timer;a[7]=this.lvt_perf_counter;a[8]=this.lvt_int0;a[9]=this.lvt_int1;a[10]=this.lvt_error;a[11]=this.tpr;a[12]=this.icr0;a[13]=this.icr1;a[14]=this.irr;a[15]=this.isr;a[16]=this.tmr;a[17]=this.spurious_vector;a[18]=this.destination_format;a[19]=this.local_destination;a[20]=this.error;a[21]= this.read_error;return a}; Fa.prototype.set_state=function(a){this.apic_id=a[0];this.timer_divider=a[1];this.timer_divider_shift=a[2];this.timer_initial_count=a[3];this.timer_current_count=a[4];this.next_tick=a[5];this.lvt_timer=a[6];this.lvt_perf_counter=a[7];this.lvt_int0=a[8];this.lvt_int1=a[9];this.lvt_error=a[10];this.tpr=a[11];this.icr0=a[12];this.icr1=a[13];this.irr=a[14];this.isr=a[15];this.tmr=a[16];this.spurious_vector=a[17];this.destination_format=a[18];this.local_destination=a[19];this.error=a[20];this.read_error= a[21]};Fa.prototype.register_get_bit=function(a,b){return a[b>>5]>>(b&31)&1};Fa.prototype.register_set_bit=function(a,b){a[b>>5]|=1<<(b&31)};Fa.prototype.register_clear_bit=function(a,b){a[b>>5]&=~(1<<(b&31))};Fa.prototype.register_get_highest_bit=function(a){for(var b=7;0<=b;b--){var c=a[b];if(c)return k.int_log2(c>>>0)|b<<5}return-1};function Ga(a){this.cpu=a;this.ioredtbl_config=new Int32Array(24);this.ioredtbl_destination=new Int32Array(24);for(var b=0;b{c=c-4273995776|0;if(16<=c&&20>c)return c-=16,B(this.ioregsel),this.read(this.ioregsel)>>8*c&255;B(c>>>0);return 0},c=>{B(c>>>0)},c=>{c=c-4273995776|0;if(0===c)return this.ioregsel;if(16===c)return this.read(this.ioregsel); B(c>>>0);return 0},(c,d)=>{c=c-4273995776|0;0===c?this.ioregsel=d:16===c?this.write(this.ioregsel,d):(B(c>>>0),B(d>>>0,8))})}Ga.prototype.remote_eoi=function(a){for(var b=0;24>b;b++){var c=this.ioredtbl_config[b];(c&255)===a&&c&16384&&(B(b),this.ioredtbl_config[b]&=-16385,this.check_irq(b))}}; Ga.prototype.check_irq=function(a){var b=1<>8&7,e=this.ioredtbl_destination[a]>>>24;if(0===(c&32768))this.irr&=~b;else if(this.ioredtbl_config[a]|=16384,c&16384)return;0!==d&&1!==d||this.cpu.devices.apic.route(c&255,d,32768===(c&32768),e,c>>11&1);this.ioredtbl_config[a]&=-4097}}}; Ga.prototype.set_irq=function(a){if(!(24<=a)){var b=1<a){var b=a-16>>1;a=a&1?this.ioredtbl_destination[b]:this.ioredtbl_config[b];B(b);B(a,8);return a}B(a);return 0}; Ga.prototype.write=function(a,b){if(0===a)this.ioapic_id=b>>>24&15;else if(1!==a&&2!==a)if(16<=a&&64>a){var c=a-16>>1;a&1?(this.ioredtbl_destination[c]=b&4278190080,B(b>>>0,8),B(c),B(b>>>24,2)):(this.ioredtbl_config[c]=b&110591|this.ioredtbl_config[c]&-110592,a=b&255,B(b>>>0,8),B(c),B(a,2),this.check_irq(c))}else B(a),B(b>>>0,8)}; Ga.prototype.get_state=function(){var a=[];a[0]=this.ioredtbl_config;a[1]=this.ioredtbl_destination;a[2]=this.ioregsel;a[3]=this.ioapic_id;a[4]=this.irr;a[5]=this.irq_value;return a};Ga.prototype.set_state=function(a){this.ioredtbl_config=a[0];this.ioredtbl_destination=a[1];this.ioregsel=a[2];this.ioapic_id=a[3];this.irr=a[4];this.irq_value=a[5]};function Ha(a){this.message=a}Ha.prototype=Error();const Ka={Uint8Array,Int8Array,Uint16Array,Int16Array,Uint32Array,Int32Array,Float32Array,Float64Array}; function La(a,b){if("object"!==typeof a||null===a)return a;if(Array.isArray(a))return a.map(e=>La(e,b));a.constructor===Object&&console.log(a);if(a.BYTES_PER_ELEMENT){var c=new Uint8Array(a.buffer,a.byteOffset,a.length*a.BYTES_PER_ELEMENT);return{__state_type__:a.constructor.name.replace("bound ",""),buffer_id:b.push(c)-1}}a=a.get_state();c=[];for(var d=0;dr)throw new Ha("Invalid length: "+r);p=new Int32Array(p.buffer,p.byteOffset,4);if(-2039052682!==p[0])throw new Ha("Invalid header: "+B(p[0]>>>0));if(6!==p[1])throw new Ha("Version mismatch: dump="+p[1]+" we=6");if(q&&p[2]!==r)throw new Ha("Length doesn't match header: real="+r+" header="+p[2]);return p[3]}function c(p){p=(new TextDecoder).decode(p);return JSON.parse(p)}a=new Uint8Array(a);if(4247762216===(new Uint32Array(a.buffer, 0,1))[0]){var d=this.zstd_create_ctx(a.length);(new Uint8Array(this.wasm_memory.buffer,this.zstd_get_src_ptr(d),a.length)).set(a);var e=this.zstd_read(d,16),g=new Uint8Array(this.wasm_memory.buffer,e,16),f=b(g,!1);this.zstd_read_free(e,16);e=this.zstd_read(d,f);g=new Uint8Array(this.wasm_memory.buffer,e,f);g=c(g);this.zstd_read_free(e,f);e=g.state;var h=g.buffer_infos;g=[];f=16+f;for(var l of h){h=(f+3&-4)-f;if(1048576d||d+12>=a.length)throw new Ha("Invalid info block length: "+d);l=a.subarray(16,16+d);e=c(l);l=e.state;e= e.buffer_infos;let p=16+d;p=p+3&-4;d=e.map(q=>{const r=p+q.offset;return a.buffer.slice(r,r+q.length)});l=Ma(l,d);this.set_state(l)}};function Na(a,b,c){a[0]===b[0]&&a[1]===b[1]&&a[2]===b[2]&&a[3]===b[3]&&a[4]===b[4]&&a[5]===b[5]&&(a[0]=c[0],a[1]=c[1],a[2]=c[2],a[3]=c[3],a[4]=c[4],a[5]=c[5]);a[6]===b[0]&&a[7]===b[1]&&a[8]===b[2]&&a[9]===b[3]&&a[10]===b[4]&&a[11]===b[5]&&(a[6]=c[0],a[7]=c[1],a[8]=c[2],a[9]=c[3],a[10]=c[4],a[11]=c[5]);var d=a[12]<<8|a[13];if(2048===d){if(a=a.subarray(14),4===a[0]>>4&&17===a[9]){a=a.subarray(20);d=a[0]<<8|a[1];var e=a[2]<<8|a[3];B(a[6]<<8|a[7],4);if(67===d||67===e)if(d=a.subarray(8),e=d[236]<<24|d[237]<< 16|d[238]<<8|d[239],1669485411!==e)B(e,8);else for(d[28]===b[0]&&d[29]===b[1]&&d[30]===b[2]&&d[31]===b[3]&&d[32]===b[4]&&d[33]===b[5]&&(d[28]=c[0],d[29]=c[1],d[30]=c[2],d[31]=c[3],d[32]=c[4],d[33]=c[5],a[6]=a[7]=0),e=240;e>8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,26,0,17,0,0,184,254,0,0,0,0,0,0,0,0,0,1,0,0];this.pci_id=(0===this.id?5:7+this.id)<<3;this.pci_bars= [{size:32}];this.imr=this.isr=0;this.cr=1;this.tpsr=this.tcnt=this.rcnt=this.dcfg=0;this.memory=new Uint8Array(32768);this.txcr=this.rxcr=0;this.tsr=1;this.mac=new Uint8Array([0,34,21,255*Math.random()|0,255*Math.random()|0,255*Math.random()|0]);this.bus.send("net"+this.id+"-mac",Pa(this.mac));this.mar=Uint8Array.of(255,255,255,255,255,255,255,255);this.mac_address_in_state=null;for(b=0;6>b;b++)this.memory[b<<1]=this.memory[b<<1|1]=this.mac[b];this.memory[28]=this.memory[29]=87;this.memory[30]=this.memory[31]= 87;ta("Mac: "+Pa(this.mac),1048576);this.rsar=0;this.pstart=64;this.pstop=128;this.boundary=this.curpg=76;b=a.io;b.register_read(this.port|0,this,function(){return this.cr});b.register_write(this.port|0,this,function(g){this.cr=g;B(g,2);B(this.txcr,2);this.cr&1||(g&24&&0===this.rcnt&&this.do_interrupt(64),g&4&&(g=this.tpsr<<8,g=this.memory.subarray(g,g+this.tcnt),this.mac_address_in_state&&(g=new Uint8Array(g),Na(g,this.mac_address_in_state,this.mac)),this.bus.send("net"+this.id+"-send",g),this.bus.send("eth-transmit-end", [g.length]),this.cr&=-5,this.do_interrupt(2),B(g.byteLength)))});b.register_read(this.port|13,this,function(){return 1===this.get_page()?this.mar[5]:0});b.register_read(this.port|14,this,function(){return 1===this.get_page()?this.mar[6]:0},function(){this.get_page();return 0});b.register_read(this.port|15,this,function(){return 1===this.get_page()?this.mar[7]:0});b.register_read(this.port|31,this,function(){this.get_page();this.do_interrupt(128);return 0});b.register_write(this.port|31,this,function(g){this.get_page(); B(g,2)});b.register_read(this.port|1,this,function(){var g=this.get_page();return 0===g?this.pstart:1===g?this.mac[0]:2===g?this.pstart:0});b.register_write(this.port|1,this,function(g){var f=this.get_page();0===f?(B(g,2),this.pstart=g):1===f?(B(g),this.mac[0]=g):B(g)});b.register_read(this.port|2,this,function(){var g=this.get_page();return 0===g?this.pstop:1===g?this.mac[1]:2===g?this.pstop:0});b.register_write(this.port|2,this,function(g){var f=this.get_page();0===f?(B(g,2),g>this.memory.length>> 8&&(g=this.memory.length>>8,B(g)),this.pstop=g):1===f?(B(g),this.mac[1]=g):B(g)});b.register_read(this.port|7,this,function(){var g=this.get_page();return 0===g?(B(this.isr,2),this.isr):1===g?(B(this.curpg,2),this.curpg):0});b.register_write(this.port|7,this,function(g){var f=this.get_page();0===f?(B(g,2),this.isr&=~g,this.update_irq()):1===f&&(B(g,2),this.curpg=g)});b.register_write(this.port|13,this,function(g){0===this.get_page()&&(this.txcr=g);B(g,2)});b.register_write(this.port|14,this,function(g){0=== this.get_page()?(B(g,2),this.dcfg=g):B(g,2)});b.register_read(this.port|10,this,function(){var g=this.get_page();return 0===g?80:1===g?this.mar[2]:0});b.register_write(this.port|10,this,function(g){0===this.get_page()?(B(g,2),this.rcnt=this.rcnt&65280|g&255):B(g,2)});b.register_read(this.port|11,this,function(){var g=this.get_page();return 0===g?67:1===g?this.mar[3]:0});b.register_write(this.port|11,this,function(g){0===this.get_page()?(B(g,2),this.rcnt=this.rcnt&255|g<<8&65280):B(g,2)});b.register_read(this.port| 8,this,function(){var g=this.get_page();return 0===g?this.rsar&255:1===g?this.mar[0]:0});b.register_write(this.port|8,this,function(g){0===this.get_page()?(B(g,2),this.rsar=this.rsar&65280|g&255):B(g,2)});b.register_read(this.port|9,this,function(){var g=this.get_page();return 0===g?this.rsar>>8&255:1===g?this.mar[1]:0});b.register_write(this.port|9,this,function(g){0===this.get_page()?(B(g,2),this.rsar=this.rsar&255|g<<8&65280):B(g,2)});b.register_write(this.port|15,this,function(g){0===this.get_page()? (B(g,2),B(this.isr,2),this.imr=g,this.update_irq()):B(g,2)});b.register_read(this.port|3,this,function(){var g=this.get_page();return 0===g?(B(this.boundary,2),this.boundary):1===g?this.mac[2]:0});b.register_write(this.port|3,this,function(g){var f=this.get_page();0===f?(B(g,2),this.boundary=g):1===f?(B(g),this.mac[2]=g):B(g)});b.register_read(this.port|4,this,function(){var g=this.get_page();return 0===g?this.tsr:1===g?this.mac[3]:0});b.register_write(this.port|4,this,function(g){var f=this.get_page(); 0===f?(B(g,2),this.tpsr=g):1===f?(B(g),this.mac[3]=g):B(g)});b.register_read(this.port|5,this,function(){var g=this.get_page();return 0===g?0:1===g?this.mac[4]:0});b.register_write(this.port|5,this,function(g){var f=this.get_page();0===f?(B(g,2),this.tcnt=this.tcnt&-256|g):1===f?(B(g),this.mac[4]=g):B(g)});b.register_read(this.port|6,this,function(){var g=this.get_page();return 0===g?0:1===g?this.mac[5]:0});b.register_write(this.port|6,this,function(g){var f=this.get_page();0===f?(B(g,2),this.tcnt= this.tcnt&255|g<<8):1===f?(B(g),this.mac[5]=g):B(g)});b.register_read(this.port|12,this,function(){var g=this.get_page();return 0===g?9:1===g?this.mar[4]:0});b.register_write(this.port|12,this,function(g){0===this.get_page()?(B(g,2),this.rxcr=g):B(g)});b.register_read(this.port|16,this,this.data_port_read8,this.data_port_read16,this.data_port_read32);b.register_write(this.port|16,this,this.data_port_write16,this.data_port_write16,this.data_port_write32);a.devices.pci.register_device(this)} Qa.prototype.get_state=function(){var a=[];a[0]=this.isr;a[1]=this.imr;a[2]=this.cr;a[3]=this.dcfg;a[4]=this.rcnt;a[5]=this.tcnt;a[6]=this.tpsr;a[7]=this.rsar;a[8]=this.pstart;a[9]=this.curpg;a[10]=this.boundary;a[11]=this.pstop;a[12]=this.rxcr;a[13]=this.txcr;a[14]=this.tsr;a[15]=this.mac;a[16]=this.memory;return a}; Qa.prototype.set_state=function(a){this.isr=a[0];this.imr=a[1];this.cr=a[2];this.dcfg=a[3];this.rcnt=a[4];this.tcnt=a[5];this.tpsr=a[6];this.rsar=a[7];this.pstart=a[8];this.curpg=a[9];this.boundary=a[10];this.pstop=a[11];this.rxcr=a[12];this.txcr=a[13];this.tsr=a[14];this.preserve_mac_from_state_image?(this.mac=a[15],this.memory=a[16]):this.mac_address_translation&&(this.mac_address_in_state=a[15],this.memory=a[16],Pa(this.mac_address_in_state),Pa(this.mac));this.bus.send("net"+this.id+"-mac",Pa(this.mac))}; Qa.prototype.do_interrupt=function(a){B(a,2);this.isr|=a;this.update_irq()};Qa.prototype.update_irq=function(){this.imr&this.isr?this.pci.raise_irq(this.pci_id):this.pci.lower_irq(this.pci_id)};Qa.prototype.data_port_write=function(a){if(16>=this.rsar||16384<=this.rsar&&32768>this.rsar)this.memory[this.rsar]=a;this.rsar++;this.rcnt--;this.rsar>=this.pstop<<8&&(this.rsar+=this.pstart-this.pstop<<8);0===this.rcnt&&this.do_interrupt(64)}; Qa.prototype.data_port_write16=function(a){this.data_port_write(a);this.dcfg&1&&this.data_port_write(a>>8)};Qa.prototype.data_port_write32=function(a){this.data_port_write(a);this.data_port_write(a>>8);this.data_port_write(a>>16);this.data_port_write(a>>24)};Qa.prototype.data_port_read=function(){let a=0;32768>this.rsar&&(a=this.memory[this.rsar]);this.rsar++;this.rcnt--;this.rsar>=this.pstop<<8&&(this.rsar+=this.pstart-this.pstop<<8);0===this.rcnt&&this.do_interrupt(64);return a}; Qa.prototype.data_port_read8=function(){return this.data_port_read16()&255};Qa.prototype.data_port_read16=function(){return this.dcfg&1?this.data_port_read()|this.data_port_read()<<8:this.data_port_read()};Qa.prototype.data_port_read32=function(){return this.data_port_read()|this.data_port_read()<<8|this.data_port_read()<<16|this.data_port_read()<<24}; Qa.prototype.receive=function(a){if(!(this.cr&1)&&(this.bus.send("eth-receive-end",[a.length]),this.rxcr&16||this.rxcr&4&&255===a[0]&&255===a[1]&&255===a[2]&&255===a[3]&&255===a[4]&&255===a[5]||!(this.rxcr&8&&1===(a[0]&1)||a[0]!==this.mac[0]||a[1]!==this.mac[1]||a[2]!==this.mac[2]||a[3]!==this.mac[3]||a[4]!==this.mac[4]||a[5]!==this.mac[5]))){this.mac_address_in_state&&(a=new Uint8Array(a),Na(a,this.mac,this.mac_address_in_state));var b=this.curpg<<8,c=Math.max(60,a.length)+4,d=b+4,e=this.curpg+1+ (c>>8),g=b+c,f=1+(c>>8),h=this.boundary>this.curpg?this.boundary-this.curpg:this.pstop-this.curpg+this.boundary-this.pstart;hthis.pstop<<8?(g=(this.pstop<<8)-d,this.memory.set(a.subarray(0,g),d),this.memory.set(a.subarray(g),this.pstart<<8),B(g)):(this.memory.set(a,d),60>a.length&&this.memory.fill(0,d+a.length,d+60)),e>=this.pstop&&(e+=this.pstart-this.pstop),this.memory[b]=1,this.memory[b+1]=e,this.memory[b+ 2]=c,this.memory[b+3]=c>>8,this.curpg=e,B(b),B(c),B(e),this.do_interrupt(1))}};Qa.prototype.get_page=function(){return this.cr>>6&3};var Ra=new Uint8Array(256),Sa=[],Ta=[],Ua=[],Va=new Uint8Array(256),Wa=[]; function O(a,b){this.cpu=a;this.bus=b;this.write_buffer=new la(64);this.read_buffer=new la(64);this.mixer_current_address=this.command_size=this.command=this.read_buffer_lastvalue=0;this.mixer_registers=new Uint8Array(256);this.mixer_reset();this.dummy_speaker_enabled=!1;this.test_register=0;this.dsp_signed=this.dsp_16bit=this.dsp_stereo=this.dsp_highspeed=!1;this.dac_buffers=[new oa(65536),new oa(65536)];this.dma=a.devices.dma;this.dma_channel=this.dma_irq=this.dma_bytes_block=this.dma_bytes_left= this.dma_bytes_count=this.dma_sample_count=0;this.dma_channel_8bit=1;this.dma_channel_16bit=5;this.dma_autoinit=!1;this.dma_buffer=new ArrayBuffer(65536);this.dma_buffer_int8=new Int8Array(this.dma_buffer);this.dma_buffer_uint8=new Uint8Array(this.dma_buffer);this.dma_buffer_int16=new Int16Array(this.dma_buffer);this.dma_buffer_uint16=new Uint16Array(this.dma_buffer);this.dma_syncbuffer=new k.SyncBuffer(this.dma_buffer);this.dma_paused=this.dma_waiting_transfer=!1;this.sampling_rate=22050;b.send("dac-tell-sampling-rate", this.sampling_rate);this.bytes_per_sample=1;this.e2_value=170;this.e2_count=0;this.asp_registers=new Uint8Array(256);this.mpu_read_buffer=new la(64);this.fm_current_address1=this.fm_current_address0=this.mpu_read_buffer_lastvalue=0;this.fm_waveform_select_enable=!1;this.irq=5;this.irq_triggered=new Uint8Array(16);a.io.register_read_consecutive(544,this,this.port2x0_read,this.port2x1_read,this.port2x2_read,this.port2x3_read);a.io.register_read_consecutive(904,this,this.port2x0_read,this.port2x1_read); a.io.register_read_consecutive(548,this,this.port2x4_read,this.port2x5_read);a.io.register_read(550,this,this.port2x6_read);a.io.register_read(551,this,this.port2x7_read);a.io.register_read(552,this,this.port2x8_read);a.io.register_read(553,this,this.port2x9_read);a.io.register_read(554,this,this.port2xA_read);a.io.register_read(555,this,this.port2xB_read);a.io.register_read(556,this,this.port2xC_read);a.io.register_read(557,this,this.port2xD_read);a.io.register_read_consecutive(558,this,this.port2xE_read, this.port2xF_read);a.io.register_write_consecutive(544,this,this.port2x0_write,this.port2x1_write,this.port2x2_write,this.port2x3_write);a.io.register_write_consecutive(904,this,this.port2x0_write,this.port2x1_write);a.io.register_write_consecutive(548,this,this.port2x4_write,this.port2x5_write);a.io.register_write(550,this,this.port2x6_write);a.io.register_write(551,this,this.port2x7_write);a.io.register_write_consecutive(552,this,this.port2x8_write,this.port2x9_write);a.io.register_write(554,this, this.port2xA_write);a.io.register_write(555,this,this.port2xB_write);a.io.register_write(556,this,this.port2xC_write);a.io.register_write(557,this,this.port2xD_write);a.io.register_write(558,this,this.port2xE_write);a.io.register_write(559,this,this.port2xF_write);a.io.register_read_consecutive(816,this,this.port3x0_read,this.port3x1_read);a.io.register_write_consecutive(816,this,this.port3x0_write,this.port3x1_write);this.dma.on_unmask(this.dma_on_unmask,this);b.register("dac-request-data",function(){this.dac_handle_request()}, this);b.register("speaker-has-initialized",function(){this.mixer_reset()},this);b.send("speaker-confirm-initialized");this.dsp_reset()} O.prototype.dsp_reset=function(){this.write_buffer.clear();this.read_buffer.clear();this.command_size=this.command=0;this.dummy_speaker_enabled=!1;this.test_register=0;this.dsp_signed=this.dsp_16bit=this.dsp_stereo=this.dsp_highspeed=!1;this.dac_buffers[0].clear();this.dac_buffers[1].clear();this.dma_channel=this.dma_irq=this.dma_bytes_block=this.dma_bytes_left=this.dma_bytes_count=this.dma_sample_count=0;this.dma_autoinit=!1;this.dma_buffer_uint8.fill(0);this.dma_paused=this.dma_waiting_transfer= !1;this.e2_value=170;this.e2_count=0;this.sampling_rate=22050;this.bytes_per_sample=1;this.lower_irq(1);this.irq_triggered.fill(0);this.asp_registers.fill(0);this.asp_registers[5]=1;this.asp_registers[9]=248}; O.prototype.get_state=function(){var a=[];a[2]=this.read_buffer_lastvalue;a[3]=this.command;a[4]=this.command_size;a[5]=this.mixer_current_address;a[6]=this.mixer_registers;a[7]=this.dummy_speaker_enabled;a[8]=this.test_register;a[9]=this.dsp_highspeed;a[10]=this.dsp_stereo;a[11]=this.dsp_16bit;a[12]=this.dsp_signed;a[15]=this.dma_sample_count;a[16]=this.dma_bytes_count;a[17]=this.dma_bytes_left;a[18]=this.dma_bytes_block;a[19]=this.dma_irq;a[20]=this.dma_channel;a[21]=this.dma_channel_8bit;a[22]= this.dma_channel_16bit;a[23]=this.dma_autoinit;a[24]=this.dma_buffer_uint8;a[25]=this.dma_waiting_transfer;a[26]=this.dma_paused;a[27]=this.sampling_rate;a[28]=this.bytes_per_sample;a[29]=this.e2_value;a[30]=this.e2_count;a[31]=this.asp_registers;a[33]=this.mpu_read_buffer_last_value;a[34]=this.irq;a[35]=this.irq_triggered;return a}; O.prototype.set_state=function(a){this.read_buffer_lastvalue=a[2];this.command=a[3];this.command_size=a[4];this.mixer_current_address=a[5];this.mixer_registers=a[6];this.mixer_full_update();this.dummy_speaker_enabled=a[7];this.test_register=a[8];this.dsp_highspeed=a[9];this.dsp_stereo=a[10];this.dsp_16bit=a[11];this.dsp_signed=a[12];this.dma_sample_count=a[15];this.dma_bytes_count=a[16];this.dma_bytes_left=a[17];this.dma_bytes_block=a[18];this.dma_irq=a[19];this.dma_channel=a[20];this.dma_channel_8bit= a[21];this.dma_channel_16bit=a[22];this.dma_autoinit=a[23];this.dma_buffer_uint8=a[24];this.dma_waiting_transfer=a[25];this.dma_paused=a[26];this.sampling_rate=a[27];this.bytes_per_sample=a[28];this.e2_value=a[29];this.e2_count=a[30];this.asp_registers=a[31];this.mpu_read_buffer_last_value=a[33];this.irq=a[34];this.irq_triggered=a[35];this.dma_buffer=this.dma_buffer_uint8.buffer;this.dma_buffer_int8=new Int8Array(this.dma_buffer);this.dma_buffer_int16=new Int16Array(this.dma_buffer);this.dma_buffer_uint16= new Uint16Array(this.dma_buffer);this.dma_syncbuffer=new k.SyncBuffer(this.dma_buffer);this.dma_paused?this.bus.send("dac-disable"):this.bus.send("dac-enable")};O.prototype.port2x0_read=function(){return 255};O.prototype.port2x1_read=function(){return 255};O.prototype.port2x2_read=function(){return 255};O.prototype.port2x3_read=function(){return 255};O.prototype.port2x4_read=function(){return this.mixer_current_address};O.prototype.port2x5_read=function(){return this.mixer_read(this.mixer_current_address)}; O.prototype.port2x6_read=function(){return 255};O.prototype.port2x7_read=function(){return 255};O.prototype.port2x8_read=function(){return 255};O.prototype.port2x9_read=function(){return 255};O.prototype.port2xA_read=function(){this.read_buffer.length&&(this.read_buffer_lastvalue=this.read_buffer.shift());B(this.read_buffer_lastvalue);String.fromCharCode(this.read_buffer_lastvalue);return this.read_buffer_lastvalue};O.prototype.port2xB_read=function(){return 255};O.prototype.port2xC_read=function(){return 127}; O.prototype.port2xD_read=function(){return 255};O.prototype.port2xE_read=function(){this.irq_triggered[1]&&this.lower_irq(1);return(this.read_buffer.length&&!this.dsp_highspeed)<<7|127};O.prototype.port2xF_read=function(){this.lower_irq(2);return 0};O.prototype.port2x0_write=function(a){B(a);this.fm_current_address0=0};O.prototype.port2x1_write=function(a){B(a);var b=Wa[this.fm_current_address0];b||(b=this.fm_default_write);b.call(this,a,0,this.fm_current_address0)}; O.prototype.port2x2_write=function(a){B(a);this.fm_current_address1=0};O.prototype.port2x3_write=function(a){B(a);var b=Wa[this.fm_current_address1];b||(b=this.fm_default_write);b.call(this,a,1,this.fm_current_address1)};O.prototype.port2x4_write=function(a){B(a);this.mixer_current_address=a};O.prototype.port2x5_write=function(a){B(a);this.mixer_write(this.mixer_current_address,a)}; O.prototype.port2x6_write=function(a){B(a);this.dsp_highspeed?this.dsp_highspeed=!1:a&&this.dsp_reset();this.read_buffer.clear();this.read_buffer.push(170)};O.prototype.port2x7_write=function(){};O.prototype.port2x8_write=function(){};O.prototype.port2x9_write=function(){};O.prototype.port2xA_write=function(){};O.prototype.port2xB_write=function(){}; O.prototype.port2xC_write=function(a){0===this.command?(B(a),this.command=a,this.write_buffer.clear(),this.command_size=Ra[a]):(B(a),this.write_buffer.push(a));this.write_buffer.length>=this.command_size&&this.command_do()};O.prototype.port2xD_write=function(){};O.prototype.port2xE_write=function(){};O.prototype.port2xF_write=function(){}; O.prototype.port3x0_read=function(){this.mpu_read_buffer.length&&(this.mpu_read_buffer_lastvalue=this.mpu_read_buffer.shift());B(this.mpu_read_buffer_lastvalue);return this.mpu_read_buffer_lastvalue};O.prototype.port3x0_write=function(a){B(a)};O.prototype.port3x1_read=function(){return 0|128*!this.mpu_read_buffer.length};O.prototype.port3x1_write=function(a){B(a);255===a&&(this.mpu_read_buffer.clear(),this.mpu_read_buffer.push(254))}; O.prototype.command_do=function(){var a=Sa[this.command];a||(a=this.dsp_default_handler);a.call(this);this.command_size=this.command=0;this.write_buffer.clear()};O.prototype.dsp_default_handler=function(){B(this.command)};function U(a,b,c){c||(c=O.prototype.dsp_default_handler);for(var d=0;dc;c++)b.push(a+c);return b}U([14],2,function(){this.asp_registers[this.write_buffer.shift()]=this.write_buffer.shift()}); U([15],1,function(){this.read_buffer.clear();this.read_buffer.push(this.asp_registers[this.write_buffer.shift()])});U([16],1,function(){var a=this.write_buffer.shift();a=Ya(a/127.5+-1,-1,1);this.dac_buffers[0].push(a);this.dac_buffers[1].push(a);this.bus.send("dac-enable")});U([20,21],2,function(){this.dma_irq=1;this.dma_channel=this.dma_channel_8bit;this.dsp_highspeed=this.dsp_16bit=this.dsp_signed=this.dma_autoinit=!1;this.dma_transfer_size_set();this.dma_transfer_start()});U([22],2);U([23],2); U([28],0,function(){this.dma_irq=1;this.dma_channel=this.dma_channel_8bit;this.dma_autoinit=!0;this.dsp_highspeed=this.dsp_16bit=this.dsp_signed=!1;this.dma_transfer_start()});U([31],0);U([32],0,function(){this.read_buffer.clear();this.read_buffer.push(127)});U([36],2);U([44],0);U([48],0);U([49],0);U([52],0);U([53],0);U([54],0);U([55],0);U([56],0);U([64],1,function(){this.sampling_rate_change(1E6/(256-this.write_buffer.shift())/this.get_channel_count())}); U([65,66],2,function(){this.sampling_rate_change(this.write_buffer.shift()<<8|this.write_buffer.shift())});U([72],2,function(){this.dma_transfer_size_set()});U([116],2);U([117],2);U([118],2);U([119],2);U([125],0);U([127],0);U([128],2);U([144],0,function(){this.dma_irq=1;this.dma_channel=this.dma_channel_8bit;this.dma_autoinit=!0;this.dsp_signed=!1;this.dsp_highspeed=!0;this.dsp_16bit=!1;this.dma_transfer_start()});U([145],0);U([152],0);U([153],0);U([160],0);U([168],0); U(Xa(176),3,function(){if(this.command&8)this.dsp_default_handler();else{var a=this.write_buffer.shift();this.dma_irq=2;this.dma_channel=this.dma_channel_16bit;this.dma_autoinit=!!(this.command&4);this.dsp_signed=!!(a&16);this.dsp_stereo=!!(a&32);this.dsp_16bit=!0;this.dma_transfer_size_set();this.dma_transfer_start()}}); U(Xa(192),3,function(){if(this.command&8)this.dsp_default_handler();else{var a=this.write_buffer.shift();this.dma_irq=1;this.dma_channel=this.dma_channel_8bit;this.dma_autoinit=!!(this.command&4);this.dsp_signed=!!(a&16);this.dsp_stereo=!!(a&32);this.dsp_16bit=!1;this.dma_transfer_size_set();this.dma_transfer_start()}});U([208],0,function(){this.dma_paused=!0;this.bus.send("dac-disable")});U([209],0,function(){this.dummy_speaker_enabled=!0});U([211],0,function(){this.dummy_speaker_enabled=!1}); U([212],0,function(){this.dma_paused=!1;this.bus.send("dac-enable")});U([213],0,function(){this.dma_paused=!0;this.bus.send("dac-disable")});U([214],0,function(){this.dma_paused=!1;this.bus.send("dac-enable")});U([216],0,function(){this.read_buffer.clear();this.read_buffer.push(255*this.dummy_speaker_enabled)});U([217,218],0,function(){this.dma_autoinit=!1});U([224],1,function(){this.read_buffer.clear();this.read_buffer.push(~this.write_buffer.shift())}); U([225],0,function(){this.read_buffer.clear();this.read_buffer.push(4);this.read_buffer.push(5)});U([226],1);U([227],0,function(){this.read_buffer.clear();for(var a=0;44>a;a++)this.read_buffer.push("COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.".charCodeAt(a));this.read_buffer.push(0)});U([228],1,function(){this.test_register=this.write_buffer.shift()});U([232],0,function(){this.read_buffer.clear();this.read_buffer.push(this.test_register)});U([242,243],0,function(){this.raise_irq()});var Za=new Uint8Array(256); Za[14]=255;Za[15]=7;Za[55]=56;U([249],1,function(){var a=this.write_buffer.shift();this.read_buffer.clear();this.read_buffer.push(Za[a])});O.prototype.mixer_read=function(a){var b=Ta[a];b?b=b.call(this):(b=this.mixer_registers[a],B(a),B(b));return b};O.prototype.mixer_write=function(a,b){var c=Ua[a];c?c.call(this,b):(B(a),B(b))};O.prototype.mixer_default_read=function(){B(this.mixer_current_address);return this.mixer_registers[this.mixer_current_address]}; O.prototype.mixer_default_write=function(a){B(this.mixer_current_address);B(a);this.mixer_registers[this.mixer_current_address]=a}; O.prototype.mixer_reset=function(){this.mixer_registers[4]=204;this.mixer_registers[34]=204;this.mixer_registers[38]=204;this.mixer_registers[40]=0;this.mixer_registers[46]=0;this.mixer_registers[10]=0;this.mixer_registers[48]=192;this.mixer_registers[49]=192;this.mixer_registers[50]=192;this.mixer_registers[51]=192;this.mixer_registers[52]=192;this.mixer_registers[53]=192;this.mixer_registers[54]=0;this.mixer_registers[55]=0;this.mixer_registers[56]=0;this.mixer_registers[57]=0;this.mixer_registers[59]= 0;this.mixer_registers[60]=31;this.mixer_registers[61]=21;this.mixer_registers[62]=11;this.mixer_registers[63]=0;this.mixer_registers[64]=0;this.mixer_registers[65]=0;this.mixer_registers[66]=0;this.mixer_registers[67]=0;this.mixer_registers[68]=128;this.mixer_registers[69]=128;this.mixer_registers[70]=128;this.mixer_registers[71]=128;this.mixer_full_update()};O.prototype.mixer_full_update=function(){for(var a=1;a>>4};Ua[a]=function(d){this.mixer_registers[a]=d;var e=d<<4&240|this.mixer_registers[c]&15;this.mixer_write(b,d&240|this.mixer_registers[b]&15);this.mixer_write(c,e)}} function cb(a,b,c){Ta[a]=O.prototype.mixer_default_read;Ua[a]=function(d){this.mixer_registers[a]=d;this.bus.send("mixer-volume",[b,c,(d>>>2)-62])}}$a(0,function(){this.mixer_reset();return 0});ab(0);bb(4,50,51);bb(34,48,49);bb(38,52,53);bb(40,54,55);bb(46,56,57);cb(48,0,0);cb(49,0,1);cb(50,2,0);cb(51,2,1);$a(59);ab(59,function(a){this.mixer_registers[59]=a;this.bus.send("mixer-volume",[1,2,6*(a>>>6)-18])});$a(65); ab(65,function(a){this.mixer_registers[65]=a;this.bus.send("mixer-gain-left",6*(a>>>6))});$a(66);ab(66,function(a){this.mixer_registers[66]=a;this.bus.send("mixer-gain-right",6*(a>>>6))});$a(68);ab(68,function(a){this.mixer_registers[68]=a;a>>>=3;this.bus.send("mixer-treble-left",a-(16>a?14:16))});$a(69);ab(69,function(a){this.mixer_registers[69]=a;a>>>=3;this.bus.send("mixer-treble-right",a-(16>a?14:16))});$a(70); ab(70,function(a){this.mixer_registers[70]=a;a>>>=3;this.bus.send("mixer-bass-right",a-(16>a?14:16))});$a(71);ab(71,function(a){this.mixer_registers[71]=a;a>>>=3;this.bus.send("mixer-bass-right",a-(16>a?14:16))});$a(128,function(){switch(this.irq){case 2:return 1;case 5:return 2;case 7:return 4;case 10:return 8;default:return 0}});ab(128,function(a){a&1&&(this.irq=2);a&2&&(this.irq=5);a&4&&(this.irq=7);a&8&&(this.irq=10)}); $a(129,function(){var a=0;switch(this.dma_channel_8bit){case 0:a|=1;break;case 1:a|=2;break;case 3:a|=8}switch(this.dma_channel_16bit){case 5:a|=32;break;case 6:a|=64;break;case 7:a|=128}return a});ab(129,function(a){a&1&&(this.dma_channel_8bit=0);a&2&&(this.dma_channel_8bit=1);a&8&&(this.dma_channel_8bit=3);a&32&&(this.dma_channel_16bit=5);a&64&&(this.dma_channel_16bit=6);a&128&&(this.dma_channel_16bit=7)});$a(130,function(){for(var a=32,b=0;16>b;b++)a|=b*this.irq_triggered[b];return a}); O.prototype.fm_default_write=function(a,b,c){B(c);B(a)};function db(a,b){b||(b=O.prototype.fm_default_write);for(var c=0;c>2&-4,32),this.dma_bytes_block);this.dma_waiting_transfer=!0;this.dma.channel_mask[this.dma_channel]||this.dma_on_unmask(this.dma_channel)}; O.prototype.dma_on_unmask=function(a){a===this.dma_channel&&this.dma_waiting_transfer&&(this.dma_waiting_transfer=!1,this.dma_bytes_left=this.dma_bytes_count,this.dma_paused=!1,this.bus.send("dac-enable"))}; O.prototype.dma_transfer_next=function(){var a=Math.min(this.dma_bytes_left,this.dma_bytes_block),b=Math.floor(a/this.bytes_per_sample);this.dma.do_write(this.dma_syncbuffer,0,a,this.dma_channel,c=>{c||(this.dma_to_dac(b),this.dma_bytes_left-=a,this.dma_bytes_left||(this.raise_irq(this.dma_irq),this.dma_autoinit&&(this.dma_bytes_left=this.dma_bytes_count)))})}; O.prototype.dma_to_dac=function(a){var b=this.dsp_16bit?32767.5:127.5,c=this.dsp_signed?0:-1,d=this.dsp_stereo?1:2;var e=this.dsp_16bit?this.dsp_signed?this.dma_buffer_int16:this.dma_buffer_uint16:this.dsp_signed?this.dma_buffer_int8:this.dma_buffer_uint8;for(var g=0,f=0;fc)*c+(b<=a&&a<=c)*a};function da(a,b){this.cpu=a;this.pci=a.devices.pci;this.device_id=b.device_id;this.pci_space=[244,26,b.device_id&255,b.device_id>>8,7,5,16,0,1,0,2,0,0,0,0,0,1,168,0,0,0,16,191,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,26,b.subsystem_device_id&255,b.subsystem_device_id>>8,0,0,0,0,64,0,0,0,0,0,0,0,0,1,0,0];this.pci_space=this.pci_space.concat(k.zeros(256-this.pci_space.length));this.pci_id=b.pci_id;this.pci_bars=[];this.name=b.name;this.driver_feature_select=this.device_feature_select=0;this.device_feature= new Uint32Array(4);this.driver_feature=new Uint32Array(4);for(var c of b.common.features)this.device_feature[c>>>5]|=1<<(c&31),this.driver_feature[c>>>5]|=1<<(c&31);b.common.features.includes(32);this.features_ok=!0;this.device_status=0;this.config_has_changed=!1;this.config_generation=0;this.queues=[];for(const d of b.common.queues)this.queues.push(new V(a,this,d));this.queue_select=0;this.queue_selected=this.queues[0];this.isr_status=0;c=[];c.push(this.create_common_capability(b.common));c.push(this.create_notification_capability(b.notification)); c.push(this.create_isr_capability(b.isr_status));b.device_specific&&c.push(this.create_device_specific_capability(b.device_specific));this.init_capabilities(c);a.devices.pci.register_device(this);this.reset()} da.prototype.create_common_capability=function(a){return{type:1,bar:0,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:[{bytes:4,name:"device_feature_select",read:()=>this.device_feature_select,write:b=>{this.device_feature_select=b}},{bytes:4,name:"device_feature",read:()=>this.device_feature[this.device_feature_select]||0,write:()=>{}},{bytes:4,name:"driver_feature_select",read:()=>this.driver_feature_select,write:b=>{this.driver_feature_select=b}},{bytes:4,name:"driver_feature", read:()=>this.driver_feature[this.driver_feature_select]||0,write:b=>{const c=this.device_feature[this.driver_feature_select];this.driver_feature_select65535,write:()=>{}},{bytes:2,name:"num_queues",read:()=>this.queues.length,write:()=>{}},{bytes:1,name:"device_status",read:()=>this.device_status,write:b=>{0===b&&this.reset();b&~this.device_status& 4&&this.device_status&64&&this.notify_config_changes();this.features_ok||(b&=-9);this.device_status=b;if(b&~this.device_status&4)a.on_driver_ok()}},{bytes:1,name:"config_generation",read:()=>this.config_generation,write:()=>{}},{bytes:2,name:"queue_select",read:()=>this.queue_select,write:b=>{this.queue_select=b;this.queue_selected=this.queue_selectthis.queue_selected?this.queue_selected.size:0,write:b=> {this.queue_selected&&(b&b-1&&(b=1<this.queue_selected.size_supported&&(b=this.queue_selected.size_supported),this.queue_selected.set_size(b))}},{bytes:2,name:"queue_msix_vector",read:()=>65535,write:()=>{}},{bytes:2,name:"queue_enable",read:()=>this.queue_selected?this.queue_selected.enabled|0:0,write:b=>{this.queue_selected&&1===b&&this.queue_selected.is_configured()&&this.queue_selected.enable()}},{bytes:2,name:"queue_notify_off",read:()=>this.queue_selected?this.queue_selected.notify_offset: 0,write:()=>{}},{bytes:4,name:"queue_desc (low dword)",read:()=>this.queue_selected?this.queue_selected.desc_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.desc_addr=b)}},{bytes:4,name:"queue_desc (high dword)",read:()=>0,write:()=>{}},{bytes:4,name:"queue_avail (low dword)",read:()=>this.queue_selected?this.queue_selected.avail_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.avail_addr=b)}},{bytes:4,name:"queue_avail (high dword)",read:()=>0,write:()=>{}},{bytes:4,name:"queue_used (low dword)", read:()=>this.queue_selected?this.queue_selected.used_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.used_addr=b)}},{bytes:4,name:"queue_used (high dword)",read:()=>0,write:()=>{}}]}}; da.prototype.create_notification_capability=function(a){const b=[];let c;c=a.single_handler?0:2;for(const [d,e]of a.handlers.entries())b.push({bytes:2,name:"notify"+d,read:()=>65535,write:e||(()=>{})});return{type:2,bar:1,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array([c&255,c>>8&255,c>>16&255,c>>24]),struct:b}}; da.prototype.create_isr_capability=function(a){return{type:3,bar:2,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:[{bytes:1,name:"isr_status",read:()=>{const b=this.isr_status;this.lower_irq();return b},write:()=>{}}]}};da.prototype.create_device_specific_capability=function(a){return{type:4,bar:3,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:a.struct}}; da.prototype.init_capabilities=function(a){let b=this.pci_space[52]=64;var c=b;for(const e of a){a=16+e.extra.length;c=b;b=c+a;var d=e.struct.reduce((g,f)=>g+f.bytes,0);d+=e.offset;d=16>d?16:1<>>8&255;this.pci_space[c+ 10]=e.offset>>>16&255;this.pci_space[c+11]=e.offset>>>24;this.pci_space[c+12]=d&255;this.pci_space[c+13]=d>>>8&255;this.pci_space[c+14]=d>>>16&255;this.pci_space[c+15]=d>>>24;for(const [g,f]of e.extra.entries())this.pci_space[c+16+g]=f;c=16+4*e.bar;this.pci_space[c]=e.port&254|!e.use_mmio;this.pci_space[c+1]=e.port>>>8&255;this.pci_space[c+2]=e.port>>>16&255;this.pci_space[c+3]=e.port>>>24&255;c=e.port+e.offset;for(const g of e.struct){let f=g.read;a=g.write;if(!e.use_mmio){d=function(l){return f(l& -2)>>((l&1)<<3)&255};const h=function(l){return f(l&-4)>>((l&3)<<3)&255};switch(g.bytes){case 4:this.cpu.io.register_read(c,this,h,void 0,f);this.cpu.io.register_write(c,this,void 0,void 0,a);break;case 2:this.cpu.io.register_read(c,this,d,f);this.cpu.io.register_write(c,this,void 0,a);break;case 1:this.cpu.io.register_read(c,this,f),this.cpu.io.register_write(c,this,a)}}c+=g.bytes}}this.pci_space[b]=9;this.pci_space[b+1]=0;this.pci_space[b+2]=20;this.pci_space[b+3]=5;this.pci_space[b+4]=0;this.pci_space[b+ 5]=0;this.pci_space[b+6]=0;this.pci_space[b+7]=0;this.pci_space[b+8]=0;this.pci_space[b+9]=0;this.pci_space[b+10]=0;this.pci_space[b+11]=0;this.pci_space[b+12]=0;this.pci_space[b+13]=0;this.pci_space[b+14]=0;this.pci_space[b+15]=0;this.pci_space[b+16]=0;this.pci_space[b+17]=0;this.pci_space[b+18]=0;this.pci_space[b+19]=0}; da.prototype.get_state=function(){let a=[];a[0]=this.device_feature_select;a[1]=this.driver_feature_select;a[2]=this.device_feature;a[3]=this.driver_feature;a[4]=this.features_ok;a[5]=this.device_status;a[6]=this.config_has_changed;a[7]=this.config_generation;a[8]=this.isr_status;a[9]=this.queue_select;return a=a.concat(this.queues)}; da.prototype.set_state=function(a){this.device_feature_select=a[0];this.driver_feature_select=a[1];this.device_feature=a[2];this.driver_feature=a[3];this.features_ok=a[4];this.device_status=a[5];this.config_has_changed=a[6];this.config_generation=a[7];this.isr_status=a[8];this.queue_select=a[9];let b=0;for(const c of a.slice(10))this.queues[b].set_state(c),b++;this.queue_selected=this.queues[this.queue_select]||null}; da.prototype.reset=function(){this.driver_feature_select=this.device_feature_select=0;this.driver_feature.set(this.device_feature);this.features_ok=!0;this.queue_select=this.device_status=0;this.queue_selected=this.queues[0];for(const a of this.queues)a.reset();this.config_has_changed=!1;this.config_generation=0;this.lower_irq()};da.prototype.notify_config_changes=function(){this.config_has_changed=!0;this.device_status&4&&this.raise_irq(2)}; da.prototype.update_config_generation=function(){this.config_has_changed&&(this.config_generation++,this.config_generation&=255,this.config_has_changed=!1)};da.prototype.is_feature_negotiated=function(a){return 0<(this.driver_feature[a>>>5]&1<<(a&31))};da.prototype.needs_reset=function(){this.device_status|=64;this.device_status&4&&this.notify_config_changes()};da.prototype.raise_irq=function(a){B(a);this.isr_status|=a;this.pci.raise_irq(this.pci_id)}; da.prototype.lower_irq=function(){this.isr_status=0;this.pci.lower_irq(this.pci_id)};function V(a,b,c){this.cpu=a;this.virtio=b;this.size_supported=this.size=c.size_supported;this.mask=this.size-1;this.enabled=!1;this.notify_offset=c.notify_offset;this.num_staged_replies=this.used_addr=this.avail_last_idx=this.avail_addr=this.desc_addr=0;this.reset()} V.prototype.get_state=function(){const a=[];a[0]=this.size;a[1]=this.size_supported;a[2]=this.enabled;a[3]=this.notify_offset;a[4]=this.desc_addr;a[5]=this.avail_addr;a[6]=this.avail_last_idx;a[7]=this.used_addr;a[8]=this.num_staged_replies;return a}; V.prototype.set_state=function(a){this.size=a[0];this.size_supported=a[1];this.enabled=a[2];this.notify_offset=a[3];this.desc_addr=a[4];this.avail_addr=a[5];this.avail_last_idx=a[6];this.used_addr=a[7];this.num_staged_replies=a[8];this.mask=this.size-1};V.prototype.reset=function(){this.enabled=!1;this.num_staged_replies=this.used_addr=this.avail_last_idx=this.avail_addr=this.desc_addr=0;this.set_size(this.size_supported)}; V.prototype.is_configured=function(){return this.desc_addr&&this.avail_addr&&this.used_addr};V.prototype.enable=function(){this.is_configured();this.enabled=!0};V.prototype.set_size=function(a){this.size=a;this.mask=a-1};V.prototype.count_requests=function(){return this.avail_get_idx()-this.avail_last_idx&this.mask};V.prototype.has_request=function(){return(this.avail_get_idx()&this.mask)!==this.avail_last_idx}; V.prototype.pop_request=function(){this.has_request();var a=this.avail_get_entry(this.avail_last_idx);a=new lb(this,a);this.avail_last_idx=this.avail_last_idx+1&this.mask;return a};V.prototype.push_reply=function(a){const b=this.used_get_idx()+this.num_staged_replies&this.mask;this.used_set_entry(b,a.head_idx,a.length_written);this.num_staged_replies++}; V.prototype.flush_replies=function(){if(0!==this.num_staged_replies){var a=this.used_get_idx()+this.num_staged_replies&65535;this.used_set_idx(a);this.num_staged_replies=0;this.virtio.is_feature_negotiated(29)?(this.avail_get_used_event(),this.virtio.raise_irq(1)):~this.avail_get_flags()&1&&this.virtio.raise_irq(1)}};V.prototype.notify_me_after=function(a){a=this.avail_get_idx()+a&65535;this.used_set_avail_event(a)}; V.prototype.get_descriptor=function(a,b){return{addr_low:this.cpu.read32s(a+16*b),addr_high:this.cpu.read32s(a+16*b+4),len:this.cpu.read32s(a+16*b+8),flags:this.cpu.read16(a+16*b+12),next:this.cpu.read16(a+16*b+14)}};V.prototype.avail_get_flags=function(){return this.cpu.read16(this.avail_addr)};V.prototype.avail_get_idx=function(){return this.cpu.read16(this.avail_addr+2)};V.prototype.avail_get_entry=function(a){return this.cpu.read16(this.avail_addr+4+2*a)}; V.prototype.avail_get_used_event=function(){return this.cpu.read16(this.avail_addr+4+2*this.size)};V.prototype.used_get_flags=function(){return this.cpu.read16(this.used_addr)};V.prototype.used_set_flags=function(a){this.cpu.write16(this.used_addr,a)};V.prototype.used_get_idx=function(){return this.cpu.read16(this.used_addr+2)};V.prototype.used_set_idx=function(a){this.cpu.write16(this.used_addr+2,a)}; V.prototype.used_set_entry=function(a,b,c){this.cpu.write32(this.used_addr+4+8*a,b);this.cpu.write32(this.used_addr+8+8*a,c)};V.prototype.used_set_avail_event=function(a){this.cpu.write16(this.used_addr+4+8*this.size,a)}; function lb(a,b){this.cpu=a.cpu;this.virtio=a.virtio;this.head_idx=b;this.read_buffers=[];this.length_readable=this.read_buffer_offset=this.read_buffer_idx=0;this.write_buffers=[];this.length_writable=this.length_written=this.write_buffer_offset=this.write_buffer_idx=0;let c=a.desc_addr,d=0,e=a.size,g=!1;const f=this.virtio.is_feature_negotiated(28);do{const h=a.get_descriptor(c,b);B(h.addr_high,8);B(h.addr_low,8);B(h.len,8);B(h.flags,4);B(h.next,4);if(f&&h.flags&4)c=h.addr_low,d=b=0,e=h.len/16;else{if(h.flags& 2)g=!0,this.write_buffers.push(h),this.length_writable+=h.len;else{if(g)break;this.read_buffers.push(h);this.length_readable+=h.len}d++;if(d>e)break;if(h.flags&1)b=h.next;else break}}while(1)} lb.prototype.get_next_blob=function(a){let b=0,c=a.length;for(;c&&this.read_buffer_idx!==this.read_buffers.length;){var d=this.read_buffers[this.read_buffer_idx];const e=d.addr_low+this.read_buffer_offset;d=d.len-this.read_buffer_offset;d>c?(d=c,this.read_buffer_offset+=c):(this.read_buffer_idx++,this.read_buffer_offset=0);a.set(this.cpu.read_blob(e,d),b);b+=d;c-=d}return b}; lb.prototype.set_next_blob=function(a){let b=0,c=a.length;for(;c&&this.write_buffer_idx!==this.write_buffers.length;){var d=this.write_buffers[this.write_buffer_idx];const e=d.addr_low+this.write_buffer_offset;d=d.len-this.write_buffer_offset;d>c?(d=c,this.write_buffer_offset+=c):(this.write_buffer_idx++,this.write_buffer_offset=0);this.cpu.write_blob(a.subarray(b,b+d),e);b+=d;c-=d}this.length_written+=b;return b};function mb(a,b){this.bus=b;this.rows=25;this.cols=80;this.ports=4;b=[{size_supported:16,notify_offset:0},{size_supported:16,notify_offset:1},{size_supported:16,notify_offset:2},{size_supported:16,notify_offset:3}];for(let c=1;c{}},notification:{initial_port:47360, single_handler:!1,handlers:[c=>{for(c=this.virtio.queues[c];c.count_requests()>c.size-2;)c.pop_request()},c=>{const d=this.virtio.queues[c],e=3>1:0;for(;d.has_request();){const g=d.pop_request(),f=new Uint8Array(g.length_readable);g.get_next_blob(f);this.bus.send("virtio-console"+e+"-output-bytes",f);this.Ack(c,g)}},c=>{if(2===c)for(c=this.virtio.queues[c];c.count_requests()>c.size-2;)c.pop_request()},c=>{if(3===c)for(var d=this.virtio.queues[c];d.has_request();){var e=d.pop_request(),g=new Uint8Array(e.length_readable); e.get_next_blob(g);var f=t.Unmarshall(["w","h","h"],g,{offset:0});g=f[0];f=f[1];this.Ack(c,e);switch(f){case 0:for(e=0;ethis.cols,write:()=>{}},{bytes:2,name:"rows",read:()=> this.rows,write:()=>{}},{bytes:4,name:"max_nr_ports",read:()=>this.ports,write:()=>{}},{bytes:4,name:"emerg_wr",read:()=>0,write:()=>{}}]}});for(let c=0;c{}},notification:{initial_port:51456,single_handler:!1,handlers:[d=>{d=this.virtio.queues[d];var e=d.avail_get_entry(d.avail_last_idx);e=new lb(d,e);d.avail_last_idx=d.avail_last_idx+1&d.mask;this.virtio.queues[0].push_reply(e);this.virtio.queues[0].flush_replies()},d=>{const e=this.virtio.queues[d];for(;e.has_request();){const g=e.pop_request(),f=new Uint8Array(g.length_readable);g.get_next_blob(f);this.bus.send("net"+ this.id+"-send",f.subarray(12));this.bus.send("eth-transmit-end",[f.length-12]);this.virtio.queues[d].push_reply(g)}this.virtio.queues[d].flush_replies()},d=>{if(d===2*this.pairs)for(var e=this.virtio.queues[d];e.has_request();){const g=e.pop_request(),f=new Uint8Array(g.length_readable);g.get_next_blob(f);const h=t.Unmarshall(["b","b"],f,{offset:0});switch(h[0]<<8|h[1]){case 1024:t.Unmarshall(["h"],f,{offset:2});this.Send(d,g,new Uint8Array([0]));break;case 257:this.mac=f.subarray(2,8);this.Send(d, g,new Uint8Array([0]));this.bus.send("net"+this.id+"-mac",Pa(this.mac));break;default:this.Send(d,g,new Uint8Array([1]));return}}}]},isr_status:{initial_port:50944},device_specific:{initial_port:50688,struct:[0,1,2,3,4,5].map((d,e)=>({bytes:1,name:"mac_"+e,read:()=>this.mac[e],write:()=>{}})).concat([{bytes:2,name:"status",read:()=>this.status,write:()=>{}},{bytes:2,name:"max_pairs",read:()=>this.pairs,write:()=>{}},{bytes:2,name:"mtu",read:()=>1500,write:()=>{}}])}});this.bus.register("net"+this.id+ "-receive",d=>{this.bus.send("eth-receive-end",[d.length]);const e=new Uint8Array(12+d.byteLength);(new DataView(e.buffer,e.byteOffset,e.byteLength)).setInt16(10,1);e.set(d,12);d=this.virtio.queues[0];d.has_request()?(d=d.pop_request(),d.set_next_blob(e),this.virtio.queues[0].push_reply(d),this.virtio.queues[0].flush_replies()):console.log("No buffer to write into!")},this)}nb.prototype.get_state=function(){const a=[];a[0]=this.virtio;a[1]=this.id;a[2]=this.mac;return a}; nb.prototype.set_state=function(a){this.virtio.set_state(a[0]);this.id=a[1];this.preserve_mac_from_state_image&&(this.mac=a[2],this.bus.send("net"+this.id+"-mac",Pa(this.mac)))};nb.prototype.reset=function(){this.virtio.reset()};nb.prototype.Send=function(a,b,c){b.set_next_blob(c);this.virtio.queues[a].push_reply(b);this.virtio.queues[a].flush_replies()};nb.prototype.Ack=function(a,b){this.virtio.queues[a].push_reply(b);this.virtio.queues[a].flush_replies()};const ob="SWAP_IN SWAP_OUT MAJFLT MINFLT MEMFREE MEMTOT AVAIL CACHES HTLB_PGALLOC HTLB_PGFAIL".split(" "); function pb(a,b){this.bus=b;this.zeroed=this.fp_cmd=this.actual=this.num_pages=0;this.virtio=new da(a,{name:"virtio-balloon",pci_id:88,device_id:4165,subsystem_device_id:5,common:{initial_port:55296,queues:[{size_supported:32,notify_offset:0},{size_supported:32,notify_offset:0},{size_supported:2,notify_offset:1},{size_supported:64,notify_offset:2}],features:[1,3,32],on_driver_ok:()=>{}},notification:{initial_port:55552,single_handler:!1,handlers:[c=>{const d=this.virtio.queues[c];for(;d.has_request();){var e= d.pop_request();const g=new Uint8Array(e.length_readable);e.get_next_blob(g);this.virtio.queues[c].push_reply(e);e=g.byteLength/4;this.actual+=0===c?e:-e}this.virtio.queues[c].flush_replies()},c=>{var d=this.virtio.queues[c];if(d.has_request()){d=d.pop_request();const e=new Uint8Array(d.length_readable);d.get_next_blob(e);let g={};for(let f=0;f {const d=this.virtio.queues[c];for(;d.has_request();){const g=d.pop_request();if(0this.num_pages,write:()=>{}},{bytes:4,name:"actual",read:()=>this.actual,write:()=>{}},{bytes:4,name:"free_page_hint_cmd_id",read:()=>this.fp_cmd,write:()=>{}}]}})}pb.prototype.Inflate=function(a){this.num_pages+=a;this.virtio.notify_config_changes()};pb.prototype.Deflate=function(a){this.num_pages-=a;this.virtio.notify_config_changes()}; pb.prototype.Cleanup=function(a){this.fp_cmd=2;this.free_cb=a;this.zeroed=0;this.virtio.notify_config_changes()};pb.prototype.get_state=function(){const a=[];a[0]=this.virtio;a[1]=this.num_pages;a[2]=this.actual;return a};pb.prototype.set_state=function(a){this.virtio.set_state(a[0]);this.num_pages=a[1];this.actual=a[2]};pb.prototype.GetStats=function(a){this.stats_cb=a;for(a=this.virtio.queues[2];a.has_request();){const b=a.pop_request();this.virtio.queues[2].push_reply(b)}this.virtio.queues[2].flush_replies()}; pb.prototype.Reset=function(){};var qb={};function rb(){this.listeners={};this.pair=void 0}rb.prototype.register=function(a,b,c){var d=this.listeners[a];void 0===d&&(d=this.listeners[a]=[]);d.push({fn:b,this_value:c})};rb.prototype.unregister=function(a,b){var c=this.listeners[a];void 0!==c&&(this.listeners[a]=c.filter(function(d){return d.fn!==b}))};rb.prototype.send=function(a,b){if(this.pair&&(a=this.pair.listeners[a],void 0!==a))for(var c=0;cthis.wm.exports[c],b=c=>{const d=a(c);console.assert(d,"Missing import: "+c);return d};this.reset_cpu=b("reset_cpu");this.getiopl=b("getiopl");this.get_eflags=b("get_eflags");this.handle_irqs=b("handle_irqs");this.main_loop=b("main_loop");this.set_jit_config=b("set_jit_config");this.read8=b("read8");this.read16=b("read16");this.read32s=b("read32s");this.write8=b("write8");this.write16=b("write16");this.write32=b("write32");this.in_mapped_range=b("in_mapped_range"); this.fpu_load_tag_word=b("fpu_load_tag_word");this.fpu_load_status_word=b("fpu_load_status_word");this.fpu_get_sti_f64=b("fpu_get_sti_f64");this.translate_address_system_read=b("translate_address_system_read_js");this.get_seg_cs=b("get_seg_cs");this.get_real_eip=b("get_real_eip");this.clear_tlb=b("clear_tlb");this.full_clear_tlb=b("full_clear_tlb");this.update_state_flags=b("update_state_flags");this.set_tsc=b("set_tsc");this.store_current_tsc=b("store_current_tsc");this.set_cpuid_level=b("set_cpuid_level"); this.pic_set_irq=b("pic_set_irq");this.pic_clear_irq=b("pic_clear_irq");this.jit_clear_cache=b("jit_clear_cache_js");this.jit_dirty_cache=b("jit_dirty_cache");this.codegen_finalize_finished=b("codegen_finalize_finished");this.allocate_memory=b("allocate_memory");this.zero_memory=b("zero_memory");this.is_memory_zeroed=b("is_memory_zeroed");this.svga_allocate_memory=b("svga_allocate_memory");this.svga_allocate_dest_buffer=b("svga_allocate_dest_buffer");this.svga_fill_pixel_buffer=b("svga_fill_pixel_buffer"); this.svga_mark_dirty=b("svga_mark_dirty");this.get_pic_addr_master=b("get_pic_addr_master");this.get_pic_addr_slave=b("get_pic_addr_slave");this.zstd_create_ctx=b("zstd_create_ctx");this.zstd_get_src_ptr=b("zstd_get_src_ptr");this.zstd_free_ctx=b("zstd_free_ctx");this.zstd_read=b("zstd_read");this.zstd_read_free=b("zstd_read_free");this.port20_read=b("port20_read");this.port21_read=b("port21_read");this.portA0_read=b("portA0_read");this.portA1_read=b("portA1_read");this.port20_write=b("port20_write"); this.port21_write=b("port21_write");this.portA0_write=b("portA0_write");this.portA1_write=b("portA1_write");this.port4D0_read=b("port4D0_read");this.port4D1_read=b("port4D1_read");this.port4D0_write=b("port4D0_write");this.port4D1_write=b("port4D1_write")};E.prototype.jit_force_generate=function(a){this.jit_force_generate_unsafe&&this.jit_force_generate_unsafe(a)};E.prototype.jit_clear_func=function(a){this.wm.wasm_table.set(a+1024,null)}; E.prototype.jit_clear_all_funcs=function(){const a=this.wm.wasm_table;for(let b=0;900>b;b++)a.set(1024+b,null)}; E.prototype.get_state=function(){var a=[];a[0]=this.memory_size[0];a[1]=new Uint8Array([...this.segment_is_null,...this.segment_access_bytes]);a[2]=this.segment_offsets;a[3]=this.segment_limits;a[4]=this.protected_mode[0];a[5]=this.idtr_offset[0];a[6]=this.idtr_size[0];a[7]=this.gdtr_offset[0];a[8]=this.gdtr_size[0];a[9]=this.page_fault[0];a[10]=this.cr;a[11]=this.cpl[0];a[13]=this.is_32[0];a[16]=this.stack_size_32[0];a[17]=this.in_hlt[0];a[18]=this.last_virt_eip[0];a[19]=this.eip_phys[0];a[22]=this.sysenter_cs[0]; a[23]=this.sysenter_eip[0];a[24]=this.sysenter_esp[0];a[25]=this.prefixes[0];a[26]=this.flags[0];a[27]=this.flags_changed[0];a[28]=this.last_op1[0];a[30]=this.last_op_size[0];a[37]=this.instruction_pointer[0];a[38]=this.previous_ip[0];a[39]=this.reg32;a[40]=this.sreg;a[41]=this.dreg;a[42]=this.reg_pdpte;this.store_current_tsc();a[43]=this.current_tsc;a[45]=this.devices.virtio_9p;a[46]=this.devices.apic;a[47]=this.devices.rtc;a[48]=this.devices.pci;a[49]=this.devices.dma;a[50]=this.devices.acpi;a[52]= this.devices.vga;a[53]=this.devices.ps2;a[54]=this.devices.uart0;a[55]=this.devices.fdc;a[56]=this.devices.cdrom;a[57]=this.devices.hda;a[58]=this.devices.pit;a[59]=this.devices.net;a[60]=this.get_state_pic();a[61]=this.devices.sb16;a[62]=this.fw_value;a[63]=this.devices.ioapic;a[64]=this.tss_size_32[0];a[66]=this.reg_xmm32s;a[67]=this.fpu_st;a[68]=this.fpu_stack_empty[0];a[69]=this.fpu_stack_ptr[0];a[70]=this.fpu_control_word[0];a[71]=this.fpu_ip[0];a[72]=this.fpu_ip_selector[0];a[73]=this.fpu_dp[0]; a[74]=this.fpu_dp_selector[0];a[75]=this.fpu_opcode[0];const {packed_memory:b,bitmap:c}=this.pack_memory();a[77]=b;a[78]=new Uint8Array(c.get_buffer());a[79]=this.devices.uart1;a[80]=this.devices.uart2;a[81]=this.devices.uart3;a[82]=this.devices.virtio_console;a[83]=this.devices.virtio_net;a[84]=this.devices.virtio_balloon;return a}; E.prototype.get_state_pic=function(){const a=new Uint8Array(this.wasm_memory.buffer,this.get_pic_addr_master(),13),b=new Uint8Array(this.wasm_memory.buffer,this.get_pic_addr_slave(),13),c=[],d=[];c[0]=a[0];c[1]=a[1];c[2]=a[2];c[3]=a[3];c[4]=a[4];c[5]=d;c[6]=a[6];c[7]=a[7];c[8]=a[8];c[9]=a[9];c[10]=a[10];c[11]=a[11];c[12]=a[12];d[0]=b[0];d[1]=b[1];d[2]=b[2];d[3]=b[3];d[4]=b[4];d[5]=null;d[6]=b[6];d[7]=b[7];d[8]=b[8];d[9]=b[9];d[10]=b[10];d[11]=b[11];d[12]=b[12];return c}; E.prototype.set_state=function(a){this.memory_size[0]=a[0];this.mem8.length!==this.memory_size[0]&&console.warn("Note: Memory size mismatch. we="+this.mem8.length+" state="+this.memory_size[0]);8===a[1].length?(this.segment_is_null.set(a[1]),this.segment_access_bytes.fill(242),this.segment_access_bytes[1]=250):16===a[1].length&&(this.segment_is_null.set(a[1].subarray(0,8)),this.segment_access_bytes.set(a[1].subarray(8,16)));this.segment_offsets.set(a[2]);this.segment_limits.set(a[3]);this.protected_mode[0]= a[4];this.idtr_offset[0]=a[5];this.idtr_size[0]=a[6];this.gdtr_offset[0]=a[7];this.gdtr_size[0]=a[8];this.page_fault[0]=a[9];this.cr.set(a[10]);this.cpl[0]=a[11];this.is_32[0]=a[13];this.stack_size_32[0]=a[16];this.in_hlt[0]=a[17];this.last_virt_eip[0]=a[18];this.eip_phys[0]=a[19];this.sysenter_cs[0]=a[22];this.sysenter_eip[0]=a[23];this.sysenter_esp[0]=a[24];this.prefixes[0]=a[25];this.flags[0]=a[26];this.flags_changed[0]=a[27];this.last_op1[0]=a[28];this.last_op_size[0]=a[30];this.instruction_pointer[0]= a[37];this.previous_ip[0]=a[38];this.reg32.set(a[39]);this.sreg.set(a[40]);this.dreg.set(a[41]);a[42]&&this.reg_pdpte.set(a[42]);this.set_tsc(a[43][0],a[43][1]);this.devices.virtio_9p&&this.devices.virtio_9p.set_state(a[45]);this.devices.apic&&this.devices.apic.set_state(a[46]);this.devices.rtc&&this.devices.rtc.set_state(a[47]);this.devices.pci&&this.devices.pci.set_state(a[48]);this.devices.dma&&this.devices.dma.set_state(a[49]);this.devices.acpi&&this.devices.acpi.set_state(a[50]);this.devices.vga&& this.devices.vga.set_state(a[52]);this.devices.ps2&&this.devices.ps2.set_state(a[53]);this.devices.uart0&&this.devices.uart0.set_state(a[54]);this.devices.fdc&&this.devices.fdc.set_state(a[55]);this.devices.cdrom&&this.devices.cdrom.set_state(a[56]);this.devices.hda&&this.devices.hda.set_state(a[57]);this.devices.pit&&this.devices.pit.set_state(a[58]);this.devices.net&&this.devices.net.set_state(a[59]);this.set_state_pic(a[60]);this.devices.sb16&&this.devices.sb16.set_state(a[61]);this.devices.uart1&& this.devices.uart1.set_state(a[79]);this.devices.uart2&&this.devices.uart2.set_state(a[80]);this.devices.uart3&&this.devices.uart3.set_state(a[81]);this.devices.virtio_console&&this.devices.virtio_console.set_state(a[82]);this.devices.virtio_net&&this.devices.virtio_net.set_state(a[83]);this.devices.virtio_balloon&&this.devices.virtio_balloon.set_state(a[84]);this.fw_value=a[62];this.devices.ioapic&&this.devices.ioapic.set_state(a[63]);this.tss_size_32[0]=a[64];this.reg_xmm32s.set(a[66]);this.fpu_st.set(a[67]); this.fpu_stack_empty[0]=a[68];this.fpu_stack_ptr[0]=a[69];this.fpu_control_word[0]=a[70];this.fpu_ip[0]=a[71];this.fpu_ip_selector[0]=a[72];this.fpu_dp[0]=a[73];this.fpu_dp_selector[0]=a[74];this.fpu_opcode[0]=a[75];const b=new k.Bitmap(a[78].buffer);this.unpack_memory(b,a[77]);this.update_state_flags();this.full_clear_tlb();this.jit_clear_cache()}; E.prototype.set_state_pic=function(a){const b=new Uint8Array(this.wasm_memory.buffer,this.get_pic_addr_master(),13),c=new Uint8Array(this.wasm_memory.buffer,this.get_pic_addr_slave(),13);b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];const d=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12]}; E.prototype.pack_memory=function(){var a=this.mem8.length>>12,b=[];for(var c=0;c>12;let d=0;for(let g=0;g(a|0)&&(a=Math.pow(2,31)-131072);a=(a-1|131071)+1|0;console.assert(0===this.memory_size[0],"Expected uninitialised memory");this.memory_size[0]=a;b=this.allocate_memory(a);this.mem8=k.view(Uint8Array,this.wasm_memory,b,a);this.mem32s=k.view(Uint32Array,this.wasm_memory,b,a>>2)}; E.prototype.init=function(a,b){this.create_memory(a.memory_size||67108864,a.initrd?67108864:1048576);a.disable_jit&&this.set_jit_config(0,1);a.cpuid_level&&this.set_cpuid_level(a.cpuid_level);this.acpi_enabled[0]=+a.acpi;this.reset_cpu();var c=new C(this);this.io=c;this.bios.main=a.bios;this.bios.vga=a.vga_bios;this.load_bios();if(a.bzimage){const e=Bb(this.mem8,a.bzimage,a.initrd,a.cmdline||"");e&&this.option_roms.push(e)}c.register_read(179,this,function(){return 0});var d=0;c.register_read(146, this,function(){return d});c.register_write(146,this,function(e){d=e});c.register_read(1297,this,function(){return this.fw_pointer>8|l<<8&65280}function h(l){return l<<24|l<<8&16711680|l>>8&65280|l>>>24}ta("bios config port, index="+B(e));this.fw_pointer=0;if(0===e)this.fw_value=g(1431127377);else if(1===e)this.fw_value= g(0);else if(3===e)this.fw_value=g(this.memory_size[0]);else if(5===e)this.fw_value=g(1);else if(15===e)this.fw_value=g(1);else if(13===e)this.fw_value=new Uint8Array(16);else if(25===e){e=new Int32Array(4+64*this.option_roms.length);const l=new Uint8Array(e.buffer);e[0]=h(this.option_roms.length);for(let m=0;m>2]=h(p.length);e[q+4>>2]=f(49152+m);for(let r=0;re?this.fw_value=g(0):49152<=e&&e-49152a.byteLength){var d=new Int32Array(2048);(new Uint8Array(d.buffer)).set(new Uint8Array(a))}else d=new Int32Array(a,0,2048);for(var e=0;8192>e;e+=4){if(464367618===d[e>>2]){var g=d[e+4>>2];if(464367618+g+d[e+8>>2]|0)continue}else continue;ta("Multiboot magic found, flags: "+B(g>>>0,8),2);var f=this;this.io.register_read(244,this,function(){return 0},function(){return 0},function(){var n=31860,p=0;if(c){p|=4;f.write32(31760,n);c+="\x00"; var q=(new TextEncoder).encode(c);f.write_blob(q,n);n+=q.length}if(g&2){p|=64;q=0;f.write32(31788,0);f.write32(31792,n);var r=0;var A=!1;for(let u=0;4294967296>u;u+=131072)A&&void 0!==f.memory_map_read8[u>>>17]?(f.write32(n,20),f.write32(n+4,r),f.write32(n+8,0),f.write32(n+12,u-r),f.write32(n+16,0),f.write32(n+20,1),n+=24,q+=24,A=!1):A||void 0!==f.memory_map_read8[u>>>17]||(r=u,A=!0);f.write32(31788,q)}f.write32(31744,p);q=p=0;if(g&65536){A=d[e+12>>2];p=d[e+16>>2];var w=d[e+20>>2];q=d[e+24>>2];r= d[e+28>>2];B(A,8);B(p,8);B(w,8);B(q,8);B(r,8);A=new Uint8Array(a,e-(A-p),0===w?void 0:w-p);f.write_blob(A,p);p=r|0;q=Math.max(w,q)}else if(1179403647===d[0]){r=new DataView(a);const [u,G]=Cb(r,Db);console.assert(52===G);console.assert(1179403647===u.magic,"Bad magic");console.assert(1===u.class,"Unimplemented: 64 bit elf");console.assert(1===u.data,"Unimplemented: big endian");console.assert(1===u.version0,"Bad version0");console.assert(2===u.type,"Unimplemented type");console.assert(1===u.version1, "Bad version1");console.assert(52===u.ehsize,"Bad header size");console.assert(32===u.phentsize,"Bad program header size");console.assert(40===u.shentsize,"Bad section header size");[p]=Eb(new DataView(r.buffer,r.byteOffset+u.phoff,u.phentsize*u.phnum),Fb,u.phnum);Eb(new DataView(r.buffer,r.byteOffset+u.shoff,u.shentsize*u.shnum),Gb,u.shnum);r=u;A=p;p=r.entry;for(w of A)0!==w.type&&(1===w.type?w.paddr+w.memszp&&(p=p-w.vaddr+w.paddr)):B(w.paddr):2===w.type||3===w.type||4===w.type||6===w.type||7===w.type||1685382480===w.type||1685382481===w.type||1685382482===w.type||1685382483===w.type||B(w.type))}b&&(f.write32(31764,1),f.write32(31768,n),w=q,0!==(w&4095)&&(w=(w&-4096)+4096),q=w+b.byteLength,f.write32(n,w),f.write32(n+4,q),f.write32(n+8,0),f.write32(n+12,0),f.write_blob(new Uint8Array(b),w));f.reg32[3]=31744;f.cr[0]=1;f.protected_mode[0]= 1;f.flags[0]=2;f.is_32[0]=1;f.stack_size_32[0]=1;for(n=0;6>n;n++)f.segment_is_null[n]=0,f.segment_offsets[n]=0,f.segment_limits[n]=4294967295,f.sreg[n]=45058;f.instruction_pointer[0]=f.get_seg_cs()+p|0;f.update_state_flags();f.debug.dump_state();f.debug.dump_regs();return 732803074});this.io.register_write_consecutive(244,this,function(n){console.log("Test exited with code "+B(n,2));throw"HALT";},function(){},function(){},function(){});for(let n=0;15>=n;n++){function p(q){B(n);B(q,2);q?this.device_raise_irq(n): this.device_lower_irq(n)}this.io.register_write(8192+n,this,p,p,p)}const l=new Uint8Array(512);(new Uint16Array(l.buffer))[0]=43605;l[2]=1;var h=3;l[h++]=102;l[h++]=229;l[h++]=244;let m=l[h]=0;for(let n=0;n>4&240);a.cmos_write(61,c&255);a.cmos_write(21,128);a.cmos_write(22,2);c=0;1048576<=this.memory_size[0]&&(c=this.memory_size[0]-1048576>>10,c=Math.min(c,65535));a.cmos_write(23,c&255);a.cmos_write(24,c>>8&255);a.cmos_write(48,c&255);a.cmos_write(49,c>>8&255);c=0;16777216<=this.memory_size[0]&&(c=this.memory_size[0]-16777216>>16,c=Math.min(c,65535));a.cmos_write(52,c&255);a.cmos_write(53,c>>8&255);a.cmos_write(91,0);a.cmos_write(92, 0);a.cmos_write(93,0);a.cmos_write(20,47);a.cmos_write(95,0);b.fastboot&&a.cmos_write(63,1)}; E.prototype.load_bios=function(){var a=this.bios.main,b=this.bios.vga;if(a){var c=new Uint8Array(a);this.write_blob(c,1048576-a.byteLength);if(b){var d=new Uint8Array(b);this.write_blob(d,786432);this.io.mmap_register(4272947200,1048576,function(e){e=e-4272947200|0;return e>>0,e>>>0);WebAssembly.instantiate(g,{e:this.jit_imports}).then(f=>{this.wm.wasm_table.set(a+1024,f.instance.exports.f);this.codegen_finalize_finished(a,b,c);this.test_hook_did_finalize_wasm&&this.test_hook_did_finalize_wasm(g)})};E.prototype.log_uncompiled_code=function(){};E.prototype.dump_function_code=function(){}; E.prototype.run_hardware_timers=function(a,b){const c=this.devices.pit.timer(b,!1),d=this.devices.rtc.timer(b,!1);let e=100,g=100;a&&(e=this.devices.acpi.timer(b),g=this.devices.apic.timer(b));return Math.min(c,d,e,g)};E.prototype.device_raise_irq=function(a){this.pic_set_irq(a);this.devices.ioapic&&this.devices.ioapic.set_irq(a)};E.prototype.device_lower_irq=function(a){this.pic_clear_irq(a);this.devices.ioapic&&this.devices.ioapic.clear_irq(a)};E.prototype.debug_init=function(){var a=this,b={};this.debug=b;b.init=function(){};b.get_regs_short=function(){};b.dump_regs=function(){};b.get_state=function(){};b.dump_state=function(){};b.dump_stack=function(){};b.dump_page_structures=function(){if(a.cr[4]&32)for(var g=0;4>g;g++)a.read32s(a.cr[3]+8*g)};b.dump_gdt_ldt=function(){};b.dump_idt=function(){};b.get_memory_dump=function(){};b.memory_hex_dump=function(){};b.used_memory_dump=function(){};b.debug_interrupt=function(){};let c,d;b.dump_code= function(g,f,h){if(!d){if(void 0===c&&(c="function"===typeof require?require("./capstone-x86.min.js"):window.cs,void 0===c))return;d=[new c.Capstone(c.ARCH_X86,c.MODE_16),new c.Capstone(c.ARCH_X86,c.MODE_32)]}try{d[g].disasm(f,h).forEach(function(l){ta(B(l.address>>>0)+": "+k.pads(l.bytes.map(m=>B(m,2).slice(-2)).join(" "),20)+" "+l.mnemonic+" "+l.op_str)})}catch(l){ta("Could not disassemble: "+Array.from(f).map(m=>B(m,2)).join(" "))}};let e;b.dump_wasm=function(g){if(void 0===e&&(e="function"=== typeof require?require("./libwabt.js"):new window.WabtModule,void 0===e))return;g=g.slice();try{var f=e.readWasm(g,{readDebugNames:!1});f.generateNames();f.applyNames();f.toText({foldExprs:!0,inlineExport:!0})}catch(m){var h=new Blob([g]),l=document.createElement("a");l.download="failed.wasm";l.href=window.URL.createObjectURL(h);l.dataset.downloadurl=["application/octet-stream",l.download,l.href].join(":");l.click();window.URL.revokeObjectURL(l.src);console.log(m.toString())}finally{f&&f.destroy()}}};const Hb=DataView.prototype,Ib={size:1,get:Hb.getUint8,set:Hb.setUint8},Jb={size:2,get:Hb.getUint16,set:Hb.setUint16},W={size:4,get:Hb.getUint32,set:Hb.setUint32},Db=Kb([{magic:W},{class:Ib},{data:Ib},{version0:Ib},{osabi:Ib},{abiversion:Ib},{pad0:function(a){return{size:a,get:()=>-1}}(7)},{type:Jb},{machine:Jb},{version1:W},{entry:W},{phoff:W},{shoff:W},{flags:W},{ehsize:Jb},{phentsize:Jb},{phnum:Jb},{shentsize:Jb},{shnum:Jb},{shstrndx:Jb}]);console.assert(52===Db.reduce((a,b)=>a+b.size,0)); const Fb=Kb([{type:W},{offset:W},{vaddr:W},{paddr:W},{filesz:W},{memsz:W},{flags:W},{align:W}]);console.assert(32===Fb.reduce((a,b)=>a+b.size,0));const Gb=Kb([{name:W},{type:W},{flags:W},{addr:W},{offset:W},{size:W},{link:W},{info:W},{addralign:W},{entsize:W}]);console.assert(40===Gb.reduce((a,b)=>a+b.size,0));function Kb(a){return a.map(function(b){var c=Object.keys(b);console.assert(1===c.length);c=c[0];b=b[c];console.assert(0{f(n,p);n=null},10),!1;f(z,I);return!1}}function f(z,I){a:{if(void 0!==z.code){var R=G[z.code];if(void 0!==R)break a}R=A[z.keyCode]}R?h(R,I,z.repeat):console.log("Missing char in map: keyCode="+(z.keyCode||-1).toString(16)+" code="+z.code)}function h(z,I,R){if(I)m[z]&&!R&&h(z,!1);else if(!m[z])return; (m[z]=I)||(z|=128);255>8),l(z&255)):l(z)}function l(z){r.bus.send("keyboard-code",z)}var m={},n=null,p=!1,q=0,r=this;this.emu_enabled=!0;var A=new Uint16Array([0,0,0,0,0,0,0,0,14,15,0,0,0,28,0,0,42,29,56,0,58,0,0,0,0,0,0,1,0,0,0,0,57,57417,57425,57423,57415,57419,57416,57421,80,0,0,0,0,82,83,0,11,2,3,4,5,6,7,8,9,10,0,39,0,13,0,0,0,30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,57435,57436,57437,0,0,82,79,80,81,75,76,77,71,72,73,0,0,0,0,0,0,59,60,61,62,63,64, 65,66,67,68,87,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,39,13,51,12,52,53,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,43,27,40,0,57435,57400,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),w={8:8,10:13,32:32,39:222,44:188,45:189,46:190,47:191,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,59:186,61:187,91:219,92:220,93:221,96:192,97:65,98:66,99:67,100:68,101:69,102:70,103:71,104:72,105:73,106:74,107:75, 108:76,109:77,110:78,111:79,112:80,113:81,114:82,115:83,116:84,117:85,118:86,119:87,120:88,121:89,122:90},u={33:49,34:222,35:51,36:52,37:53,38:55,40:57,41:48,42:56,43:187,58:186,60:188,62:190,63:191,64:50,65:65,66:66,67:67,68:68,69:69,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,82:82,83:83,84:84,85:85,86:86,87:87,88:88,89:89,90:90,94:54,95:189,123:219,124:220,125:221,126:192},G={Escape:1,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10, Digit0:11,Minus:12,Equal:13,Backspace:14,Tab:15,KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,BracketLeft:26,BracketRight:27,Enter:28,ControlLeft:29,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,Semicolon:39,Quote:40,Backquote:41,ShiftLeft:42,Backslash:43,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Comma:51,Period:52,Slash:53,IntlRo:53,ShiftRight:54,NumpadMultiply:55,AltLeft:56,Space:57,CapsLock:58,F1:59,F2:60,F3:61,F4:62,F5:63, F6:64,F7:65,F8:66,F9:67,F10:68,NumLock:69,ScrollLock:70,Numpad7:71,Numpad8:72,Numpad9:73,NumpadSubtract:74,Numpad4:75,Numpad5:76,Numpad6:77,NumpadAdd:78,Numpad1:79,Numpad2:80,Numpad3:81,Numpad0:82,NumpadDecimal:83,IntlBackslash:86,F11:87,F12:88,NumpadEnter:57372,ControlRight:57373,NumpadDivide:57397,AltRight:57400,Home:57415,ArrowUp:57416,PageUp:57417,ArrowLeft:57419,ArrowRight:57421,End:57423,ArrowDown:57424,PageDown:57425,Insert:57426,Delete:57427,OSLeft:57435,OSRight:57436,ContextMenu:57437};this.bus= a;this.destroy=function(){"undefined"!==typeof window&&(window.removeEventListener("keyup",c,!1),window.removeEventListener("keydown",d,!1),window.removeEventListener("blur",e,!1))};this.init=function(){"undefined"!==typeof window&&(this.destroy(),window.addEventListener("keyup",c,!1),window.addEventListener("keydown",d,!1),window.addEventListener("blur",e,!1))};this.init();this.simulate_press=function(z){z={keyCode:z};g(z,!0);g(z,!1)};this.simulate_char=function(z){var I=z.charCodeAt(0);I in w?this.simulate_press(w[I]): I in u?(l(42),this.simulate_press(u[I]),l(170)):console.log("ascii -> keyCode not found: ",I,z)}};function Tb(a,b){function c(u){if(!w.enabled||!w.emu_enabled)return!1;var G=b||document.body,z;if(!(z=document.pointerLockElement))a:{for(u=u.target;u.parentNode;){if(u===G){z=!0;break a}u=u.parentNode}z=!1}return z}function d(u){c(u)&&(u=u.changedTouches)&&u.length&&(u=u[u.length-1],r=u.clientX,A=u.clientY)}function e(){if(n||q||p)w.bus.send("mouse-click",[!1,!1,!1]),n=q=p=!1}function g(u){if(w.bus&&c(u)&&w.is_running){var G=0,z=0,I=u.changedTouches;I?I.length&&(I=I[I.length-1],G=I.clientX-r,z=I.clientY- A,r=I.clientX,A=I.clientY,u.preventDefault()):"number"===typeof u.movementX?(G=u.movementX,z=u.movementY):"number"===typeof u.webkitMovementX?(G=u.webkitMovementX,z=u.webkitMovementY):"number"===typeof u.mozMovementX?(G=u.mozMovementX,z=u.mozMovementY):(G=u.clientX-r,z=u.clientY-A,r=u.clientX,A=u.clientY);w.bus.send("mouse-delta",[.15*G,-(.15*z)]);b&&w.bus.send("mouse-absolute",[u.pageX-b.offsetLeft,u.pageY-b.offsetTop,b.offsetWidth,b.offsetHeight])}}function f(u){c(u)&&l(u,!0)}function h(u){c(u)&& l(u,!1)}function l(u,G){w.bus&&(1===u.which?n=G:2===u.which?q=G:3===u.which&&(p=G),w.bus.send("mouse-click",[n,q,p]),u.preventDefault())}function m(u){if(c(u)){var G=u.wheelDelta||-u.detail;0>G?G=-1:0{switch(n.data.type){case "queue":m.queue_push(n.data.value);break;case "sampling-rate":m.source_samples_per_destination=n.data.value/sampleRate}};return m}var l=[new Float32Array(256),new Float32Array(256)];Reflect.setPrototypeOf(h.prototype,AudioWorkletProcessor.prototype);Reflect.setPrototypeOf(h,AudioWorkletProcessor);h.prototype.process=h.prototype.process=function(m,n){for(m=0;mm?(m+=this.source_buffer_previous[0].length,this.source_buffer_previous[n][m]):this.source_buffer_current[n][m]};h.prototype.ensure_enough_data=function(m){var n=this.source_buffer_current[0].length;n-this.source_block_start this.queued_samples&&this.queue_length&&this.dbg_log("Not enough samples - should not happen during midway of playback");this.source_buffer_previous=this.source_buffer_current;this.source_buffer_current=this.queue_shift();var m=this.source_buffer_current[0].length;if(256>m){for(var n=this.queue_start,p=0;256>m&&pthis.queued_samples/this.source_samples_per_destination&&this.port.postMessage({type:"pump"})};h.prototype.queue_push=function(m){this.queue_length{URL.revokeObjectURL(g);this.node_processor=new AudioWorkletNode(this.audio_context,"dac-processor",{numberOfInputs:0,numberOfOutputs:1,outputChannelCount:[2],parameterData:{},processorOptions:{}});this.node_processor.port.postMessage({type:"sampling-rate",value:this.sampling_rate});this.node_processor.port.onmessage=f=>{switch(f.data.type){case "pump":this.pump()}};this.node_processor.connect(this.node_output)}); this.mixer_connection=c.add_source(this.node_output,2);this.mixer_connection.set_gain_hidden(3);a.register("dac-send-data",function(f){this.queue(f)},this);a.register("dac-enable",function(){this.enabled=!0},this);a.register("dac-disable",function(){this.enabled=!1},this);a.register("dac-tell-sampling-rate",function(f){this.sampling_rate=f;this.node_processor&&this.node_processor.port.postMessage({type:"sampling-rate",value:f})},this)} Vb.prototype.queue=function(a){this.node_processor&&this.node_processor.port.postMessage({type:"queue",value:a},[a[0].buffer,a[1].buffer])};Vb.prototype.pump=function(){this.enabled&&this.bus.send("dac-request-data")}; function Wb(a,b,c){this.bus=a;this.audio_context=b;this.enabled=!1;this.sampling_rate=22050;this.buffered_time=0;this.rate_ratio=1;this.node_lowpass=this.audio_context.createBiquadFilter();this.node_lowpass.type="lowpass";this.node_output=this.node_lowpass;this.mixer_connection=c.add_source(this.node_output,2);this.mixer_connection.set_gain_hidden(3);a.register("dac-send-data",function(d){this.queue(d)},this);a.register("dac-enable",function(){this.enabled=!0;this.pump()},this);a.register("dac-disable", function(){this.enabled=!1},this);a.register("dac-tell-sampling-rate",function(d){this.sampling_rate=d;this.rate_ratio=Math.ceil(8E3/d);this.node_lowpass.frequency.setValueAtTime(d/2,this.audio_context.currentTime)},this)} Wb.prototype.queue=function(a){var b=a[0].length,c=b/this.sampling_rate;if(1this.pump(),1E3*b);a.start(this.buffered_time);this.buffered_time+=c;setTimeout(()=>this.pump(),0)};Wb.prototype.pump=function(){this.enabled&&(.2l?void 0===this.update_timer&&(this.update_timer=setTimeout(()=>{this.update_timer=void 0;this.last_update=Date.now();this.render()},16-l)):(void 0!==this.update_timer&&(clearTimeout(this.update_timer),this.update_timer=void 0),this.last_update=h,this.render())};this.render=function(){a.value=this.text;this.text_new_line&&(this.text_new_line= !1,a.scrollTop=1E9)};this.send_char=function(h){f.bus&&f.bus.send("serial0-input",h)}} function ac(a,b){this.element=a;if(window.Terminal){var c=this.term=new window.Terminal({logLevel:"off"});c.write("This is the serial console. Whatever you type or paste here will be sent to COM1");var d=c.onData(function(e){for(let g=0;ga)){this.last_connect_attempt=Date.now();try{this.socket=new WebSocket(this.url)}catch(b){console.error(b);return}this.socket.binaryType="arraybuffer";this.socket.onopen=this.handle_open.bind(this);this.socket.onmessage=this.handle_message.bind(this);this.socket.onclose=this.handle_close.bind(this); this.socket.onerror=this.handle_error.bind(this)}}};bc.prototype.send=function(a){this.socket&&1===this.socket.readyState?this.socket.send(a):(this.send_queue.push(a),this.send_queue.length>2*this.send_queue_limit&&(this.send_queue=this.send_queue.slice(-this.send_queue_limit)),this.connect())};bc.prototype.change_proxy=function(a){this.url=a;this.socket&&(this.socket.onclose=function(){},this.socket.onerror=function(){},this.socket.close(),this.socket=void 0)};function X(a){this.cpu_is_running=!1;this.cpu_exception_hook=function(){};var b=qb.create();this.bus=b[0];this.emulator_bus=b[1];var c,d;const e=new WebAssembly.Table({element:"anyfunc",initial:1924});b={cpu_exception_hook:f=>this.cpu_exception_hook(f),run_hardware_timers:function(f,h){return c.run_hardware_timers(f,h)},cpu_event_halt:()=>{this.emulator_bus.send("cpu-event-halt")},abort:function(){},microtick:D.microtick,get_rand_int:function(){return k.get_rand_int()},apic_acknowledge_irq:function(){return c.devices.apic.acknowledge_irq()}, stop_idling:function(){return c.stop_idling()},io_port_read8:function(f){return c.io.port_read8(f)},io_port_read16:function(f){return c.io.port_read16(f)},io_port_read32:function(f){return c.io.port_read32(f)},io_port_write8:function(f,h){c.io.port_write8(f,h)},io_port_write16:function(f,h){c.io.port_write16(f,h)},io_port_write32:function(f,h){c.io.port_write32(f,h)},mmap_read8:function(f){return c.mmap_read8(f)},mmap_read16:function(f){return c.mmap_read16(f)},mmap_read32:function(f){return c.mmap_read32(f)}, mmap_write8:function(f,h){c.mmap_write8(f,h)},mmap_write16:function(f,h){c.mmap_write16(f,h)},mmap_write32:function(f,h){c.mmap_write32(f,h)},mmap_write64:function(f,h,l){c.mmap_write64(f,h,l)},mmap_write128:function(f,h,l,m,n){c.mmap_write128(f,h,l,m,n)},log_from_wasm:function(f,h){k.read_sized_string_from_mem(d,f,h)},console_log_from_wasm:function(f,h){f=k.read_sized_string_from_mem(d,f,h);console.error(f)},dbg_trace_from_wasm:function(){},codegen_finalize:(f,h,l,m,n)=>{c.codegen_finalize(f,h,l, m,n)},jit_clear_func:f=>c.jit_clear_func(f),jit_clear_all_funcs:()=>c.jit_clear_all_funcs(),__indirect_function_table:e};let g=a.wasm_fn;g||(g=f=>new Promise(h=>{let l="v86.wasm",m="v86-fallback.wasm";if(a.wasm_path){l=a.wasm_path;const n=l.lastIndexOf("/");m=(-1===n?"":l.substr(0,n))+"/"+m}else"undefined"===typeof window&&"string"===typeof __dirname?(l=__dirname+"/"+l,m=__dirname+"/"+m):(l="build/"+l,m="build/"+m);k.load_file(l,{done:async n=>{try{const {instance:p}=await WebAssembly.instantiate(n, f);this.wasm_source=n;h(p.exports)}catch(p){k.load_file(m,{done:async q=>{const {instance:r}=await WebAssembly.instantiate(q,f);this.wasm_source=q;h(r.exports)}})}},progress:n=>{this.emulator_bus.send("download-progress",{file_index:0,file_count:1,file_name:l,lengthComputable:n.lengthComputable,total:n.total,loaded:n.loaded})}})}));g({env:b}).then(f=>{d=f.memory;f.rust_init();f=this.v86=new D(this.emulator_bus,{exports:f,wasm_table:e});c=f.cpu;this.continue_init(f,a)});this.zstd_worker=null;this.zstd_worker_request_id= 0}H.exportSymbol("V86",X); X.prototype.continue_init=async function(a,b){function c(q,r){switch(q){case "hda":e.hda=this.disk_images.hda=r;break;case "hdb":e.hdb=this.disk_images.hdb=r;break;case "cdrom":e.cdrom=this.disk_images.cdrom=r;break;case "fda":e.fda=this.disk_images.fda=r;break;case "fdb":e.fdb=this.disk_images.fdb=r;break;case "multiboot":e.multiboot=this.disk_images.multiboot=r.buffer;break;case "bzimage":e.bzimage=this.disk_images.bzimage=r.buffer;break;case "initrd":e.initrd=this.disk_images.initrd=r.buffer;break; case "bios":e.bios=r.buffer;break;case "vga_bios":e.vga_bios=r.buffer;break;case "initial_state":e.initial_state=r.buffer;break;case "fs9p_json":e.fs9p_json=r}}async function d(){if(e.fs9p&&e.fs9p_json&&!e.initial_state&&(e.fs9p.load_from_json(e.fs9p_json),b.bzimage_initrd_from_filesystem)){const {bzimage_path:q,initrd_path:r}=this.get_bzimage_initrd_from_filesystem(e.fs9p),[A,w]=await Promise.all([e.fs9p.read_file(r),e.fs9p.read_file(q)]);c.call(this,"initrd",new k.SyncBuffer(A.buffer));c.call(this, "bzimage",new k.SyncBuffer(w.buffer))}this.serial_adapter&&this.serial_adapter.show&&this.serial_adapter.show();this.v86.init(e);e.initial_state&&(a.restore_state(e.initial_state),e.initial_state=void 0);b.autostart&&this.v86.run();this.emulator_bus.send("emulator-loaded")}this.bus.register("emulator-stopped",function(){this.cpu_is_running=!1;this.screen_adapter.pause()},this);this.bus.register("emulator-started",function(){this.cpu_is_running=!0;this.screen_adapter.continue()},this);var e={};this.disk_images= {fda:void 0,fdb:void 0,hda:void 0,hdb:void 0,cdrom:void 0};var g=b.boot_order?b.boot_order:b.fda?801:b.hda?786:291;e.acpi=b.acpi;e.disable_jit=b.disable_jit;e.load_devices=!0;e.memory_size=b.memory_size||67108864;e.vga_memory_size=b.vga_memory_size||8388608;e.boot_order=g;e.fastboot=b.fastboot||!1;e.fda=void 0;e.fdb=void 0;e.uart1=b.uart1;e.uart2=b.uart2;e.uart3=b.uart3;e.cmdline=b.cmdline;e.preserve_mac_from_state_image=b.preserve_mac_from_state_image;e.mac_address_translation=b.mac_address_translation; e.cpuid_level=b.cpuid_level;e.virtio_balloon=b.virtio_balloon;e.virtio_console=b.virtio_console;e.virtio_net=b.virtio_net;e.screen_options=b.screen_options;if(g=b.network_relay_url||b.net_device&&b.net_device.relay_url)"fetch"===g?this.network_adapter=new cc(this.bus,b.net_device):"inbrowser"===g?this.network_adapter=new dc(this.bus,b.net_device):g.startsWith("wisp://")||g.startsWith("wisps://")?this.network_adapter=new ec(g,this.bus,b.net_device):this.network_adapter=new bc(g,this.bus);e.net_device= b.net_device||{type:"ne2k"};g=b.screen||{};b.screen_container&&(g.container=b.screen_container);b.disable_keyboard||(this.keyboard_adapter=new Sb(this.bus));b.disable_mouse||(this.mouse_adapter=new Tb(this.bus,g.container));this.screen_adapter=g.container?new aa(g,()=>this.v86.cpu.devices.vga&&this.v86.cpu.devices.vga.screen_fill_buffer()):new fc;e.screen=this.screen_adapter;e.screen_options=g;b.serial_container&&(this.serial_adapter=new $b(b.serial_container,this.bus));b.serial_container_xtermjs&& (this.serial_adapter=new ac(b.serial_container_xtermjs,this.bus));b.disable_speaker||(this.speaker_adapter=new Ub(this.bus));var f=[];g=(q,r)=>{if(r)if(r.get&&r.set&&r.load)f.push({name:q,loadable:r});else{if("bios"===q||"vga_bios"===q||"initial_state"===q||"multiboot"===q||"bzimage"===q||"initrd"===q)r.async=!1;if("fda"===q||"fdb"===q)r.async=!1;r.url&&!r.async?f.push({name:q,url:r.url,size:r.size}):f.push({name:q,loadable:k.buffer_from_object(r,this.zstd_decompress_worker.bind(this))})}};b.state&& console.warn("Warning: Unknown option 'state'. Did you mean 'initial_state'?");g("bios",b.bios);g("vga_bios",b.vga_bios);g("cdrom",b.cdrom);g("hda",b.hda);g("hdb",b.hdb);g("fda",b.fda);g("fdb",b.fdb);g("initial_state",b.initial_state);g("multiboot",b.multiboot);g("bzimage",b.bzimage);g("initrd",b.initrd);if(b.filesystem){g=b.filesystem.basefs;var h=b.filesystem.baseurl;let q=new gc;h&&(q=new hc(q,h));e.fs9p=this.fs9p=new Z(q);if(g){if("object"===typeof g){var l=g.size;g=g.url}f.push({name:"fs9p_json", url:g,size:l,as_json:!0})}}var m=this,n=f.length,p=function(q){if(q===n)setTimeout(d.bind(this),0);else{var r=f[q];r.loadable?(r.loadable.onload=function(){c.call(this,r.name,r.loadable);p(q+1)}.bind(this),r.loadable.load()):k.load_file(r.url,{done:function(A){r.url.endsWith(".zst")&&"initial_state"!==r.name&&(A=this.zstd_decompress(r.size,new Uint8Array(A)));c.call(this,r.name,r.as_json?A:new k.SyncBuffer(A));p(q+1)}.bind(this),progress:function(A){200===A.target.status?m.emulator_bus.send("download-progress", {file_index:q,file_count:n,file_name:r.url,lengthComputable:A.lengthComputable,total:A.total||r.size,loaded:A.loaded}):m.emulator_bus.send("download-error",{file_index:q,file_count:n,file_name:r.url,request:A.target})},as_json:r.as_json})}}.bind(this);p(0)}; X.prototype.zstd_decompress=function(a,b){const c=this.v86.cpu;this.zstd_context=c.zstd_create_ctx(b.length);(new Uint8Array(c.wasm_memory.buffer)).set(b,c.zstd_get_src_ptr(this.zstd_context));b=c.zstd_read(this.zstd_context,a);const d=c.wasm_memory.buffer.slice(b,b+a);c.zstd_read_free(b,a);c.zstd_free_ctx(this.zstd_context);this.zstd_context=null;return d}; X.prototype.zstd_decompress_worker=async function(a,b){if(!this.zstd_worker){const c=URL.createObjectURL(new Blob(["("+function(){let d;globalThis.onmessage=function(e){if(d){var {src:g,decompressed_size:f,id:h}=e.data;e=d.exports;var l=e.zstd_create_ctx(g.length);(new Uint8Array(e.memory.buffer)).set(g,e.zstd_get_src_ptr(l));var m=e.zstd_read(l,f),n=e.memory.buffer.slice(m,m+f);e.zstd_read_free(m,f);e.zstd_free_ctx(l);postMessage({result:n,id:h},[n])}else l=Object.fromEntries("cpu_exception_hook run_hardware_timers cpu_event_halt microtick get_rand_int apic_acknowledge_irq stop_idling io_port_read8 io_port_read16 io_port_read32 io_port_write8 io_port_write16 io_port_write32 mmap_read8 mmap_read16 mmap_read32 mmap_write8 mmap_write16 mmap_write32 mmap_write64 mmap_write128 codegen_finalize jit_clear_func jit_clear_all_funcs".split(" ").map(p=> [p,()=>console.error("zstd worker unexpectedly called "+p)])),l.__indirect_function_table=new WebAssembly.Table({element:"anyfunc",initial:1024}),l.abort=()=>{throw Error("zstd worker aborted");},l.log_from_wasm=l.console_log_from_wasm=(p,q)=>{console.log(String.fromCharCode(...(new Uint8Array(d.exports.memory.buffer,p,q))))},l.dbg_trace_from_wasm=()=>console.trace(),d=new WebAssembly.Instance(new WebAssembly.Module(e.data),{env:l})}}.toString()+")()"],{type:"text/javascript"}));this.zstd_worker= new Worker(c);URL.revokeObjectURL(c);this.zstd_worker.postMessage(this.wasm_source,[this.wasm_source])}return new Promise(c=>{const d=this.zstd_worker_request_id++,e=async g=>{g.data.id===d&&(this.zstd_worker.removeEventListener("message",e),c(g.data.result))};this.zstd_worker.addEventListener("message",e);this.zstd_worker.postMessage({src:b,decompressed_size:a,id:d},[b.buffer])})}; X.prototype.get_bzimage_initrd_from_filesystem=function(a){const b=(a.read_dir("/")||[]).map(e=>"/"+e);a=(a.read_dir("/boot/")||[]).map(e=>"/boot/"+e);let c,d;for(const e of[].concat(b,a)){const g=/old/i.test(e)||/fallback/i.test(e),f=/vmlinuz/i.test(e)||/bzimage/i.test(e),h=/initrd/i.test(e)||/initramfs/i.test(e);!f||d&&g||(d=e);!h||c&&g||(c=e)}c&&d||(console.log("Failed to find bzimage or initrd in filesystem. Files:"),console.log(b.join(" ")),console.log(a.join(" ")));return{initrd_path:c,bzimage_path:d}}; X.prototype.run=async function(){this.v86.run()};H.exportProperty(X.prototype,"run",X.prototype.run);X.prototype.stop=async function(){this.cpu_is_running&&await new Promise(a=>{const b=()=>{this.remove_listener("emulator-stopped",b);a()};this.add_listener("emulator-stopped",b);this.v86.stop()})};H.exportProperty(X.prototype,"stop",X.prototype.stop); X.prototype.destroy=async function(){await this.stop();this.v86.destroy();this.keyboard_adapter&&this.keyboard_adapter.destroy();this.network_adapter&&this.network_adapter.destroy();this.mouse_adapter&&this.mouse_adapter.destroy();this.screen_adapter&&this.screen_adapter.destroy();this.serial_adapter&&this.serial_adapter.destroy();this.speaker_adapter&&this.speaker_adapter.destroy()};H.exportProperty(X.prototype,"destroy",X.prototype.destroy);X.prototype.restart=function(){this.v86.restart()}; H.exportProperty(X.prototype,"restart",X.prototype.restart);X.prototype.add_listener=function(a,b){this.bus.register(a,b,this)};H.exportProperty(X.prototype,"add_listener",X.prototype.add_listener);X.prototype.remove_listener=function(a,b){this.bus.unregister(a,b)};H.exportProperty(X.prototype,"remove_listener",X.prototype.remove_listener);X.prototype.restore_state=async function(a){this.v86.restore_state(a)};H.exportProperty(X.prototype,"restore_state",X.prototype.restore_state); X.prototype.save_state=async function(){return this.v86.save_state()};H.exportProperty(X.prototype,"save_state",X.prototype.save_state);X.prototype.get_instruction_counter=function(){return this.v86?this.v86.cpu.instruction_counter[0]>>>0:0};H.exportProperty(X.prototype,"get_instruction_counter",X.prototype.get_instruction_counter);X.prototype.is_running=function(){return this.cpu_is_running};H.exportProperty(X.prototype,"is_running",X.prototype.is_running); X.prototype.set_fda=async function(a){if(a.url&&!a.async)k.load_file(a.url,{done:b=>{this.v86.cpu.devices.fdc.set_fda(new k.SyncBuffer(b))}});else{const b=k.buffer_from_object(a,this.zstd_decompress_worker.bind(this));b.onload=()=>{this.v86.cpu.devices.fdc.set_fda(b)};await b.load()}};H.exportProperty(X.prototype,"set_fda",X.prototype.set_fda);X.prototype.eject_fda=function(){this.v86.cpu.devices.fdc.eject_fda()};H.exportProperty(X.prototype,"eject_fda",X.prototype.eject_fda); X.prototype.keyboard_send_scancodes=function(a){for(var b=0;ba)throw Error("Failed to mount. Error number: "+-a);};H.exportProperty(X.prototype,"mount_fs",X.prototype.mount_fs);X.prototype.create_file=async function(a,b){var c=this.fs9p;if(c){var d=a.split("/");d=d[d.length-1];a=c.SearchPath(a).parentid;if(""!==d&&-1!==a)await c.CreateBinaryFile(d,a,b);else return Promise.reject(new ic)}}; H.exportProperty(X.prototype,"create_file",X.prototype.create_file);X.prototype.read_file=async function(a){var b=this.fs9p;if(b)return(a=await b.read_file(a))?a:Promise.reject(new ic)};H.exportProperty(X.prototype,"read_file",X.prototype.read_file); X.prototype.automatically=function(a){const b=c=>{const d=c[0];if(d){var e=c.slice(1);d.sleep?setTimeout(()=>b(e),1E3*d.sleep):d.vga_text?this.wait_until_vga_screen_contains(d.vga_text).then(()=>b(e)):d.keyboard_send?(Array.isArray(d.keyboard_send)?this.keyboard_send_scancodes(d.keyboard_send):this.keyboard_send_text(d.keyboard_send),b(e)):d.call&&(d.call(),b(e))}};b(a)}; X.prototype.wait_until_vga_screen_contains=function(a){return new Promise(b=>{function c(f){return"string"===typeof a?f.includes(a):a.test(f)}function d(f){[f]=f;e.add(f)}for(const f of this.screen_adapter.get_text_screen())if(c(f)){b(!0);return}const e=new Set,g=()=>{for(const f of e){const h=this.screen_adapter.get_text_row(f);if(c(h)){this.remove_listener("screen-put-char",d);b();return}}e.clear();setTimeout(g,100)};g();this.add_listener("screen-put-char",d)})}; X.prototype.read_memory=function(a,b){return this.v86.cpu.read_blob(a,b)};X.prototype.write_memory=function(a,b){this.v86.cpu.write_blob(a,b)};X.prototype.set_serial_container_xtermjs=function(a){this.serial_adapter&&this.serial_adapter.destroy&&this.serial_adapter.destroy();this.serial_adapter=new ac(a,this.bus);this.serial_adapter.show()};function jc(a){this.message=a||"File already exists"}jc.prototype=Error.prototype;function ic(a){this.message=a||"File not found"}ic.prototype=Error.prototype;var kc={Connector:function(a){this.listeners={};this.pair=a;a.addEventListener("message",function(b){b=b.data;for(var c=this.listeners[b[0]],d=0;d{this.channel.postMessage(c)};this.bus.register(this.bus_send_msgid,this.nic_to_hub_fn,this);this.hub_to_nic_fn=c=>{this.bus.send(this.bus_recv_msgid,c.data)};this.channel.addEventListener("message",this.hub_to_nic_fn)} dc.prototype.destroy=function(){this.is_open&&(this.bus.unregister(this.bus_send_msgid,this.nic_to_hub_fn),this.channel.removeEventListener("message",this.hub_to_nic_fn),this.channel.close(),this.is_open=!1)};const lc=(new Date("1970-01-01T00:00:00Z")).getTime(),mc=(new Date("1900-01-01T00:00:00Z")).getTime(),nc=lc-mc,oc=Math.pow(2,32),pc=[118,56,54];function qc(a){return[0,1,2,3,4,5].map(b=>a[b].toString(16)).map(b=>1===b.length?"0"+b:b).join(":")}function rc(a){return a[0]<<24|a[1]<<16|a[2]<<8|a[3]} class sc{constructor(a,b){a=Math.min(a,16);this.maximum_capacity=b?Math.max(b,a):0;this.length=this.head=this.tail=0;this.buffer=new Uint8Array(a)}write(a){const b=a.length;var c=this.length+b;let d=this.buffer.length;if(dthis.maximum_capacity)throw Error("stream capacity overflow in GrowableRingbuffer.write(), package dropped");c=new Uint8Array(d);this.peek(c);this.tail=0;this.head=this.length;this.buffer=c}c=this.buffer;const e=this.head+b;if(e>d){const g= d-this.head;c.set(a.subarray(0,g),this.head);c.set(a.subarray(g))}else c.set(a,this.head);this.head=e%d;this.length+=b}peek(a){const b=Math.min(this.length,a.length);if(b){const e=this.buffer;var c=e.length,d=this.tail+b;d>c?(d%=c,c-=this.tail,a.set(e.subarray(this.tail)),a.set(e.subarray(0,d),c)):a.set(e.subarray(this.tail,d))}return b}remove(a){a>this.length&&(a=this.length);a&&(this.tail=(this.tail+a)%this.buffer.length,this.length-=a);return a}} function tc(){const a=new Uint8Array(1518),b=a.buffer,c=a.byteOffset;return{eth_frame:a,eth_frame_view:new DataView(b),eth_payload_view:new DataView(b,c+14,1500),ipv4_payload_view:new DataView(b,c+34,1480),udp_payload_view:new DataView(b,c+42,1472),text_encoder:new TextEncoder}}function uc(a,b,c,d){d.eth_frame.set(b,c.byteOffset+a);return b.length} function vc(a,b,c,d){const e=c.byteOffset+(a&-2);d=d.eth_frame;for(c=c.byteOffset;c>16;)b=(b&65535)+(b>>16);return~b&65535} function wc(a,b){a.eth_frame.fill(0);var c=a.eth_frame,d=c.subarray,e=a.eth_frame_view;uc(0,b.eth.dest,e,a);uc(6,b.eth.src,e,a);e.setUint16(12,b.eth.ethertype);e=14;if(b.arp){var g=a.eth_payload_view;g.setUint16(0,b.arp.htype);g.setUint16(2,b.arp.ptype);g.setUint8(4,b.arp.sha.length);g.setUint8(5,b.arp.spa.length);g.setUint16(6,b.arp.oper);uc(8,b.arp.sha,g,a);uc(14,b.arp.spa,g,a);uc(18,b.arp.tha,g,a);uc(24,b.arp.tpa,g,a);e+=28}else if(b.ipv4){g=a.eth_payload_view;var f=20;if(b.icmp){var h=a.ipv4_payload_view; h.setUint8(0,b.icmp.type);h.setUint8(1,b.icmp.code);h.setUint16(2,0);var l=4+uc(4,b.icmp.data,h,a);h.setUint16(2,vc(l,0,h,a));f+=l}else if(b.udp){h=a.ipv4_payload_view;var m=8;if(b.dhcp){l=m;var n=a.udp_payload_view;n.setUint8(0,b.dhcp.op);n.setUint8(1,b.dhcp.htype);n.setUint8(2,b.dhcp.hlen);n.setUint8(3,b.dhcp.hops);n.setUint32(4,b.dhcp.xid);n.setUint16(8,b.dhcp.secs);n.setUint16(10,b.dhcp.flags);n.setUint32(12,b.dhcp.ciaddr);n.setUint32(16,b.dhcp.yiaddr);n.setUint32(20,b.dhcp.siaddr);n.setUint32(24, b.dhcp.giaddr);uc(28,b.dhcp.chaddr,n,a);n.setUint32(236,1669485411);m=240;for(var p of b.dhcp.options)m+=uc(m,p,n,a);l+=m}else if(b.dns){p=m;m=a.udp_payload_view;m.setUint16(0,b.dns.id);m.setUint16(2,b.dns.flags);m.setUint16(4,b.dns.questions.length);m.setUint16(6,b.dns.answers.length);let A=12;for(var q=0;q{c={eth:{ethertype:2048,src:b.router_mac,dest:a.eth.src},ipv4:{proto:17,src:b.router_ip,dest:a.ipv4.src},udp:{sport:53,dport:a.udp.sport,data:new Uint8Array(await c.arrayBuffer())}};b.receive(wc(b.eth_encoder_buf,c))});return!0} function yc(a,b){let c={};c.eth={ethertype:2048,src:b.router_mac,dest:a.eth.src};c.ipv4={proto:17,src:b.router_ip,dest:b.vm_ip};c.udp={sport:67,dport:68};c.dhcp={htype:1,hlen:6,hops:0,xid:a.dhcp.xid,secs:0,flags:0,ciaddr:0,yiaddr:rc(b.vm_ip),siaddr:rc(b.router_ip),giaddr:rc(b.router_ip),chaddr:a.dhcp.chaddr};let d=[],e=a.dhcp.options.find(function(g){return 53===g[0]});e&&3===e[2]&&(a.dhcp.op=3);1===a.dhcp.op&&(c.dhcp.op=2,d.push(new Uint8Array([53,1,2])));3===a.dhcp.op&&(c.dhcp.op=2,d.push(new Uint8Array([53, 1,5])),d.push(new Uint8Array([51,4,8,0,0,0])));a=[b.router_ip[0],b.router_ip[1],b.router_ip[2],b.router_ip[3]];d.push(new Uint8Array([1,4,255,255,255,0]));b.masquerade&&(d.push(new Uint8Array([3,4].concat(a))),d.push(new Uint8Array([6,4].concat(a))));d.push(new Uint8Array([54,4].concat(a)));d.push(new Uint8Array([60,3].concat(pc)));d.push(new Uint8Array([255,0]));c.dhcp.options=d;b.receive(wc(b.eth_encoder_buf,c))} function zc(a,b){let c={};var d=(new DataView(a.buffer,a.byteOffset,a.byteLength)).getUint16(12),e={ethertype:d,dest:a.subarray(0,6),dest_s:qc(a.subarray(0,6)),src:a.subarray(6,12),src_s:qc(a.subarray(6,12))};c.eth=e;a=a.subarray(14,a.length);if(2048===d){var g=new DataView(a.buffer,a.byteOffset,a.byteLength),f=a[0]>>4&15;e=a[0]&15;var h=g.getUint8(1),l=g.getUint16(2);let m=g.getUint8(8);d=g.getUint8(9);g=g.getUint16(10);f={version:f,ihl:e,tos:h,len:l,ttl:m,proto:d,ip_checksum:g,src:a.subarray(12, 16),dest:a.subarray(16,20)};c.ipv4=f;e=a.subarray(4*e,l);if(1===d)a=new DataView(e.buffer,e.byteOffset,e.byteLength),a={type:a.getUint8(0),code:a.getUint8(1),checksum:a.getUint16(2),data:e.subarray(4)},c.icmp=a;else if(6===d)d=new DataView(e.buffer,e.byteOffset,e.byteLength),a={sport:d.getUint16(0),dport:d.getUint16(2),seq:d.getUint32(4),ackn:d.getUint32(8),doff:d.getUint8(12)>>4,winsize:d.getUint16(14),checksum:d.getUint16(16),urgent:d.getUint16(18)},d=d.getUint8(13),a.fin=!!(d&1),a.syn=!!(d&2), a.rst=!!(d&4),a.psh=!!(d&8),a.ack=!!(d&16),a.urg=!!(d&32),a.ece=!!(d&64),a.cwr=!!(d&128),c.tcp=a,c.tcp_data=e.subarray(4*a.doff);else if(17===d){a=new DataView(e.buffer,e.byteOffset,e.byteLength);a={sport:a.getUint16(0),dport:a.getUint16(2),len:a.getUint16(4),checksum:a.getUint16(6),data:e.subarray(8),data_s:(new TextDecoder).decode(e.subarray(8))};if(67===a.dport||67===a.sport){e=e.subarray(8);d=new DataView(e.buffer,e.byteOffset,e.byteLength);e.subarray(44,236);d={op:d.getUint8(0),htype:d.getUint8(1), hlen:d.getUint8(2),hops:d.getUint8(3),xid:d.getUint32(4),secs:d.getUint16(8),flags:d.getUint16(10),ciaddr:d.getUint32(12),yiaddr:d.getUint32(16),siaddr:d.getUint32(20),giaddr:d.getUint32(24),chaddr:e.subarray(28,44),magic:d.getUint32(236),options:[]};e=e.subarray(240);for(l=0;l++h&&b.tcp_conn[f]);if(b.tcp_conn[f])throw Error("pool of dynamic TCP port numbers exhausted, connection aborted");let l,m,n,p,q=new Cc;q.net=b;q.on_data=function(A){l&&l.call(r,A)};q.on_connect=function(){m&&m.call(r)};q.on_close=function(){n&&n.call(r)};q.on_shutdown=function(){p&&p.call(r)};q.tuple=f;q.hsrc=b.router_mac;q.psrc=b.router_ip; q.sport=g;q.hdest=b.vm_mac;q.dport=a;q.pdest=b.vm_ip;b.tcp_conn[f]=q;q.connect();let r={write:function(A){q.write(A)},on:function(A,w){"data"===A&&(l=w);"connect"===A&&(m=w);"close"===A&&(n=w);"shutdown"===A&&(p=w)},close:function(){q.close()}};return r}function Cc(){this.state="closed";this.net=null;this.send_buffer=new sc(2048,0);this.send_chunk_buf=new Uint8Array(1460);this.delayed_send_fin=this.in_active_close=!1;this.delayed_state=void 0} Cc.prototype.ipv4_reply=function(){let a={};a.eth={ethertype:2048,src:this.hsrc,dest:this.hdest};a.ipv4={proto:6,src:this.psrc,dest:this.pdest};a.tcp={sport:this.sport,dport:this.dport,winsize:this.winsize,ackn:this.ack,seq:this.seq,ack:!0};return a};Cc.prototype.packet_reply=function(a,b){a={sport:a.tcp.dport,dport:a.tcp.sport,winsize:a.tcp.winsize,ackn:this.ack,seq:this.seq};if(b)for(const c in b)a[c]=b[c];b=this.ipv4_reply();b.tcp=a;return b}; Cc.prototype.connect=function(){this.seq=1338;this.ack=1;this.start_seq=0;this.winsize=64240;this.state="syn-sent";let a=this.ipv4_reply();a.ipv4.id=2345;a.tcp={sport:this.sport,dport:this.dport,seq:1337,ackn:0,winsize:0,syn:!0};this.net.receive(wc(this.net.eth_encoder_buf,a))}; Cc.prototype.accept=function(a){this.seq=1338;this.ack=a.tcp.seq+1;this.start_seq=a.tcp.seq;this.hsrc=this.net.router_mac;this.psrc=a.ipv4.dest;this.sport=a.tcp.dport;this.hdest=a.eth.src;this.dport=a.tcp.sport;this.pdest=a.ipv4.src;this.winsize=a.tcp.winsize;let b=this.ipv4_reply();b.tcp={sport:this.sport,dport:this.dport,seq:1337,ackn:this.ack,winsize:a.tcp.winsize,syn:!0,ack:!0};this.state="established";this.net.receive(wc(this.net.eth_encoder_buf,b))}; Cc.prototype.process=function(a){if("closed"===this.state)a=this.packet_reply(a,{rst:!0}),this.net.receive(wc(this.net.eth_encoder_buf,a));else if(a.tcp.rst)this.on_close(),this.release();else if(a.tcp.syn)"syn-sent"===this.state&&a.tcp.ack&&(this.ack=a.tcp.seq+1,this.start_seq=a.tcp.seq,this.last_received_ackn=a.tcp.ackn,a=this.ipv4_reply(),this.net.receive(wc(this.net.eth_encoder_buf,a)),this.state="established",this.on_connect&&this.on_connect.call(this));else{if(a.tcp.ack)if("syn-received"=== this.state)this.state="established";else if("fin-wait-1"===this.state)a.tcp.fin||(this.state="fin-wait-2");else if("closing"===this.state||"last-ack"===this.state){this.release();return}if(void 0===this.last_received_ackn)this.last_received_ackn=a.tcp.ackn;else{var b=a.tcp.ackn-this.last_received_ackn;if(0b){a=this.packet_reply(a,{rst:!0});this.net.receive(wc(this.net.eth_encoder_buf,a));this.on_close();this.release();return}}a.tcp.fin?(++this.ack,b=this.packet_reply(a,{}),"established"===this.state?(b.tcp.ack=!0,this.state="close-wait",this.on_shutdown()):"fin-wait-1"===this.state?(a.tcp.ack?this.release():this.state="closing",b.tcp.ack=!0):"fin-wait-2"===this.state?(this.release(),b.tcp.ack=!0):(this.release(), this.on_close(),b.tcp.rst=!0),this.net.receive(wc(this.net.eth_encoder_buf,b))):this.ack!==a.tcp.seq?(a=this.packet_reply(a,{ack:!0}),this.net.receive(wc(this.net.eth_encoder_buf,a))):a.tcp.ack&&0{this.process_incoming_wisp_frame(new Uint8Array(b.data))};this.wispws.onclose=()=>{setTimeout(()=>{this.register_ws(a)},1E4)}}; ec.prototype.send_packet=function(a,b,c){this.connections[c]&&(0{0!==d.length&&this.send_wisp_frame({type:"DATA",stream_id:c.stream_id,data:d})};c.on_close=()=>{this.send_wisp_frame({type:"CLOSE",stream_id:c.stream_id,reason:2})};c.on_shutdown=c.on_close;this.send_wisp_frame({type:"CONNECT",stream_id:c.stream_id,hostname:a.ipv4.dest.join("."),port:a.tcp.dport,data_callback:d=>{c.write(d)},close_callback:()=> {c.close()}});c.accept(a);return!0};ec.prototype.send=function(a){zc(a,this)};ec.prototype.receive=function(a){this.bus.send("net"+this.id+"-receive",new Uint8Array(a))};function cc(a,b){b=b||{};this.bus=a;this.id=b.id||0;this.router_mac=new Uint8Array((b.router_mac||"52:54:0:1:2:3").split(":").map(function(c){return parseInt(c,16)}));this.router_ip=new Uint8Array((b.router_ip||"192.168.86.1").split(".").map(function(c){return parseInt(c,10)}));this.vm_ip=new Uint8Array((b.vm_ip||"192.168.86.100").split(".").map(function(c){return parseInt(c,10)}));this.masquerade=void 0===b.masquerade||!!b.masquerade;this.vm_mac=new Uint8Array(6);this.dns_method=b.dns_method||"static"; this.doh_server=b.doh_server;this.tcp_conn={};this.eth_encoder_buf=tc();this.fetch=fetch;this.cors_proxy=b.cors_proxy;this.bus.register("net"+this.id+"-mac",function(c){this.vm_mac=new Uint8Array(c.split(":").map(function(d){return parseInt(d,16)}))},this);this.bus.register("net"+this.id+"-send",function(c){this.send(c)},this)}H.exportSymbol("FetchNetworkAdapter",cc);cc.prototype.destroy=function(){}; cc.prototype.on_tcp_connection=function(a,b){if(80===a.tcp.dport){let c=new Cc;c.state="syn-received";c.net=this;c.on_data=Dc;c.tuple=b;c.accept(a);this.tcp_conn[b]=c;return!0}return!1};cc.prototype.connect=function(a){return Bc(a,this)}; async function Dc(a){this.read=this.read||"";if((this.read+=(new TextDecoder).decode(a))&&-1!==this.read.indexOf("\r\n\r\n")){var b=this.read.indexOf("\r\n\r\n");a=this.read.substring(0,b).split(/\r\n/);b=this.read.substring(b+4);this.read="";let c=a[0].split(" "),d;d=/^https?:/.test(c[1])?new URL(c[1]):new URL("http://host"+c[1]);"undefined"!==typeof window&&"http:"===d.protocol&&"https:"===window.location.protocol&&(d.protocol="https:");let e=new Headers;for(let l=1;l{const m=[`HTTP/1.1 ${l.status} ${l.statusText}`, `x-was-fetch-redirected: ${!!l.redirected}`,`x-fetch-resp-url: ${l.url}`,"Connection: closed"];for(const [n,p]of l.headers.entries())["content-encoding","connection","content-length","transfer-encoding"].includes(n.toLowerCase())||m.push(`${n}: ${p}`);this.write(f.encode(m.join("\r\n")+"\r\n\r\n"));h=!0;if(l.body&&l.body.getReader){const n=l.body.getReader(),p=({value:q,done:r})=>{q&&this.write(q);if(r)this.close();else return n.read().then(p)};n.read().then(p)}else l.arrayBuffer().then(n=>{this.write(new Uint8Array(n)); this.close()})}).catch(l=>{console.warn("Fetch Failed: "+g+"\n"+l);h||(l=f.encode(`Fetch ${g} failed:\n\n${l.stack||l.message}`),this.writev([f.encode(["HTTP/1.1 502 Fetch Error","Content-Type: text/plain",`Content-Length: ${l.length}`,"Connection: closed"].join("\r\n")+"\r\n\r\n"),l]));this.close()})}} cc.prototype.fetch=async function(a,b){this.cors_proxy&&(a=this.cors_proxy+encodeURIComponent(a));try{const c=await fetch(a,b),d=await c.arrayBuffer();return[c,d]}catch(c){return console.warn("Fetch Failed: "+a+"\n"+c),b=new Headers,b.set("Content-Type","text/plain"),[{status:502,statusText:"Fetch Error",headers:b},(new TextEncoder).encode(`Fetch ${a} failed:\n\n${c.stack}`).buffer]}}; cc.prototype.parse_http_header=function(a){var b=a.match(/^([^:]*):(.*)$/);if(b&&(a=b[1],b=b[2].trim(),0!==a.length&&0!==b.length&&/^[\w-]+$/.test(a)&&/^[\x20-\x7E]+$/.test(b)))return{key:a,value:b}};cc.prototype.send=function(a){zc(a,this)};cc.prototype.receive=function(a){this.bus.send("net"+this.id+"-receive",new Uint8Array(a))};const Ec={stats_to_string:function(a){return Ec.print_misc_stats(a)+Ec.print_instruction_counts(a)},print_misc_stats:function(a){let b="";var c="COMPILE COMPILE_SKIPPED_NO_NEW_ENTRY_POINTS COMPILE_WRONG_ADDRESS_SPACE COMPILE_CUT_OFF_AT_END_OF_PAGE COMPILE_WITH_LOOP_SAFETY COMPILE_PAGE COMPILE_PAGE/COMPILE COMPILE_BASIC_BLOCK COMPILE_DUPLICATED_BASIC_BLOCK COMPILE_WASM_BLOCK COMPILE_WASM_LOOP COMPILE_DISPATCHER COMPILE_ENTRY_POINT COMPILE_WASM_TOTAL_BYTES COMPILE_WASM_TOTAL_BYTES/COMPILE_PAGE RUN_INTERPRETED RUN_INTERPRETED_NEW_PAGE RUN_INTERPRETED_PAGE_HAS_CODE RUN_INTERPRETED_PAGE_HAS_ENTRY_AFTER_PAGE_WALK RUN_INTERPRETED_NEAR_END_OF_PAGE RUN_INTERPRETED_DIFFERENT_STATE RUN_INTERPRETED_DIFFERENT_STATE_CPL3 RUN_INTERPRETED_DIFFERENT_STATE_FLAT RUN_INTERPRETED_DIFFERENT_STATE_IS32 RUN_INTERPRETED_DIFFERENT_STATE_SS32 RUN_INTERPRETED_MISSED_COMPILED_ENTRY_RUN_INTERPRETED RUN_INTERPRETED_STEPS RUN_FROM_CACHE RUN_FROM_CACHE_STEPS RUN_FROM_CACHE_STEPS/RUN_FROM_CACHE RUN_FROM_CACHE_STEPS/RUN_INTERPRETED_STEPS DIRECT_EXIT INDIRECT_JUMP INDIRECT_JUMP_NO_ENTRY NORMAL_PAGE_CHANGE NORMAL_FALLTHRU NORMAL_FALLTHRU_WITH_TARGET_BLOCK NORMAL_BRANCH NORMAL_BRANCH_WITH_TARGET_BLOCK CONDITIONAL_JUMP CONDITIONAL_JUMP_PAGE_CHANGE CONDITIONAL_JUMP_EXIT CONDITIONAL_JUMP_FALLTHRU CONDITIONAL_JUMP_FALLTHRU_WITH_TARGET_BLOCK CONDITIONAL_JUMP_BRANCH CONDITIONAL_JUMP_BRANCH_WITH_TARGET_BLOCK DISPATCHER_SMALL DISPATCHER_LARGE LOOP LOOP_SAFETY CONDITION_OPTIMISED CONDITION_UNOPTIMISED CONDITION_UNOPTIMISED_PF CONDITION_UNOPTIMISED_UNHANDLED_L CONDITION_UNOPTIMISED_UNHANDLED_LE FAILED_PAGE_CHANGE SAFE_READ_FAST SAFE_READ_SLOW_PAGE_CROSSED SAFE_READ_SLOW_NOT_VALID SAFE_READ_SLOW_NOT_USER SAFE_READ_SLOW_IN_MAPPED_RANGE SAFE_WRITE_FAST SAFE_WRITE_SLOW_PAGE_CROSSED SAFE_WRITE_SLOW_NOT_VALID SAFE_WRITE_SLOW_NOT_USER SAFE_WRITE_SLOW_IN_MAPPED_RANGE SAFE_WRITE_SLOW_READ_ONLY SAFE_WRITE_SLOW_HAS_CODE SAFE_READ_WRITE_FAST SAFE_READ_WRITE_SLOW_PAGE_CROSSED SAFE_READ_WRITE_SLOW_NOT_VALID SAFE_READ_WRITE_SLOW_NOT_USER SAFE_READ_WRITE_SLOW_IN_MAPPED_RANGE SAFE_READ_WRITE_SLOW_READ_ONLY SAFE_READ_WRITE_SLOW_HAS_CODE PAGE_FAULT TLB_MISS MAIN_LOOP MAIN_LOOP_IDLE DO_MANY_CYCLES CYCLE_INTERNAL INVALIDATE_ALL_MODULES_NO_FREE_WASM_INDICES INVALIDATE_MODULE_WRITTEN_WHILE_COMPILED INVALIDATE_MODULE_UNUSED_AFTER_OVERWRITE INVALIDATE_MODULE_DIRTY_PAGE INVALIDATE_PAGE_HAD_CODE INVALIDATE_PAGE_HAD_ENTRY_POINTS DIRTY_PAGE_DID_NOT_HAVE_CODE RUN_FROM_CACHE_EXIT_SAME_PAGE RUN_FROM_CACHE_EXIT_NEAR_END_OF_PAGE RUN_FROM_CACHE_EXIT_DIFFERENT_PAGE CLEAR_TLB FULL_CLEAR_TLB TLB_FULL TLB_GLOBAL_FULL MODRM_SIMPLE_REG MODRM_SIMPLE_REG_WITH_OFFSET MODRM_SIMPLE_CONST_OFFSET MODRM_COMPLEX SEG_OFFSET_OPTIMISED SEG_OFFSET_NOT_OPTIMISED SEG_OFFSET_NOT_OPTIMISED_ES SEG_OFFSET_NOT_OPTIMISED_FS SEG_OFFSET_NOT_OPTIMISED_GS SEG_OFFSET_NOT_OPTIMISED_NOT_FLAT".split(" "), d=0;const e={};for(let f=0;f>20)+"m\n";b=b+"Config:\nJIT_DISABLED="+(a.wm.exports.get_jit_config(0)+"\n");b+="MAX_PAGES="+a.wm.exports.get_jit_config(1)+"\n";b+="JIT_USE_LOOP_SAFETY="+!!a.wm.exports.get_jit_config(2)+"\n";return b+="MAX_EXTRA_BASIC_BLOCKS="+a.wm.exports.get_jit_config(3)+"\n"},print_instruction_counts:function(a){return[Ec.print_instruction_counts_offset(a, !1,!1,!1,!1),Ec.print_instruction_counts_offset(a,!0,!1,!1,!1),Ec.print_instruction_counts_offset(a,!1,!0,!1,!1),Ec.print_instruction_counts_offset(a,!1,!1,!0,!1),Ec.print_instruction_counts_offset(a,!1,!1,!1,!0)].join("\n\n")},print_instruction_counts_offset:function(a,b,c,d,e){let g="";var f=[],h=b?"compiled":c?"jit exit":d?"unguarded register":e?"wasm size":"executed";for(let n=0;256>n;n++)for(let p=0;8>p;p++)for(const q of[!1,!0]){var l=a.wm.exports.get_opstats_buffer(b,c,d,e,n,!1,q,p);f.push({opcode:n, count:l,is_mem:q,fixed_g:p});l=a.wm.exports.get_opstats_buffer(b,c,d,e,n,!0,q,p);f.push({opcode:3840|n,count:l,is_mem:q,fixed_g:p})}a=0;b=new Set([38,46,54,62,100,101,102,103,240,242,243]);for(const {count:n,opcode:p}of f)b.has(p)||(a+=n);if(0===a)return"";c=new Uint32Array(256);b=new Uint32Array(256);for(const {opcode:n,count:p}of f)3840===(n&65280)?b[n&255]+=p:c[n&255]+=p;g=g+"------------------\nTotal: "+(a+"\n");const m=1E7Math.round(n/m)));d= String(d).length;g+=`Instruction counts ${h} (in ${m}):\n`;for(e=0;256>e;e++)g+=e.toString(16).padStart(2,"0")+":"+k.pads(Math.round(c[e]/m),d),g=15===e%16?g+"\n":g+" ";g=g+"\n"+`Instruction counts ${h} (0f, in ${m}):\n`;for(h=0;256>h;h++)g+=(h&255).toString(16).padStart(2,"0")+":"+k.pads(Math.round(b[h]/m),d),g=15===h%16?g+"\n":g+" ";g+="\n";f=f.filter(({count:n})=>n).sort(({count:n},{count:p})=>p-n);for(const {opcode:n,is_mem:p,fixed_g:q,count:r}of f.slice(0,200))f=n.toString(16)+"_"+q+(p?"_m": "_r"),g+=f+":"+(r/a*100).toFixed(2)+" ";return g+"\n"}};H.exportSymbol("print_stats",Ec);function gc(){this.filedata=new Map}gc.prototype.read=async function(a,b,c){return(a=this.filedata.get(a))?a.subarray(b,b+c):null};gc.prototype.cache=async function(a,b){this.filedata.set(a,b)};gc.prototype.uncache=function(a){this.filedata.delete(a)};function hc(a,b){b.endsWith("/")||(b+="/");this.storage=a;this.baseurl=b}hc.prototype.load_from_server=function(a){return new Promise(b=>{k.load_file(this.baseurl+a,{done:async c=>{c=new Uint8Array(c);await this.cache(a,c);b(c)}})})}; hc.prototype.read=async function(a,b,c){const d=await this.storage.read(a,b,c);return d?d:(await this.load_from_server(a)).subarray(b,b+c)};hc.prototype.cache=async function(a,b){return await this.storage.cache(a,b)};hc.prototype.uncache=function(a){this.storage.uncache(a)};var ia=32768,fa=16384,ja=4;function Z(a,b){this.inodes=[];this.events=[];this.storage=a;this.qidcounter=b||{last_qidnumber:0};this.inodedata={};this.total_size=274877906944;this.used_size=0;this.mounts=[];this.CreateDirectory("",-1)}Z.prototype.get_state=function(){let a=[];a[0]=this.inodes;a[1]=this.qidcounter.last_qidnumber;a[2]=[];for(const [b,c]of Object.entries(this.inodedata))0===(this.inodes[b].mode&fa)&&a[2].push([b,c]);a[3]=this.total_size;a[4]=this.used_size;return a=a.concat(this.mounts)}; Z.prototype.set_state=function(a){this.inodes=a[0].map(b=>{const c=new Fc(0);c.set_state(b);return c});this.qidcounter.last_qidnumber=a[1];this.inodedata={};for(let [b,c]of a[2])c.buffer.byteLength!==c.byteLength&&(c=c.slice()),this.inodedata[b]=c;this.total_size=a[3];this.used_size=a[4];this.mounts=a.slice(5)};Z.prototype.AddEvent=function(a,b){var c=this.inodes[a];0===c.status||2===c.status?b():this.is_forwarder(c)?this.follow_fs(c).AddEvent(c.foreign_id,b):this.events.push({id:a,OnEvent:b})}; Z.prototype.HandleEvent=function(a){var b=this.inodes[a];this.is_forwarder(b)&&this.follow_fs(b).HandleEvent(b.foreign_id);b=[];for(var c=0;c>8;this.qid.version=a[11];this.qid.path=a[12];this.nlinks=a[13]}; Z.prototype.divert=function(a,b){const c=this.Search(a,b),d=this.inodes[c],e=new Fc(-1);this.IsDirectory(c);Object.assign(e,d);const g=this.inodes.length;this.inodes.push(e);e.fid=g;this.is_forwarder(d)&&this.mounts[d.mount_id].backtrack.set(d.foreign_id,g);this.should_be_linked(d)&&(this.unlink_from_dir(a,b),this.link_under_dir(a,g,b));if(this.IsDirectory(c)&&!this.is_forwarder(d))for(const [f,h]of e.direntries)"."!==f&&".."!==f&&this.IsDirectory(h)&&this.inodes[h].direntries.set("..",g);this.inodedata[g]= this.inodedata[c];delete this.inodedata[c];d.direntries=new Map;d.nlinks=0;return g};Z.prototype.copy_inode=function(a,b){Object.assign(b,a,{fid:b.fid,direntries:b.direntries,nlinks:b.nlinks})};Z.prototype.CreateInode=function(){const a=Math.round(Date.now()/1E3),b=new Fc(++this.qidcounter.last_qidnumber);b.atime=b.ctime=b.mtime=a;return b}; Z.prototype.CreateDirectory=function(a,b){var c=this.inodes[b];if(0<=b&&this.is_forwarder(c))return b=c.foreign_id,a=this.follow_fs(c).CreateDirectory(a,b),this.create_forwarder(c.mount_id,a);c=this.CreateInode();c.mode=511|fa;0<=b&&(c.uid=this.inodes[b].uid,c.gid=this.inodes[b].gid,c.mode=this.inodes[b].mode&511|fa);c.qid.type=fa>>8;this.PushInode(c,b,a);this.NotifyListeners(this.inodes.length-1,"newdir");return this.inodes.length-1}; Z.prototype.CreateFile=function(a,b){var c=this.inodes[b];if(this.is_forwarder(c))return b=c.foreign_id,a=this.follow_fs(c).CreateFile(a,b),this.create_forwarder(c.mount_id,a);c=this.CreateInode();c.uid=this.inodes[b].uid;c.gid=this.inodes[b].gid;c.qid.type=ia>>8;c.mode=this.inodes[b].mode&438|ia;this.PushInode(c,b,a);this.NotifyListeners(this.inodes.length-1,"newfile");return this.inodes.length-1}; Z.prototype.CreateNode=function(a,b,c,d){var e=this.inodes[b];if(this.is_forwarder(e))return b=e.foreign_id,a=this.follow_fs(e).CreateNode(a,b,c,d),this.create_forwarder(e.mount_id,a);e=this.CreateInode();e.major=c;e.minor=d;e.uid=this.inodes[b].uid;e.gid=this.inodes[b].gid;e.qid.type=192;e.mode=this.inodes[b].mode&438;this.PushInode(e,b,a);return this.inodes.length-1}; Z.prototype.CreateSymlink=function(a,b,c){var d=this.inodes[b];if(this.is_forwarder(d))return b=d.foreign_id,a=this.follow_fs(d).CreateSymlink(a,b,c),this.create_forwarder(d.mount_id,a);d=this.CreateInode();d.uid=this.inodes[b].uid;d.gid=this.inodes[b].gid;d.qid.type=160;d.symlink=c;d.mode=40960;this.PushInode(d,b,a);return this.inodes.length-1}; Z.prototype.CreateTextFile=async function(a,b,c){var d=this.inodes[b];if(this.is_forwarder(d))return b=d.foreign_id,c=await this.follow_fs(d).CreateTextFile(a,b,c),this.create_forwarder(d.mount_id,c);d=this.CreateFile(a,b);b=this.inodes[d];a=new Uint8Array(c.length);b.size=c.length;for(b=0;bf)return f}var h=this.inodes[e],l=this.inodes[a];f=this.inodes[c];if(this.is_forwarder(l)||this.is_forwarder(f))if(this.is_forwarder(l)&&l.mount_id===f.mount_id){if(a=await this.follow_fs(l).Rename(l.foreign_id,b,f.foreign_id,d),0>a)return a}else{if(this.is_a_root(e)||!this.IsDirectory(e)&&1f)return f;await this.DeleteData(l);a=this.Unlink(a,b);if(0>a)return a}else this.unlink_from_dir(a,b),this.link_under_dir(c,e,d),h.qid.version++;this.NotifyListeners(e,"rename",{oldpath:g});return 0}; Z.prototype.Write=async function(a,b,c,d){this.NotifyListeners(a,"write");var e=this.inodes[a];if(this.is_forwarder(e))a=e.foreign_id,await this.follow_fs(e).Write(a,b,c,d);else{var g=await this.get_buffer(a);!g||g.lengthb.nlinks&&x.Debug("Error in filesystem: negative nlinks="+b.nlinks+" at id ="+a);if(this.IsDirectory(a)){b=this.GetInode(a);this.IsDirectory(a)&&0>this.GetParent(a)&&x.Debug("Error in filesystem: negative parent id "+a);for(const [c,d]of b.direntries){0===c.length&&x.Debug("Error in filesystem: inode with no name and id "+d);for(const e of c)32>e&&x.Debug("Error in filesystem: Unallowed char in filename")}}}}; Z.prototype.FillDirectory=function(a){var b=this.inodes[a];if(this.is_forwarder(b))this.follow_fs(b).FillDirectory(b.foreign_id);else{var c=0;for(const d of b.direntries.keys())c+=24+Hc.encode(d).length;a=this.inodedata[a]=new Uint8Array(c);b.size=c;c=0;for(const [d,e]of b.direntries)b=this.GetInode(e),c+=t.Marshall(["Q","d","b","s"],[b.qid,c+13+8+1+2+Hc.encode(d).length,b.mode>>12,d],a,c)}}; Z.prototype.RoundToDirentry=function(a,b){a=this.inodedata[a];if(b>=a.length)return a.length;let c=0;for(;;){const d=t.Unmarshall(["Q","d"],a,{offset:c})[1];if(d>b)break;c=d}return c};Z.prototype.IsDirectory=function(a){a=this.inodes[a];return this.is_forwarder(a)?this.follow_fs(a).IsDirectory(a.foreign_id):(a.mode&61440)===fa}; Z.prototype.IsEmpty=function(a){a=this.inodes[a];if(this.is_forwarder(a))return this.follow_fs(a).IsDirectory(a.foreign_id);for(const b of a.direntries.keys())if("."!==b&&".."!==b)return!1;return!0};Z.prototype.GetChildren=function(a){this.IsDirectory(a);a=this.inodes[a];if(this.is_forwarder(a))return this.follow_fs(a).GetChildren(a.foreign_id);const b=[];for(const c of a.direntries.keys())"."!==c&&".."!==c&&b.push(c);return b}; Z.prototype.GetParent=function(a){this.IsDirectory(a);a=this.inodes[a];if(this.should_be_linked(a))return a.direntries.get("..");const b=this.follow_fs(a).GetParent(a.foreign_id);return this.get_forwarder(a.mount_id,b)}; Z.prototype.PrepareCAPs=function(a){a=this.GetInode(a);if(a.caps)return a.caps.length;a.caps=new Uint8Array(20);a.caps[0]=0;a.caps[1]=0;a.caps[2]=0;a.caps[3]=2;a.caps[4]=255;a.caps[5]=255;a.caps[6]=255;a.caps[7]=255;a.caps[8]=255;a.caps[9]=255;a.caps[10]=255;a.caps[11]=255;a.caps[12]=63;a.caps[13]=0;a.caps[14]=0;a.caps[15]=0;a.caps[16]=63;a.caps[17]=0;a.caps[18]=0;a.caps[19]=0;return a.caps.length};function Ic(a){this.fs=a;this.backtrack=new Map} Ic.prototype.get_state=function(){const a=[];a[0]=this.fs;a[1]=[...this.backtrack];return a};Ic.prototype.set_state=function(a){this.fs=a[0];this.backtrack=new Map(a[1])};Z.prototype.set_forwarder=function(a,b,c){const d=this.inodes[a];this.is_forwarder(d)&&this.mounts[d.mount_id].backtrack.delete(d.foreign_id);d.status=5;d.mount_id=b;d.foreign_id=c;this.mounts[b].backtrack.set(c,a)}; Z.prototype.create_forwarder=function(a,b){const c=this.CreateInode(),d=this.inodes.length;this.inodes.push(c);c.fid=d;this.set_forwarder(d,a,b);return d};Z.prototype.is_forwarder=function(a){return 5===a.status};Z.prototype.is_a_root=function(a){return 0===this.GetInode(a).fid};Z.prototype.get_forwarder=function(a,b){const c=this.mounts[a].backtrack.get(b);return void 0===c?this.create_forwarder(a,b):c};Z.prototype.delete_forwarder=function(a){this.is_forwarder(a);a.status=-1;this.mounts[a.mount_id].backtrack.delete(a.foreign_id)}; Z.prototype.follow_fs=function(a){const b=this.mounts[a.mount_id];this.is_forwarder(a);return b.fs};Z.prototype.Mount=function(a,b){a=this.SearchPath(a);if(-1===a.parentid)return-2;if(-1!==a.id)return-17;if(a.forward_path){var c=this.inodes[a.parentid];b=this.follow_fs(c).Mount(a.forward_path,b);return 0>b?b:this.get_forwarder(c.mount_id,b)}c=this.mounts.length;this.mounts.push(new Ic(b));b=this.create_forwarder(c,0);this.link_under_dir(a.parentid,b,a.name);return b}; function Gc(){this.type=2;this.start=0;this.length=Infinity;this.proc_id=-1;this.client_id=""}Gc.prototype.get_state=function(){const a=[];a[0]=this.type;a[1]=this.start;a[2]=Infinity===this.length?0:this.length;a[3]=this.proc_id;a[4]=this.client_id;return a};Gc.prototype.set_state=function(a){this.type=a[0];this.start=a[1];this.length=0===a[2]?Infinity:a[2];this.proc_id=a[3];this.client_id=a[4]};Gc.prototype.clone=function(){const a=new Gc;a.set_state(this.get_state());return a}; Gc.prototype.conflicts_with=function(a){return this.proc_id===a.proc_id&&this.client_id===a.client_id||2===this.type||2===a.type||1!==this.type&&1!==a.type||this.start+this.length<=a.start||a.start+a.length<=this.start?!1:!0};Gc.prototype.is_alike=function(a){return a.proc_id===this.proc_id&&a.client_id===this.client_id&&a.type===this.type};Gc.prototype.may_merge_after=function(a){return this.is_alike(a)&&a.start+a.length===this.start}; Z.prototype.DescribeLock=function(a,b,c,d,e){const g=new Gc;g.type=a;g.start=b;g.length=c;g.proc_id=d;g.client_id=e;return g};Z.prototype.GetLock=function(a,b){a=this.inodes[a];if(this.is_forwarder(a)){var c=a.foreign_id;return this.follow_fs(a).GetLock(c,b)}for(c of a.locks)if(b.conflicts_with(c))return c.clone();return null}; Z.prototype.Lock=function(a,b,c){const d=this.inodes[a];if(this.is_forwarder(d))return a=d.foreign_id,this.follow_fs(d).Lock(a,b,c);b=b.clone();if(2!==b.type&&this.GetLock(a,b))return 1;for(c=0;c=g&&0=g&&(d.locks.splice(c,1),c--)}if(2!==b.type){c=b;a=!1;for(e=0;e"."!==b&&".."!==b)};Z.prototype.read_file=function(a){a=this.SearchPath(a);if(-1===a.id)return Promise.resolve(null);const b=this.GetInode(a.id);return this.Read(a.id,0,b.size)};var x={Debug:function(a){[].slice.apply(arguments).join(" ")},Abort:function(){}};var t={};const Jc=new TextDecoder,Hc=new TextEncoder; t.Marshall=function(a,b,c,d){for(var e,g=0,f=0;f>8&255;c[d++]=e>>16&255;c[d++]=e>>24&255;g+=4;break;case "d":c[d++]=e&255;c[d++]=e>>8&255;c[d++]=e>>16&255;c[d++]=e>>24&255;c[d++]=0;c[d++]=0;c[d++]=0;c[d++]=0;g+=8;break;case "h":c[d++]=e&255;c[d++]=e>>8;g+=2;break;case "b":c[d++]=e;g+=1;break;case "s":var h=d,l=0;c[d++]=0;c[d++]=0;g+=2;e=Hc.encode(e);g+=e.byteLength;l+=e.byteLength;c.set(e,d);d+=e.byteLength;c[h+0]=l&255;c[h+1]=l>>8& 255;break;case "Q":t.Marshall(["b","w","d"],[e.type,e.version,e.path],c,d);d+=13;g+=13;break;default:x.Debug("Marshall: Unknown type="+a[f])}return g}; t.Unmarshall=function(a,b,c){let d=c.offset;for(var e=[],g=0;g>>0;e.push(f);break;case "d":f=b[d++];f+=b[d++]<<8;f+=b[d++]<<16;f+=b[d++]<<24>>>0;d+=4;e.push(f);break;case "h":f=b[d++];e.push(f+(b[d++]<<8));break;case "b":e.push(b[d++]);break;case "s":f=b[d++];f+=b[d++]<<8;var h=b.slice(d,d+f);d+=f;e.push(Jc.decode(h));break;case "Q":c.offset=d;f=t.Unmarshall(["b","w","d"],b,c);d=c.offset;e.push({type:f[0],version:f[1], path:f[2]});break;default:x.Debug("Error in Unmarshall: Unknown type="+a[g])}c.offset=d;return e};}).call(this); ================================================ FILE: src/renderer/start-menu.tsx ================================================ import * as React from "react"; export interface StartMenuProps { navigate: (to: string) => void; } export class StartMenu extends React.Component { constructor(props: StartMenuProps) { super(props); this.navigate = this.navigate.bind(this); } public render() { return ( ); } private navigate(event: React.SyntheticEvent) { this.props.navigate(event.currentTarget.id); } } ================================================ FILE: src/renderer/status.tsx ================================================ ================================================ FILE: src/renderer/utils/get-state-path.ts ================================================ import { ipcRenderer } from "electron"; import { IPC_COMMANDS } from "../../constants"; let _statePath = ""; export async function getStatePath(): Promise { if (_statePath) { return _statePath; } const statePath = await ipcRenderer.invoke(IPC_COMMANDS.GET_STATE_PATH); return (_statePath = statePath); } ================================================ FILE: src/renderer/utils/reset-state.ts ================================================ import fs from "fs"; import { getStatePath } from "./get-state-path"; export async function resetState() { const statePath = await getStatePath(); if (fs.existsSync(statePath)) { try { await fs.promises.unlink(statePath); } catch (error) { console.error(`Failed to delete state file: ${error}`); } } } ================================================ FILE: src/utils/devmode.ts ================================================ /** * Are we currently running in development mode? * * @returns {boolean} */ export function isDevMode() { return !!process.defaultApp; } ================================================ FILE: src/utils/disk-image-size.ts ================================================ import * as fs from "fs"; import { CONSTANTS } from "../constants"; /** * Get the size of the disk image * * @returns {number} */ export async function getDiskImageSize(path: string) { try { const stats = await fs.promises.stat(path); if (stats) { return stats.size; } } catch (error) { console.warn(`Could not determine image size`, error); } return CONSTANTS.IMAGE_DEFAULT_SIZE; } ================================================ FILE: static/entitlements.plist ================================================ com.apple.security.cs.allow-jit com.apple.security.cs.allow-unsigned-executable-memory ================================================ FILE: static/index.html ================================================ windows95
    ================================================ FILE: static/www/apps.htm ================================================ windows95 Help
    windows95 Apps & Games

    I've installed a few apps and games for you to try out. Check out the Games folder on the desktop!

    If you want to try other games, I recommend trying to find them on the Internet Archive. On your host computer, visit https://archive.org, then find the "Classic PC Games" category. Once downloaded, you can import them into windows95 from your host's Download folder.

    ================================================ FILE: static/www/credits.htm ================================================ Windows 95 Credits
    windows95 Credits

    Emulation Engine

    None of this would be possible without the people working on v86, in particular Fabian Hemmer aka copy. You can visit his website at copy.sh. It also wouldn't be possible without the QEMU project. If you enjoy running old systems, you probably want QEMU - windows95 is merely a toy, QEMU lets you actually run old systems in a stable manner.

    Electron

    Electron is a framework for building desktop applications using web technologies. It's what powers windows95. You can visit the project's website at electronjs.org (in a modern browser, not in windows95).

    ================================================ FILE: static/www/help.htm ================================================ windows95 Help
    windows95 Help

    MS-DOS Display Issues

    If MS-DOS seems to mess up the screen:

    1. Hit Alt + Enter to make the command screen "Full Screen" (as far as Windows 95 is concerned)
    2. This should restore the display from the garbled mess you see and allow you to access the Command Prompt
    3. Press Alt-Enter again to leave Full Screen and go back to Window Mode

    (Thanks to @DisplacedGamers for that wisdom)

    windows95 Stuck in Bad State

    If windows95 becomes unresponsive or stuck:

    1. On the app's home screen, select "Settings" in the lower menu
    2. Delete your machine's state before starting it again
    3. This should resolve the issue when you restart
    ================================================ FILE: static/www/home.htm ================================================ Welcome to Windows 95!
    Welcome to Windows 95!

    Hi, I'm Felix, the maker behind windows95. I hope you're having fun!

    Reach out to me in a modern browser (as in: not in windows95) on felixrieseberg.com or find me on Bluesky at @felixrieseberg.


    The Internet!

    In a major update since the last version, windows95 now has working Internet! That said, most modern websites will not work, so brace yourself. I recommend using The Old Net to travel back in time.

    Last updated: 2025
    ================================================ FILE: static/www/index.htm ================================================ Welcome to Windows 95! <body bgcolor="#000080"> <font face="Arial" color="#FFFFFF"> <h2>Frame Alert!</h2> <p>This page uses frames, but your browser doesn't support them.</p> <p>Please upgrade to Netscape Navigator 2.0 or Internet Explorer 3.0!</p> </font> </body> ================================================ FILE: static/www/navigation.htm ================================================ Navigation
    Navigation
    Home
    Apps & Games
    Help
    Credits

    Best viewed with
    Internet Explorer 5.5 and windows95

    ================================================ FILE: tools/add-macos-cert.sh ================================================ #!/usr/bin/env sh KEY_CHAIN=build.keychain MACOS_CERT_P12_FILE=certificate.p12 # Recreate the certificate from the secure environment variable echo $MACOS_CERT_P12 | base64 --decode > $MACOS_CERT_P12_FILE #create a keychain security create-keychain -p actions $KEY_CHAIN # Make the keychain the default so identities are found security default-keychain -s $KEY_CHAIN # Unlock the keychain security unlock-keychain -p actions $KEY_CHAIN security import $MACOS_CERT_P12_FILE -k $KEY_CHAIN -P $MACOS_CERT_PASSWORD -T /usr/bin/codesign; security set-key-partition-list -S apple-tool:,apple: -s -k actions $KEY_CHAIN # remove certs rm -fr *.p12 ================================================ FILE: tools/check-links.js ================================================ const fs = require('fs/promises') const path = require('path') const fetch = require('node-fetch') const LINK_RGX = /(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?/g; async function main() { const readmePath = path.join(__dirname, '../README.md') const readme = await fs.readFile(readmePath, 'utf-8') const links = readme.match(LINK_RGX) let failed = false for (const link of links) { try { const response = await fetch(link, { method: 'HEAD' }) if (!response.ok) { // If we're inside GitHub's release asset server, we just ran into AWS not allowing // HEAD requests, which is different from a 404. if (!response.url.startsWith('https://github-production-release-asset')) { throw new Error (`HTTP Error Response: ${response.status} ${response.statusText}`) } } console.log(`✅ ${link}`); } catch (error) { failed = true console.log(`❌ ${link}\n${error}`) } } if (failed) { process.exit(-1); } } main() ================================================ FILE: tools/download-disk.ps1 ================================================ mkdir images cd images $wc = New-Object System.Net.WebClient $wc.DownloadFile($env:DISK_URL, "$(Resolve-Path .)\images.zip") 7z x images.zip -y -aoa Remove-Item images.zip Remove-Item __MACOSX -Recurse -ErrorAction Ignore cd .. Tree ./ /F ================================================ FILE: tools/download-disk.sh ================================================ #!/usr/bin/env sh mkdir -p ./images cd ./images wget -O images.zip $DISK_URL unzip -o images.zip rm images.zip rm -r __MACOSX cd - ls images ================================================ FILE: tools/generateAssets.js ================================================ /* tslint:disable */ const { compileParcel } = require('./parcel-build') module.exports = async () => { await Promise.all([compileParcel()]) } ================================================ FILE: tools/parcel-build.js ================================================ /* tslint:disable */ const Bundler = require('parcel-bundler') const path = require('path') const fs = require('fs') async function copyLib() { const target = path.join(__dirname, '../dist/static') const lib = path.join(__dirname, '../src/renderer/lib') const index = path.join(target, 'index.html') // Copy in lib await fs.promises.cp(lib, target, { recursive: true }); // Patch so that fs.read is used const libv86path = path.join(target, 'libv86.js') const libv86 = fs.readFileSync(libv86path, 'utf-8') let patchedLibv86 = libv86.replace('k.load_file="undefined"===typeof XMLHttpRequest?pa:qa', 'k.load_file=pa') patchedLibv86 = patchedLibv86.replace('H.exportSymbol=function(a,b){"undefined"!==typeof module&&"undefined"!==typeof module.exports?module.exports[a]=b:"undefined"!==typeof window?window[a]=b:"function"===typeof importScripts&&(self[a]=b)}', 'H.exportSymbol=function(a,b){"undefined"!==typeof window?window[a]=b:"undefined"!==typeof module&&"undefined"!==typeof module.exports?module.exports[a]=b:"function"===typeof importScripts&&(self[a]=b)}') patchedLibv86 = patchedLibv86.replace('this.fetch=fetch;', 'this.fetch=(...args)=>fetch(...args);') fs.writeFileSync(libv86path, patchedLibv86) // Overwrite const indexContents = fs.readFileSync(index, 'utf-8'); const replacedContents = indexContents.replace('', '') fs.writeFileSync(index, replacedContents) } async function compileParcel (options = {}) { const entryFiles = [ path.join(__dirname, '../static/index.html'), path.join(__dirname, '../src/main/main.ts') ] const bundlerOptions = { outDir: './dist', // The out directory to put the build files in, defaults to dist outFile: undefined, // The name of the outputFile publicUrl: '../', // The url to server on, defaults to dist watch: false, // whether to watch the files and rebuild them on change, defaults to process.env.NODE_ENV !== 'production' cache: false, // Enabled or disables caching, defaults to true cacheDir: '.cache', // The directory cache gets put in, defaults to .cache contentHash: false, // Disable content hash from being included on the filename minify: false, // Minify files, enabled if process.env.NODE_ENV === 'production' scopeHoist: false, // turn on experimental scope hoisting/tree shaking flag, for smaller production bundles target: 'electron', // browser/node/electron, defaults to browser // https: { // Define a custom {key, cert} pair, use true to generate one or false to use http // cert: './ssl/c.crt', // path to custom certificate // key: './ssl/k.key' // path to custom key // }, logLevel: 3, // 3 = log everything, 2 = log warnings & errors, 1 = log errors hmr: false, // Enable or disable HMR while watching hmrPort: 0, // The port the HMR socket runs on, defaults to a random free port (0 in node.js resolves to a random free port) sourceMaps: false, // Enable or disable sourcemaps, defaults to enabled (minified builds currently always create sourcemaps) hmrHostname: '', // A hostname for hot module reload, default to '' detailedReport: false, // Prints a detailed report of the bundles, assets, filesizes and times, defaults to false, reports are only printed if watch is disabled, ...options } const bundler = new Bundler(entryFiles, bundlerOptions) // Run the bundler, this returns the main bundle // Use the events if you're using watch mode as this promise will only trigger once and not for every rebuild await bundler.bundle() await copyLib(); } module.exports = { compileParcel } if (require.main === module) compileParcel() ================================================ FILE: tools/parcel-watch.js ================================================ const { compileParcel } = require('./parcel-build') async function watchParcel () { return compileParcel({ watch: true }) } module.exports = { watchParcel } if (require.main === module) watchParcel() ================================================ FILE: tools/resedit.js ================================================ const path = require('path'); const resedit = require('../node_modules/@electron/packager/dist/resedit.js') const package = require('../package.json'); const exePath = process.argv[process.argv.length - 1] console.log(exePath) async function main() { await resedit.resedit(exePath, { "productVersion": package.version, "fileVersion": package.version, "productName": package.productName, "iconPath": path.join(__dirname, "../assets/icon.ico"), "win32Metadata": { "FileDescription": package.productName, "InternalName": package.name, "OriginalFilename": `${package.name}.exe`, "ProductName": package.productName, "CompanyName": package.author } }); } main(); ================================================ FILE: tools/run-bin.js ================================================ /* tslint:disable */ const childProcess = require('child_process') const path = require('path') async function run (name, bin, args = []) { await new Promise((resolve, reject) => { console.info(`Running ${name}`) const cmd = process.platform === 'win32' ? `${bin}.cmd` : bin const child = childProcess.spawn( path.resolve(__dirname, '..', 'node_modules', '.bin', cmd), args, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' } ) child.on('exit', (code) => { console.log('') if (code === 0) return resolve() reject(new Error(`${name} failed`)) }) }) }; module.exports = { run } ================================================ FILE: tools/tsc.js ================================================ /* tslint:disable */ const { run } = require('./run-bin') async function compileTypeScript () { await run('TypeScript', 'tsc', ['-p', 'tsconfig.json']) }; module.exports = { compileTypeScript } if (require.main === module) compileTypeScript() ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "outDir": "./dist", "allowJs": true, "allowSyntheticDefaultImports": true, "experimentalDecorators": true, "removeComments": false, "preserveConstEnums": true, "sourceMap": true, "lib": [ "es2023", "dom" ], "noImplicitAny": true, "noImplicitReturns": true, "strictNullChecks": true, "noUnusedLocals": true, "noImplicitThis": true, "noUnusedParameters": true, "noEmitHelpers": false, "module": "commonjs", "moduleResolution": "node", "pretty": true, "target": "es2023", "jsx": "react", "typeRoots": [ "./node_modules/@types" ], "baseUrl": "." }, "include": [ "src/**/*" ], "exclude": [ "node_modules" ], "formatCodeOptions": { "indentSize": 2, "tabSize": 2 } }