Full Code of ish-app/ish for AI

master cc391ff2e56d cached
413 files
2.2 MB
598.3k tokens
2332 symbols
1 requests
Download .txt
Showing preview only (2,386K chars total). Download the full file or copy to clipboard to get everything.
Repository: ish-app/ish
Branch: master
Commit: cc391ff2e56d
Files: 413
Total size: 2.2 MB

Directory structure:
gitextract_xua3mraa/

├── .editorconfig
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       ├── autolabel.yml
│       ├── ci.yml
│       ├── deploy-site.yml
│       ├── update-alpine-repo.yml
│       └── upload-build.yml
├── .gitignore
├── .gitmodules
├── Gemfile
├── ISSUE_TEMPLATE.md
├── LICENSE.IOS
├── LICENSE.md
├── README.md
├── README_JP.md
├── README_KO.md
├── README_ZH.md
├── SECURITY.md
├── app/
│   ├── AboutAppearanceViewController.h
│   ├── AboutAppearanceViewController.m
│   ├── AboutExternalKeyboardViewController.h
│   ├── AboutExternalKeyboardViewController.m
│   ├── AboutNavigationController.h
│   ├── AboutNavigationController.m
│   ├── AboutViewController.h
│   ├── AboutViewController.m
│   ├── AccessibilityFixes.m
│   ├── AltIconViewController.h
│   ├── AltIconViewController.m
│   ├── App.xcconfig
│   ├── AppDelegate.h
│   ├── AppDelegate.m
│   ├── AppGroup.h
│   ├── AppGroup.m
│   ├── AppLib.xcconfig
│   ├── ArrowBarButton.h
│   ├── ArrowBarButton.m
│   ├── Assets.xcassets/
│   │   ├── AppIcon.appiconset/
│   │   │   └── Contents.json
│   │   ├── Checkbox.imageset/
│   │   │   └── Contents.json
│   │   ├── Contents.json
│   │   ├── Hide Keyboard.imageset/
│   │   │   └── Contents.json
│   │   ├── Paste.imageset/
│   │   │   └── Contents.json
│   │   ├── Saddam Hussein.imageset/
│   │   │   └── Contents.json
│   │   └── X.imageset/
│   │       └── Contents.json
│   ├── BarButton.h
│   ├── BarButton.m
│   ├── Base.lproj/
│   │   ├── About.storyboard
│   │   ├── LaunchScreen.storyboard
│   │   └── Terminal.storyboard
│   ├── CLI.xcconfig
│   ├── CurrentRoot.h
│   ├── CurrentRoot.m
│   ├── DelayedUITask.h
│   ├── DelayedUITask.m
│   ├── ExceptionExfiltrator.h
│   ├── ExceptionExfiltrator.m
│   ├── FileProvider/
│   │   ├── FileProviderEnumerator.h
│   │   ├── FileProviderEnumerator.m
│   │   ├── FileProviderExtension.h
│   │   ├── FileProviderExtension.m
│   │   ├── FileProviderItem.h
│   │   ├── FileProviderItem.m
│   │   ├── Info.plist
│   │   ├── NSError+ISHErrno.h
│   │   ├── NSError+ISHErrno.m
│   │   └── iSHFileProvider.entitlements
│   ├── FontPickerViewController.h
│   ├── FontPickerViewController.m
│   ├── IOSCalls.m
│   ├── Icons/
│   │   └── Icons.plist
│   ├── Info.plist
│   ├── Linux.xcconfig
│   ├── LinuxInterop.c
│   ├── LinuxInterop.h
│   ├── LinuxPTY.c
│   ├── LinuxRoot.c
│   ├── LinuxTTY.c
│   ├── LocationDevice.h
│   ├── LocationDevice.m
│   ├── NSObject+SaneKVO.h
│   ├── NSObject+SaneKVO.m
│   ├── NotLinux.xcconfig
│   ├── PassthroughView.h
│   ├── PassthroughView.m
│   ├── PasteboardDevice.h
│   ├── PasteboardDevice.m
│   ├── PasteboardDeviceLinux.c
│   ├── ProgressReportViewController.h
│   ├── ProgressReportViewController.m
│   ├── Project.xcconfig
│   ├── ProjectDebug.xcconfig
│   ├── ProjectDebugLinux.xcconfig
│   ├── ProjectRelease.xcconfig
│   ├── ProjectReleaseLinux.xcconfig
│   ├── Roots.h
│   ├── Roots.m
│   ├── Roots.storyboard
│   ├── RootsTableViewController.h
│   ├── RootsTableViewController.m
│   ├── SceneDelegate.h
│   ├── SceneDelegate.m
│   ├── ScrollbarView.h
│   ├── ScrollbarView.m
│   ├── Settings.bundle/
│   │   └── Root.plist
│   ├── StaticLib.xcconfig
│   ├── StaticLibLinux.xcconfig
│   ├── StaticLibLinuxUser.xcconfig
│   ├── Terminal.h
│   ├── Terminal.m
│   ├── TerminalView.h
│   ├── TerminalView.m
│   ├── TerminalViewController.h
│   ├── TerminalViewController.m
│   ├── Theme.h
│   ├── Theme.m
│   ├── ThemeViewController.h
│   ├── ThemeViewController.m
│   ├── ThemesViewController.h
│   ├── ThemesViewController.m
│   ├── UIApplication+OpenURL.h
│   ├── UIApplication+OpenURL.m
│   ├── UITests/
│   │   ├── Info.plist
│   │   ├── Screenshots.m
│   │   ├── Screenshots.xctestplan
│   │   └── UITests.m
│   ├── UIViewController+Extras.h
│   ├── UIViewController+Extras.m
│   ├── UpgradeRootViewController.h
│   ├── UpgradeRootViewController.m
│   ├── UserPreferences.h
│   ├── UserPreferences.m
│   ├── ViewController.h
│   ├── XcodeDebug.xcconfig
│   ├── XcodeDefault.xcconfig
│   ├── XcodeRelease.xcconfig
│   ├── gen_apk_repositories.py
│   ├── hook.c
│   ├── hook.h
│   ├── iOS.xcconfig
│   ├── iOSFS.h
│   ├── iOSFS.m
│   ├── iSH.entitlements
│   ├── iSH.xcconfig
│   ├── main.m
│   ├── terminal/
│   │   ├── term.css
│   │   ├── term.html
│   │   └── term.js
│   ├── xcode-meson.sh
│   └── xcode-ninja.sh
├── asbestos/
│   ├── asbestos.c
│   ├── asbestos.h
│   ├── frame.h
│   ├── gadgets-aarch64/
│   │   ├── bits.S
│   │   ├── control.S
│   │   ├── entry.S
│   │   ├── gadgets.h
│   │   ├── math.S
│   │   ├── math.h
│   │   ├── memory.S
│   │   ├── misc.S
│   │   └── string.S
│   ├── gadgets-generic.h
│   ├── gadgets-x86_64/
│   │   ├── bits.S
│   │   ├── control.S
│   │   ├── entry.S
│   │   ├── gadgets.h
│   │   ├── math.S
│   │   ├── memory.S
│   │   ├── misc.S
│   │   └── string.S
│   ├── gen.c
│   ├── gen.h
│   ├── helpers.c
│   └── offsets.c
├── debug.h
├── deps/
│   ├── aports/
│   │   ├── sync-archive.sh
│   │   ├── v3.14/
│   │   │   ├── community/
│   │   │   │   └── x86/
│   │   │   │       └── index.txt
│   │   │   └── main/
│   │   │       └── x86/
│   │   │           └── index.txt
│   │   ├── v3.17/
│   │   │   ├── community/
│   │   │   │   └── x86/
│   │   │   │       └── index.txt
│   │   │   └── main/
│   │   │       └── x86/
│   │   │           └── index.txt
│   │   ├── v3.18/
│   │   │   ├── community/
│   │   │   │   └── x86/
│   │   │   │       └── index.txt
│   │   │   └── main/
│   │   │       └── x86/
│   │   │           └── index.txt
│   │   └── v3.19/
│   │       ├── community/
│   │       │   └── x86/
│   │       │       └── index.txt
│   │       └── main/
│   │           └── x86/
│   │               └── index.txt
│   ├── clone-linux.sh
│   ├── config.h
│   ├── kconfig-fragment.sh
│   ├── libarchive.xcodeproj/
│   │   ├── project.pbxproj
│   │   └── project.xcworkspace/
│   │       ├── contents.xcworkspacedata
│   │       └── xcshareddata/
│   │           └── IDEWorkspaceChecks.plist
│   ├── linux-build.sh
│   ├── linux-sparse.txt
│   ├── linux.config
│   ├── makefilter.py
│   └── meson.build
├── emu/
│   ├── cpu.h
│   ├── cpuid.h
│   ├── decode.h
│   ├── float80-test.c
│   ├── float80.c
│   ├── float80.h
│   ├── fpu.c
│   ├── fpu.h
│   ├── interrupt.h
│   ├── mmu.h
│   ├── mmx.c
│   ├── modrm.h
│   ├── tlb.c
│   ├── tlb.h
│   ├── vec.c
│   └── vec.h
├── fastlane/
│   ├── Appfile
│   ├── Deliverfile
│   ├── Fastfile
│   ├── Matchfile
│   ├── README.md
│   ├── Snapfile
│   ├── SnapshotHelper.swift
│   └── footer.txt
├── fs/
│   ├── adhoc.c
│   ├── dev.c
│   ├── dev.h
│   ├── devices.h
│   ├── dir.c
│   ├── dyndev.c
│   ├── dyndev.h
│   ├── fake-db.c
│   ├── fake-db.h
│   ├── fake-migrate.c
│   ├── fake-rebuild.c
│   ├── fake.c
│   ├── fake.h
│   ├── fd.c
│   ├── fd.h
│   ├── fix_path.h
│   ├── generic.c
│   ├── inode.c
│   ├── inode.h
│   ├── lock.c
│   ├── mem.c
│   ├── mem.h
│   ├── mount.c
│   ├── path.c
│   ├── path.h
│   ├── pipe.c
│   ├── poll.c
│   ├── poll.h
│   ├── proc/
│   │   ├── entry.c
│   │   ├── ish.c
│   │   ├── ish.h
│   │   ├── pid.c
│   │   └── root.c
│   ├── proc.c
│   ├── proc.h
│   ├── pty.c
│   ├── real.c
│   ├── real.h
│   ├── sock.c
│   ├── sock.h
│   ├── sockrestart.c
│   ├── sockrestart.h
│   ├── sqlutil.h
│   ├── stat.c
│   ├── stat.h
│   ├── tmp.c
│   ├── tty-real.c
│   ├── tty.c
│   └── tty.h
├── iSH.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── xcshareddata/
│       ├── xcdebugger/
│       │   └── Breakpoints_v2.xcbkptlist
│       └── xcschemes/
│           ├── Screenshots.xcscheme
│           ├── iSH+Linux.xcscheme
│           ├── iSH.xcscheme
│           └── ish-cli.xcscheme
├── ish-gdb.gdb
├── ish-lldb.lldb
├── kernel/
│   ├── calls.c
│   ├── calls.h
│   ├── elf.h
│   ├── epoll.c
│   ├── errno.c
│   ├── errno.h
│   ├── eventfd.c
│   ├── exec.c
│   ├── exit.c
│   ├── fork.c
│   ├── fs.c
│   ├── fs.h
│   ├── fs_info.c
│   ├── futex.c
│   ├── futex.h
│   ├── getset.c
│   ├── group.c
│   ├── init.c
│   ├── init.h
│   ├── ipc.c
│   ├── log.c
│   ├── memory.c
│   ├── memory.h
│   ├── misc.c
│   ├── mm.h
│   ├── mmap.c
│   ├── personality.h
│   ├── poll.c
│   ├── ptrace.c
│   ├── ptrace.h
│   ├── random.c
│   ├── random.h
│   ├── resource.c
│   ├── resource.h
│   ├── signal.c
│   ├── signal.h
│   ├── task.c
│   ├── task.h
│   ├── time.c
│   ├── time.h
│   ├── tls.c
│   ├── uname.c
│   ├── user.c
│   ├── vdso.c
│   └── vdso.h
├── linux/
│   ├── emu_asbestos.c
│   ├── emu_unicorn.c
│   ├── emu_unicorn.h
│   ├── emu_unicorn_kernel.c
│   ├── fakefs.c
│   └── main.c
├── main.c
├── meson.build
├── meson_options.txt
├── misc.h
├── platform/
│   ├── darwin.c
│   ├── linux.c
│   └── platform.h
├── shell.nix
├── tests/
│   ├── .gitignore
│   ├── e2e/
│   │   ├── e2e.bash
│   │   ├── fpu/
│   │   │   ├── expected.txt
│   │   │   ├── test.sh
│   │   │   └── test_fpu.c
│   │   ├── hello/
│   │   │   ├── expected.txt
│   │   │   ├── test.sh
│   │   │   ├── test_c.c
│   │   │   ├── test_python2.py
│   │   │   └── test_python3.py
│   │   ├── qemu/
│   │   │   ├── expected.txt
│   │   │   ├── qemu-test-muldiv.h
│   │   │   ├── qemu-test-shift.h
│   │   │   ├── qemu-test.c
│   │   │   ├── qemu-test.h
│   │   │   └── test.sh
│   │   ├── shell/
│   │   │   ├── expected.txt
│   │   │   └── test.sh
│   │   └── sse2/
│   │       ├── expected.txt
│   │       ├── movaps.c
│   │       ├── movss.c
│   │       ├── paddq.c
│   │       ├── psllq.c
│   │       ├── psrlq.c
│   │       ├── test.sh
│   │       └── xorps.c
│   └── manual/
│       ├── cat.c
│       ├── fibbonaci.c
│       ├── forkexec.c
│       ├── get-busybox.sh
│       ├── getdents.c
│       ├── hello-clib.c
│       ├── hello.c
│       ├── looper.c
│       ├── meson.build
│       ├── modify.c
│       ├── signal.c
│       ├── stat.c
│       └── thread.c
├── tools/
│   ├── fakefs.c
│   ├── fakefs.h
│   ├── fakefsify.c
│   ├── meson.build
│   ├── ptraceomatic-config.h
│   ├── ptraceomatic-gdb.gdb
│   ├── ptraceomatic.c
│   ├── ptutil.c
│   ├── ptutil.h
│   ├── staticdefine.h
│   ├── staticdefine.sh
│   ├── transplant.h
│   ├── undefined-flags.c
│   ├── undefined-flags.h
│   ├── unicornomatic.c
│   ├── vdso-dump.c
│   ├── vdso-transplant-main.c
│   └── vdso-transplant.c
├── util/
│   ├── bits.h
│   ├── fchdir.c
│   ├── fchdir.h
│   ├── fifo.c
│   ├── fifo.h
│   ├── list.h
│   ├── refcount.h
│   ├── sync.c
│   ├── sync.h
│   ├── timer.c
│   └── timer.h
├── vdso/
│   ├── check-cc.sh
│   ├── meson.build
│   ├── note.S
│   ├── vdso.S
│   ├── vdso.c
│   └── vdso.lds
└── xX_main_Xx.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4


================================================
FILE: .github/FUNDING.yml
================================================
patreon: tbodt
github: tbodt
custom: https://www.paypal.me/tbodt


================================================
FILE: .github/workflows/autolabel.yml
================================================
name: Auto-Label
on:
  issues:
    types: [opened]
jobs:
  label:
    runs-on: ubuntu-latest
    steps:
      - uses: satackey/action-js-inline@bf6fcaf35de1ed03bcfd25a0a8b1fa4c551ec908
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          script: |
            const core = require('@actions/core');
            const github = require('@actions/github');
            const octokit = github.getOctokit(process.env.GITHUB_TOKEN);
            const {repo, owner, number} = github.context.issue;
            await octokit.rest.issues.addLabels({repo, owner, issue_number: number, labels: ['unconfirmed']});


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
  pull_request:
      branches: [master]

jobs:
  build-linux:
    runs-on: ubuntu-20.04
    strategy:
      matrix:
        cc: [clang, gcc]
        kernel: [ish, linux]
    steps:
      - uses: actions/checkout@v2
        with:
            submodules: true
      - uses: actions/setup-python@v2
        with:
            python-version: '3.x'
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install libarchive-dev
          pip3 install meson ninja
      - name: Clone Linux
        if: matrix.kernel == 'linux'
        run: deps/clone-linux.sh
      - name: Build
        run: |
          meson build -Dengine=asbestos -Dkernel=${{matrix.kernel}}
          ninja -C build
        env:
          CC: ${{matrix.cc}}
      - name: Test
        if: matrix.kernel == 'ish'
        run: ninja -C build test

  build-mac:
    runs-on: macos-15
    strategy:
      matrix:
        kernel: [ish, linux]
    steps:
      - uses: actions/checkout@v2
        with:
            submodules: true
      - name: Install dependencies
        run: |
          brew install llvm lld ninja libarchive meson
      - name: Clone Linux
        if: matrix.kernel == 'linux'
        run: deps/clone-linux.sh
      - name: Build
        if: matrix.kernel == 'ish'
        run: xcodebuild -project iSH.xcodeproj -scheme iSH -arch arm64 -sdk iphoneos CODE_SIGNING_ALLOWED=NO
      - name: Build
        if: matrix.kernel == 'linux'
        run: xcodebuild -project iSH.xcodeproj -scheme iSH+Linux -arch x86_64 -sdk iphonesimulator CODE_SIGNING_ALLOWED=NO


================================================
FILE: .github/workflows/deploy-site.yml
================================================
name: Deploy Site
on:
  release:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Trigger Deploy
      run: curl -d {} $NETLIFY_DEPLOY_HOOK
      env:
        NETLIFY_DEPLOY_HOOK: ${{ secrets.NETLIFY_DEPLOY_HOOK }}


================================================
FILE: .github/workflows/update-alpine-repo.yml
================================================
name: "Update Repo"
on:
  workflow_dispatch:
  schedule:
    - cron: "0 0 * * 6"

jobs:
  update:
    if: github.repository == 'ish-app/ish'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup dependencies
        run: |
          curl https://rclone.org/install.sh | sudo bash
          mkdir -p ~/.config/rclone
          echo "$RCLONE_CONFIG" > ~/.config/rclone/rclone.conf
        env:
          RCLONE_CONFIG: ${{ secrets.RCLONE_CONFIG }}
      - name: Update
        run: |
          deps/aports/sync-archive.sh v3.14 main/x86 deps/aports
          deps/aports/sync-archive.sh v3.14 community/x86 deps/aports
          deps/aports/sync-archive.sh v3.17 main/x86 deps/aports
          deps/aports/sync-archive.sh v3.17 community/x86 deps/aports
          deps/aports/sync-archive.sh v3.18 main/x86 deps/aports
          deps/aports/sync-archive.sh v3.18 community/x86 deps/aports
          deps/aports/sync-archive.sh v3.19 main/x86 deps/aports
          deps/aports/sync-archive.sh v3.19 community/x86 deps/aports
      - name: Commit
        id: commit
        run: |
          git config user.name github-actions[bot]
          git config user.email 41898282+github-actions[bot]@users.noreply.github.com
          git add deps/aports
          git commit -m "Update Alpine repositories"
          # TODO add a summary of changes in the commit description
        continue-on-error: true
      - name: Push
        if: ${{ steps.commit.outcome == 'success' }}
        run: git push


================================================
FILE: .github/workflows/upload-build.yml
================================================
name: Upload Build

on:
  workflow_dispatch:
  schedule:
    - cron: "0 6 * * *"

jobs:
  upload-build:
    if: github.repository == 'ish-app/ish'
    runs-on: macos-15
    timeout-minutes: 720
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
          fetch-depth: 0

      - name: Install deps
        run: |
          brew install ninja lld llvm meson
          bundle install
          git config user.name github-actions[bot]
          git config user.email 41898282+github-actions[bot]@users.noreply.github.com

      - name: Fastlane
        timeout-minutes: 720
        run: script fastlane.log bundle exec fastlane upload_build
        env:
          APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }}
          APP_STORE_CONNECT_API_KEY_KEY_ID: ${{ secrets.APP_STORE_CONNECT_KEY_ID }}
          APP_STORE_CONNECT_API_KEY_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }}
          MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GITHUB_AUTH }}
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSPHRASE }}
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          SLACK_URL: ${{ secrets.SLACK_URL }}
          FASTLANE_SKIP_UPDATE_CHECK: 1

      - uses: actions/upload-artifact@v4
        with:
          name: App
          path: |
            iSH.ipa
            iSH.app.dSYM.zip

      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: Fastlane Logs
          path: |
            fastlane.log
            ~/Library/Logs/gym



================================================
FILE: .gitignore
================================================
build/
xcuserdata/
.floo

cross-*.txt
root.tar.gz

node_modules
app/xtermjs/xterm-dist
app/xtermjs/.cache

subprojects/
!subprojects/*.wrap

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output

e2e_out/


================================================
FILE: .gitmodules
================================================
[submodule "libapps"]
	path = deps/libapps
	url = https://github.com/ish-app/libapps
[submodule "deps/libarchive"]
	path = deps/libarchive
	url = https://github.com/libarchive/libarchive
[submodule "deps/linux"]
	path = deps/linux
	url = https://github.com/ish-app/linux
	update = none
	shallow = true


================================================
FILE: Gemfile
================================================
source "https://rubygems.org"
gem "fastlane"
gem "dotenv"
gem "pry"

gem "abbrev"
gem "irb"
gem "rdoc"
gem "mutex_m"
gem "ostruct"
gem "logger"


================================================
FILE: ISSUE_TEMPLATE.md
================================================
<!--
If you're reporting a crash, please include a crash dump. You can find them in Settings -> Privacy -> Analytics -> Analytics Data on iOS 12, or Settings -> Privacy -> Diagnostics and Usage on iOS 11.
If this is a "Bad system call", "Illegal instruction", or "Segmentation fault", run `dmesg` to get a dump of the log messages and include the relevant output.
-->


================================================
FILE: LICENSE.IOS
================================================
The iSH developers are aware that the terms of service that apply to
apps distributed via Apple's App Store services may conflict with
rights granted under the iSH license, the GNU General Public License,
version 2 or 3. The copyright holders of the iSH app do not wish this
conflict to prevent the otherwise-compliant distribution of derived
apps via the App Store. Therefore, we have committed not to pursue
any license violation that results solely from the conflict between
the GNU GPLv2 or v3 and the Apple App Store terms of service. In other
words, as long as you comply with the GPL in all other respects,
including its requirements to provide users with source code and the
text of the license, we will not object to your distribution of the
iSH app through the App Store.


================================================
FILE: LICENSE.md
================================================
iSH is licensed under the [GPLv3][]. The additional terms in LICENSE.IOS also apply.

Contributions made after commit 0e3a4144f93135c4fd618c8397d2cfd87194f69f are
additionally licensed under the [GPLv2][]. This is intended to allow linking
with GPLv2 licensed projects such as Linux and QEMU.

The following authors have agreed to relicense their past contributions under GPLv2:
- Theodore Dubois <tblodt@icloud.com>
- Saagar Jha <saagar@saagarjha.com>
- Christoffer Tønnessen <christoffertonnessen@icloud.com> <christoffer.tonnessen@gmail.com>
- Philipp Wallisch <philipp.wallisch@inode.at>
- Ed Luff <beartechtalks@gmail.com>
- David Southgate <d@davidsouthgate.co.uk>
- Charlie Melbye <charles.melbye@gmail.com>
- David <0b101@users.noreply.github.com>
- [as@irc](https://gist.github.com/tbodt/45ccbea8d3c095258d63f611654f05b4)
- asdfugil (name was "Assfugil" when last contributed) <towinchenmi@gmail.com> <42699250+Assfugil@users.noreply.github.com>
- AngeloHYang <38714377+AngeloHYang@users.noreply.github.com>
- Matthew Merrill <mattmerr47@gmail.com>
- Siddharth Dushantha <siddharth.dushantha@gmail.com>
- Lorenzo De Linares <lorenzo.linares@icloud.com>
- Christopher Albert <albert@alumni.tugraz.at>
- Stephen Leaf <stephenaleaf@gmail.com>
- Noah Peeters <noah@noahpeeters.de>
- Alexis Marquis <alexis@marquis.me>
- Brian Almeida <bma@thunderkeys.net>
- Viktor Oreshkin <imselfish@stek29.rocks>
- Ryan Hileman <lunixbochs@gmail.com>
- Christoforos Charalambous <chrischaralambous14@gmail.com>
- Kenta Kubo <kabuto669@icloud.com>
- Zhuowei Zhang
- never_released <24752637+woachk@users.noreply.github.com>

[GPLv3]: https://www.gnu.org/licenses/gpl-3.0.html
[GPLv2]: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html


================================================
FILE: README.md
================================================
# [iSH](https://ish.app)

[![Build Status](https://github.com/ish-app/ish/actions/workflows/ci.yml/badge.svg)](https://github.com/ish-app/ish/actions)
[![goto counter](https://img.shields.io/github/search/ish-app/ish/goto.svg)](https://github.com/ish-app/ish/search?q=goto)
[![fuck counter](https://img.shields.io/github/search/ish-app/ish/fuck.svg)](https://github.com/ish-app/ish/search?q=fuck)
[![shit counter](https://img.shields.io/github/search/ish-app/ish/shit.svg)](https://github.com/ish-app/ish/search?q=shit)

<p align="center">
<a href="https://ish.app">
<img src="https://ish.app/assets/github-readme.png">
</a>
</p>

A project to get a Linux shell running on iOS, using usermode x86 emulation and syscall translation.

For the current status of the project, check the issues tab, and the commit logs.

- [App Store page](https://apps.apple.com/us/app/ish-shell/id1436902243)
- [TestFlight beta](https://testflight.apple.com/join/97i7KM8O)
- [Discord server](https://discord.gg/HFAXj44)
- [Wiki with help and tutorials](https://github.com/ish-app/ish/wiki)
- [README中文](https://github.com/ish-app/ish/blob/master/README_ZH.md) (如若未能保持最新,请提交PR以更新)

# Hacking

This project has a git submodule, make sure to clone with `--recurse-submodules` or run `git submodule update --init` after cloning.

You'll need these things to build the project:

 - Python 3
   + Meson (`pip3 install meson`)
 - Ninja
 - Clang and LLD (on mac, `brew install llvm`, on linux, `sudo apt install clang lld` or `sudo pacman -S clang lld` or whatever)
 - sqlite3 (this is so common it may already be installed on linux and is definitely already installed on mac. if not, do something like `sudo apt install libsqlite3-dev`)
 - libarchive (`brew install libarchive`, `sudo port install libarchive`, `sudo apt install libarchive-dev`) TODO: bundle this dependency

## Build for iOS

Open the project in Xcode, open iSH.xcconfig, and change `ROOT_BUNDLE_IDENTIFIER` to something unique. You'll also need to update the development team ID in the project (not target!) build settings. Then click Run. There are scripts that should do everything else automatically. If you run into any problems, open an issue and I'll try to help.

## Build command line tool for testing

To set up your environment, cd to the project and run `meson build` to create a build directory in `build`. Then cd to the build directory and run `ninja`.

To set up a self-contained Alpine linux filesystem, download the Alpine minirootfs tarball for i386 from the [Alpine website](https://alpinelinux.org/downloads/) and run `./tools/fakefsify`, with the minirootfs tarball as the first argument and the name of the output directory as the second argument. Then you can run things inside the Alpine filesystem with `./ish -f alpine /bin/sh`, assuming the output directory is called `alpine`. If `tools/fakefsify` doesn't exist for you in your build directory, that might be because it couldn't find libarchive on your system (see above for ways to install it.)

You can replace `ish` with `tools/ptraceomatic` to run the program in a real process and single step and compare the registers at each step. I use it for debugging. Requires 64-bit Linux 4.11 or later.

## Logging

iSH has several logging channels which can be enabled at build time. By default, all of them are disabled. To enable them:

- In Xcode: Set the `ISH_LOG` setting in iSH.xcconfig to a space-separated list of log channels.
- With Meson (command line tool for testing): Run `meson configure -Dlog="<space-separated list of log channels>"`.

Available channels:

- `strace`: The most useful channel, logs the parameters and return value of almost every system call.
- `instr`: Logs every instruction executed by the emulator. This slows things down a lot.
- `verbose`: Debug logs that don't fit into another category.
- Grep for `DEFAULT_CHANNEL` to see if more log channels have been added since this list was updated.

# A note on the interpreter

Possibly the most interesting thing I wrote as part of iSH is the interpreter. It's not quite a JIT since it doesn't target machine code. Instead it generates an array of pointers to functions called gadgets, and each gadget ends with a tailcall to the next function; like the threaded code technique used by some Forth interpreters. The result is a speedup of roughly 3-5x compared to emulation using a simpler switch dispatch.

Unfortunately, I made the decision to write nearly all of the gadgets in assembly language. This was probably a good decision with regards to performance (though I'll never know for sure), but a horrible decision with regards to readability, maintainability, and my sanity. The amount of bullshit I've had to put up with from the compiler/assembler/linker is insane. It's like there's a demon in there that makes sure my code is sufficiently deformed, and if not, makes up stupid reasons why it shouldn't compile. In order to stay sane while writing this code, I've had to ignore best practices in code structure and naming. You'll find macros and variables with such descriptive names as `ss` and `s` and `a`. Assembler macros nested beyond belief. And to top it off, there are almost no comments.

So a warning: Long-term exposure to this code may cause loss of sanity, nightmares about GAS macros and linker errors, or any number of other debilitating side effects. This code is known to the State of California to cause cancer, birth defects, and reproductive harm.


================================================
FILE: README_JP.md
================================================
# [iSH](https://ish.app)

[![Build Status](https://github.com/ish-app/ish/actions/workflows/ci.yml/badge.svg)](https://github.com/ish-app/ish/actions)
[![goto counter](https://img.shields.io/github/search/ish-app/ish/goto.svg)](https://github.com/ish-app/ish/search?q=goto)
[![fuck counter](https://img.shields.io/github/search/ish-app/ish/fuck.svg)](https://github.com/ish-app/ish/search?q=fuck)
[![shit counter](https://img.shields.io/github/search/ish-app/ish/shit.svg)](https://github.com/ish-app/ish/search?q=shit)

<p align="center">
<a href="https://ish.app">
<img src="https://ish.app/assets/github-readme.png">
</a>
</p>

iSHは、ユーザーモードのx86エミュレーションとシステムコールの翻訳を使用して、iOS上でLinuxシェルを実行するプロジェクトです。

プロジェクトの現状については、issueタブとコミットログを確認してください。

- [App Storeページ](https://apps.apple.com/us/app/ish-shell/id1436902243)
- [TestFlightベータ](https://testflight.apple.com/join/97i7KM8O)
- [Discordサーバー](https://discord.gg/HFAXj44)
- [ヘルプとチュートリアルのWiki](https://github.com/ish-app/ish/wiki)

# ハッキング

このプロジェクトにはgitサブモジュールがあります。`--recurse-submodules`を使用してクローンするか、クローン後に`git submodule update --init`を実行してください。

プロジェクトをビルドするには、以下のものが必要です:

 - Python 3
   + Meson (`pip3 install meson`)
 - Ninja
 - ClangとLLD(macでは`brew install llvm`、linuxでは`sudo apt install clang lld`または`sudo pacman -S clang lld`など)
 - sqlite3(これは非常に一般的で、linuxではすでにインストールされているかもしれませんし、macでは確実にインストールされています。もしインストールされていない場合は、`sudo apt install libsqlite3-dev`などを実行してください)
 - libarchive(`brew install libarchive`、`sudo port install libarchive`、`sudo apt install libarchive-dev`など)

## iOS用にビルドする

プロジェクトをXcodeで開き、iSH.xcconfigを開いて、`ROOT_BUNDLE_IDENTIFIER`を一意の値に変更します。また、プロジェクト(ターゲットではなく!)のビルド設定で開発チームIDを更新する必要があります。その後、実行をクリックします。他のすべてを自動的に行うスクリプトがあります。問題が発生した場合は、issueを開いてください。お手伝いします。

## テスト用のコマンドラインツールをビルドする

環境を設定するには、プロジェクトディレクトリに移動し、`meson build`を実行して`build`ディレクトリを作成します。その後、buildディレクトリに移動し、`ninja`を実行します。

自己完結型のAlpine linuxファイルシステムを設定するには、[Alpineウェブサイト](https://alpinelinux.org/downloads/)からi386用のAlpine minirootfs tarballをダウンロードし、`./tools/fakefsify`を実行します。minirootfs tarballを最初の引数として、出力ディレクトリの名前を2番目の引数として指定します。その後、`./ish -f alpine /bin/sh`を使用して、Alpineファイルシステム内でコマンドを実行できます。出力ディレクトリの名前が`alpine`であると仮定します。`tools/fakefsify`がbuildディレクトリに存在しない場合、それはシステム上でlibarchiveを見つけられなかったためかもしれません(インストール方法については上記を参照してください)。

`ish`を`tools/ptraceomatic`に置き換えることで、実際のプロセスでプログラムを実行し、各ステップでレジスタを比較しながらシングルステップ実行できます。デバッグに使用します。64ビットLinux 4.11以降が必要です。

## ロギング

iSHには、ビルド時に有効にできるいくつかのロギングチャネルがあります。デフォルトでは、すべて無効になっています。有効にするには:

- Xcodeで:iSH.xcconfigの`ISH_LOG`設定をスペースで区切られたログチャネルのリストに設定します。
- Meson(テスト用のコマンドラインツール)で:`meson configure -Dlog="<ログチャネルのスペース区切りリスト>"`を実行します。

利用可能なチャネル:

- `strace`:最も有用なチャネルで、ほぼすべてのシステムコールのパラメータと戻り値をログに記録します。
- `instr`:エミュレータが実行するすべての命令をログに記録します。これにより、実行速度が大幅に低下します。
- `verbose`:他のカテゴリに該当しないデバッグログを記録します。
- `DEFAULT_CHANNEL`をgrepして、このリストが更新された後に追加されたログチャネルがあるかどうかを確認します。

# JITに関する注意事項

iSHの一部として書いた中で最も興味深いものの1つはJITです。実際には、マシンコードをターゲットにしていないため、実際のJITではありません。代わりに、ガジェットと呼ばれる関数へのポインタの配列を生成し、各ガジェットは次の関数へのテールコールで終了します。これは、一部のForthインタープリタが使用するスレッド化コード技術に似ています。その結果、純粋なエミュレーションと比較して、速度が約3〜5倍向上します。

残念ながら、ほぼすべてのガジェットをアセンブリ言語で書くという決定を下しました。これは、パフォーマンスに関してはおそらく良い決定でしたが(確かではありませんが)、可読性、保守性、および私の正気に関してはひどい決定でした。コンパイラ、アセンブラ、リンカからのたくさんの問題に対処しなければなりませんでした。コードが十分に変形していることを確認し、そうでない場合は、コンパイルできない理由をでっち上げる悪魔がいるようなものです。このコードを書いている間に正気を保つために、コード構造と命名のベストプラクティスを無視しなければなりませんでした。`ss`、`s`、`a`などの説明的な名前を持つマクロや変数が見つかるでしょう。信じられないほどネストされたアセンブラマクロ。そして、ほとんどコメントがありません。

したがって、警告です:このコードに長期間さらされると、正気を失い、GASマクロやリンカエラーについての悪夢に悩まされる可能性があります。カリフォルニア州では、このコードが癌、先天性欠損症、および生殖障害を引き起こすことが知られています。


================================================
FILE: README_KO.md
================================================
# [iSH](https://ish.app)

[![Build Status](https://github.com/ish-app/ish/actions/workflows/ci.yml/badge.svg)](https://github.com/ish-app/ish/actions)
[![goto counter](https://img.shields.io/github/search/ish-app/ish/goto.svg)](https://github.com/ish-app/ish/search?q=goto)
[![fuck counter](https://img.shields.io/github/search/ish-app/ish/fuck.svg)](https://github.com/ish-app/ish/search?q=fuck)
[![shit counter](https://img.shields.io/github/search/ish-app/ish/shit.svg)](https://github.com/ish-app/ish/search?q=shit)

<p align="center">
<a href="https://ish.app">
<img src="https://ish.app/assets/github-readme.png">
</a>
</p>

사용자 모드 x86 에뮬레이션과 시스템 call 번역을 사용하여 iOS 에서 리눅스 쉘을 실행할 수 있게 해줍니다.

프로젝트의 현황을 알고 싶으시면 커밋 로그와 이슈 탭을 참고해주세요.

- [애플 앱스토어](https://apps.apple.com/us/app/ish-shell/id1436902243)
- [TestFlight beta](https://testflight.apple.com/join/97i7KM8O)
- [Discord server](https://discord.gg/HFAXj44)
- [도움 문서 Wiki](https://github.com/ish-app/ish/wiki)
- [README중문](https://github.com/ish-app/ish/blob/master/README_ZH.md)


# Hacking

해당 프로젝트는 깃의 서브 모듈이 있습니다. 해당 저장소를 받은 후 `--recurse-submodules` 또는 `git submodule update --init` 을 입력하여 깃 서브 모듈을 클론하세요.

아래 사항은 이 프로젝트를 빌드하기 위해 필요한 것들 입니다:

 - Python 3
   + Meson (`pip3 install meson`)
 - Ninja
 - Clang and LLD (맥에서는, `brew install llvm`, 리눅스에서는, `sudo apt install clang lld` 또는 `sudo pacman -S clang lld` 을 실행하세요)
 - sqlite3 (맥에서는 이미 제공 되어 있을 확률이 높습니다. 만약 그렇지 않다면 `sudo apt install libsqlite3-dev`)
 - libarchive (`brew install libarchive`, `sudo port install libarchive`, `sudo apt install libarchive-dev`) TODO: 앞에 dependency를 번들링 하기

## iOS 로 빌드하는 법 

Xcode로 프로젝트를 열고, iSH.xcconfig 연 후에 `ROOT_BUNDLE_IDENTIFIER`를 해당 프로젝트에 유일한 값으로 바꾸세요. 그후 실행을 누르면 자동으로 나머지를 세팅해줄 스크립트가 제공되어 있습니다. 만약 문제가 생긴다면, issue open을 해주시면 도와드리겠습니다.


## 테스트를 위한 cli 도구 빌드하는 법

환경을 세팅하기 위해서는 프로젝트 디렉토리로 이동하고 `meson build`를 커맨드 라인에 입력하세요. 그 후 빌드 된 디렉토리로 cd 후 `ninja` 커맨드를 입력해 실행하세요.

자체적으로 컨테이너 화 된 Alpine 리눅스 파일 시스템으로 실행하고 싶다면, [Alpine 웹사이트](https://alpinelinux.org/downloads/) 에서 i386을 위한 Alpine minirootfs(Mini Root Filesystem) tarball 을 다운로드 받고 `./tools/fakefsify`으로 실행하세요. 매개인자로 다운로드 받은 minirootfs tarball 파일을 입력하고 출력 받을 디렉토리의 이름을 두번째 인자로 입력하면 됩니다. 그 후에는 `./ish -f {출력받을 디렉토리 이름} /bin/sh` 명령어를 사용하여 Alpine 시스템 내에서 원하는 것을 실행할 수 있습니다. 만약 `tools/fakefsify` 가 빌드 디렉토리에 존재하지 않는다면, libarchive를 찾을 수 없어서 그런 것일 수 있습니다. 위를 참고하여 시스템에 설치하는 방법을 참고해주세요.

실제 프로세스로 프로그램을 실행하고 각 단계의 레지스터를 비교하기 위해서 `ish`를 `tools/ptraceomatic`로 바꿔 실행할 수 있습니다. 디버깅을 위해 저는 사용합니다. 64-bit Linux 4.11 이후 버전이 필요합니다.

## 로깅

iSH 는 빌드 시간에 허용될 수 있는 다수의 로깅 채널을 갖고 있습니다. 기본 값으로는 모두 꺼놨는데, 사용을 위해서는:

- Xcode에서: iSH.xcconfig에 있는 `ISH_LOG` 값을 스페이스로 나뉜 로그 채널 리스트로 설정해주세요.
- Meson에서 (테스트를 위한 커맨드 라인 도구): `meson configure -Dlog="<스페이스로 나뉜 로그 채널 리스트>"`을 실행하세요.

제공되는 로그 채널:

- `strace`: 가장 쓸모있는 채널입니다. 매개변수와 거의 모든 시스템 호출의 반환 값을 로깅합니다.
- `instr`: 에뮬레이터에서 실행된 모든 명령어를 로깅합니다. 이로인해 성능저하가 일어날 수 있습니다.
- `verbose`: 다른 카타고리에 들지 않는 로그를 디버깅합니다.
- `DEFAULT_CHANNEL`을 찾아보면 리스트가 업데이트 이후 새로 추가된 로그 채널을 볼수 있습니다.

# JIT(Just In Time 컴파일러)에 대한 추가사항

iSH에서 추가한 것 중 가장 흥미로운 것은 JIT 컴파일러 일 것입니다. 기계 코드를 목적으로 하지 않기 때문에 JIT 실질적으로는 아니긴 합니다. Gadget 이라고 불리는 포인터 배열을 생성하는데, 각각의 이것은 다음 함수를 호출하는 꼬리물기를 합니다. 몇몇 Forth 언어 인터프리터에서 사용된 스레드 코드처럼 말이죠. 결과적으로 순수 에뮬보다 3-5배 더 빨라졌습니다.

불행하게도 저는 어셈블리어로 대부분의 이러한 gadget을 작성했습니다. 이것은 성능적으로는 좋은 선택이었을 지 몰라도(실제로는 알 도리가 없지만), 가독성, 유지보수, 그리고 제 정신상태에 대해서는 좋지 않은 선택이 되었습니다. 컴파일러/어셈블러/링커로 인한 여러 고충은 말도 할 수 없을 정도입니다. 거의 무슨 제 코드의 가독성을 해치지 않으면 컴파일을 막는 그러한 악마가 있는 것 같았습니다. 이 코드를 작성하는 도중 제정신을 유지하기 위해서 저는 네이밍과 코드 구조론을 따른 최적의 선택을 하지 못하였습니다. `ss`, `s` 그리고 `a`와 같은 매크로 그리고 변수 명을 찾을 수 있을 것입니다. 주석 또한 찾기 힘들 것입니다.

그렇기에 주의 하세요: 해당 코드를 장기간 접할 경우 정신질환을 앓게되거나 GAS 매크로와 링커오류에 대한 악몽에 시달리고 또다른 부작용이 있을 수 있습니다. 암, 선천적 결함, 또는 생식기 질환을 야기한다고 질병관리청에서 인정했습니다. 암튼 그랬습니다.


================================================
FILE: README_ZH.md
================================================
# [iSH](https://ish.app)

[![Build Status](https://github.com/ish-app/ish/actions/workflows/ci.yml/badge.svg)](https://github.com/ish-app/ish/actions)
[![goto counter](https://img.shields.io/github/search/ish-app/ish/goto.svg)](https://github.com/ish-app/ish/search?q=goto)
[![fuck counter](https://img.shields.io/github/search/ish-app/ish/fuck.svg)](https://github.com/ish-app/ish/search?q=fuck)
[![shit counter](https://img.shields.io/github/search/ish-app/ish/shit.svg)](https://github.com/ish-app/ish/search?q=shit)

<p align="center">
<a href="https://ish.app">
<img src="https://ish.app/assets/github-readme.png">
</a>
</p>

iSH 是一个运行在 iOS 上的 Linux shell。本项目使用了 x86 用户模式仿真和系统调用翻译转换。

请查看 issue 和提交记录以了解本项目当前的状态。

- [App Store 页面](https://apps.apple.com/us/app/ish-shell/id1436902243)
- [Testflight 测试](https://testflight.apple.com/join/97i7KM8O)
- [Discord 服务器](https://discord.gg/HFAXj44)
- [维基帮助与教程](https://github.com/ish-app/ish/wiki)

# 上手

本项目下包含了其他 git 项目作为子模块,请确保在克隆时使用参数`--recurse-submodules`,即 `git clone --recurse-submodules https://github.com/ish-app/ish.git`。或是在克隆好了之后执行 `git submodule update --init`。

编译此项目需要以下依赖:

 - Python 3
    + Meson (`pip3 install meson`)
 - Ninja 请查看[此处](https://ninja-build.org/)
 - Clang and LLD (在安装了 `brew` 的 macOS 系统上运行 `brew install llvm`。在 Linux 系统上请根据你的包管理器,选择运行相应的安装命令 `sudo apt install clang lld` 或者 `sudo pacman -S clang lld`)
 - sqlite3 (通常 sqlite3 在 macOS 上是预安装的,但它或许没有安装在你的 Linux 上,运行 `which sqlite3` 以查看它是否存在。如果没有,你可以根据你的包管理器运行 `sudo apt install libsqlite3-dev` 之类的安装命令)
 - libarchive (在 macOS 系统上使用 `brew install libarchive` 或 `sudo port install libarchive` 来安装。在 Linux 系统上请根据你的包管理器,选择运行相应的安装命令如 `sudo apt install libarchive-dev` 来安装)

## 创建iOS应用

使用 Xcode 打开项目,选择 iSH.xcconfig,并且修改 `ROOT_BUNDLE_IDENTIFIER` 为你的[唯一值](https://help.apple.com/xcode/mac/current/#/dev91fe7130a)。此外,还需要在项目(project)的构建设置(build settings)中更新开发团队 ID,注意这里指的不是目标(target)的构建设置(build settings)。然后点击 `运行`,之后应该有脚本帮你自动执行相关操作。如果遇到了任何问题,请提交 issue,我们会帮你解决。

## 为测试构建命令行工具

在项目目录中运行命令 `meson build`,之后 `build` 目录会被创建。进入到 `build` 目录并运行命令 `ninja`。

为了建立一个自有的 Alpine linux 文件系统,请从 [Alpine 网站](https://alpinelinux.org/downloads/) 下载 `Alpine minirotfs tarball for i386` 并运行 `tools/fakefsify` 。将 minirotfs tarball 指定为第一个参数,将输出目录的名称(如`alpine`)指定为第二个参数,即 `tools/fakefsify $MinirotfsTarballFilename alpine` 然后在 Alpine 文件系统中运行 `/ish -f alpine/bin/sh`。如果 `build` 目录下找不到 `tools/fakefsify`,可能是系统上找不到 `libarchive` 的依赖(请参照前面的章节进行安装)。

除了可以使用 `ish`,你也可以使用 `tools/ptraceomatic` 替代它,以便在某个真实进程中单步比较寄存器。我通常使用它来进行调试(需要 64 位 Linux 4.11 或更高版本)。

## 日志

在编译过程中,iSH 提供数种日志类型,默认情况下它们都被禁用,想要启用它们需要:

- 在 Xcode 中将 iSH.xcconfig 中 `ISH_LOG` 设置为以空格分隔的日志类型列表。
- 在 Meson (测试使用的命令行工具) 中执行命令 `meson configure -Dlog="<space-separated list of log channels>"`。

可用的日志类型:

- `strace`: 最有用的类型,记录几乎每个系统调用的参数和返回值。
- `instr`: 记录模拟器执行的每个指令,这会让所有执行变得很慢。
- `verbose`: 记录不属于其他类别的调试日志。
- 使用 `grep` 命令查看 `DEFAULT_CHANNEL` 变量,以确认在更新此列表后是否添加了更多日志频道。

# 关于 JIT

可能我在写 iSH 中最有趣的部分就是 JIT 了。实际上它不是真正的 JIT,因为它不并以机器代码为目标,而是生成一个称为 gadgets 的函数指针数组,并且每个 gadget 都以对下一个函数的尾调用结束,类似于一些 Forth 解释器使用的线程化代码技术。好处就是,与纯仿真相比,它的速度提高了 3-5 倍。

但不幸的是,我最开始决定用汇编语言编写几乎所有的 gadgets。这可能从性能方面来说是一个好的决定(虽然我永远也无法确定),但是对可读性、可维护性和我的理智来说,这是一个可怕的决定。我承受了大量来自编译器、汇编程序以及链接器的乱七八糟的东西。那里面就像有一个魔鬼,把我的代码搞得畸形,就算没有畸形,也会编造一些愚蠢的理由说它不能够编译。为了在编写代码时保持理智,我不得不忽略代码结构和命名方面的最佳实践。你会发现宏和变量具有诸如 `ss`、`s` 和 `a` 等描述性的名称,并且汇编器的宏嵌套层数超乎你的想象。最重要的是,代码中几乎没有任何注释。

所以这是一个警告: 长期接触此代码可能会使你失去理智,对 GAS 宏和链接器错误产生噩梦,或是任何其他使人虚弱的副作用。在加利福尼亚,众所周知这样的代码会导致癌症、生产缺陷和重复伤害。


================================================
FILE: SECURITY.md
================================================
# iSH is not a security boundary!

The goal of this project is to support a Linux shell on iOS. As such, its security model assumes that the app is running in another sandbox and is used by a single user. The project is focused on compatibility, and very little thought has been put into internal security. Permissions are only loosely checked. Memory corruption in edge cases is common. Please do not use iSH for any sort of secure containerization or production use case.

As such, most types of bugs that are security issues in most projects are not security issues in iSH. Insufficient permission checks, memory corruption, and thread safety issues are generally considered correctness bugs and would be best filed as GitHub issues. We will prioritize bugs encountered by real programs in typical use.

In our security model, we expect real security bugs to be very rare. It's not completely impossible, e.g. a bug allowing remote code execution without user consent would be a security bug. If you think you found one, you can send it to security@ish.app. We'll work with you to resolve it appropriately.


================================================
FILE: app/AboutAppearanceViewController.h
================================================
//
//  ThemeViewController.h
//  iSH
//
//  Created by Charlie Melbye on 11/12/18.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface AboutAppearanceViewController : UITableViewController <UIFontPickerViewControllerDelegate>

@end

NS_ASSUME_NONNULL_END


================================================
FILE: app/AboutAppearanceViewController.m
================================================
//
//  ThemeViewController.m
//  iSH
//
//  Created by Charlie Melbye on 11/12/18.
//

#import "AboutAppearanceViewController.h"
#import "FontPickerViewController.h"
#import "TerminalView.h"
#import "ThemesViewController.h"
#import "UserPreferences.h"
#import "NSObject+SaneKVO.h"

@interface AboutAppearanceViewController ()
@property (strong, nonatomic) IBOutlet UISwitch *blinkCursor;
@property (strong, nonatomic) IBOutlet UISegmentedControl *cursorStyle;
@property (strong, nonatomic) IBOutlet UISwitch *hideStatusBar;
@property UIFontPickerViewController *fontPicker API_AVAILABLE(ios(13));
@end

char *previewString = "# cat /proc/ish/colors\r\n"
"\x1B[30m" "iSH" "\x1B[39m "
"\x1B[31m" "iSH" "\x1B[39m "
"\x1B[32m" "iSH" "\x1B[39m "
"\x1B[33m" "iSH" "\x1B[39m "
"\x1B[34m" "iSH" "\x1B[39m "
"\x1B[35m" "iSH" "\x1B[39m "
"\x1B[36m" "iSH" "\x1B[39m "
"\x1B[37m" "iSH" "\x1B[39m" "\r\n\x1B[7m"
"\x1B[40m" "iSH" "\x1B[39m "
"\x1B[41m" "iSH" "\x1B[39m "
"\x1B[42m" "iSH" "\x1B[39m "
"\x1B[43m" "iSH" "\x1B[39m "
"\x1B[44m" "iSH" "\x1B[39m "
"\x1B[45m" "iSH" "\x1B[39m "
"\x1B[46m" "iSH" "\x1B[39m "
"\x1B[47m" "iSH" "\x1B[39m" "\x1B[0m\x1B[1m\r\n"
"\x1B[90m" "iSH" "\x1B[39m "
"\x1B[91m" "iSH" "\x1B[39m "
"\x1B[92m" "iSH" "\x1B[39m "
"\x1B[93m" "iSH" "\x1B[39m "
"\x1B[94m" "iSH" "\x1B[39m "
"\x1B[95m" "iSH" "\x1B[39m "
"\x1B[96m" "iSH" "\x1B[39m "
"\x1B[97m" "iSH" "\x1B[39m" "\r\n\x1B[7m"
"\x1B[100m" "iSH" "\x1B[39m "
"\x1B[101m" "iSH" "\x1B[39m "
"\x1B[102m" "iSH" "\x1B[39m "
"\x1B[103m" "iSH" "\x1B[39m "
"\x1B[104m" "iSH" "\x1B[39m "
"\x1B[105m" "iSH" "\x1B[39m "
"\x1B[106m" "iSH" "\x1B[39m "
"\x1B[107m" "iSH" "\x1B[39m" "\x1B[0m\r\n"
"# ";

@implementation AboutAppearanceViewController {
    TerminalView *_terminalView;
    Terminal *_terminal;
    struct tty *_tty;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [UserPreferences.shared observe:@[@"theme", @"fontSize", @"fontFamily", @"colorScheme"]
                            options:0 owner:self usingBlock:^(typeof(self) self) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });
    }];
    
    [UserPreferences.shared observe:@[@"cursorStyle", @"blinkCursor", @"hideStatusBar"]
                            options:0 owner:self usingBlock:^(typeof(self) self) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateOtherControls];
        });
    }];
    [self updateOtherControls];
    
#if !ISH_LINUX
    if (![NSUserDefaults.standardUserDefaults boolForKey:@"recovery"]) {
        _terminal = [Terminal createPseudoTerminal:&_tty];
        [_terminal sendOutput:previewString length:(int)strlen(previewString)];
    }
#endif
}

- (void)viewDidAppear:(BOOL)animated {
    if (@available(iOS 13, *)) {
        // Initialize the font picker ASAP, as it takes about a quarter second to initialize (XPC crap) and appears invisible until then.
        // Re-initialize it after navigating away from it, to reset the table view highlight.
        UIFontPickerViewControllerConfiguration *config = [UIFontPickerViewControllerConfiguration new];
        config.filteredTraits = UIFontDescriptorTraitMonoSpace;
        self.fontPicker = [[UIFontPickerViewController alloc] initWithConfiguration:config];
        // Prevent the font picker from resizing the popup when it appears
        self.fontPicker.preferredContentSize = CGSizeZero;
        self.fontPicker.navigationItem.title = @"Font";
        self.fontPicker.delegate = self;
        self.fontPicker.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Reset" style:UIBarButtonItemStylePlain target:self action:@selector(resetFont:)];
    }
}

#pragma mark - Table view data source

enum {
    PreviewSection,
    MainSection,
    ColorSchemeSection,
    CursorSection,
    StatusBarSection,
    NumberOfSections,
};

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return NumberOfSections;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    switch (section) {
        case PreviewSection: return 2;
        case MainSection: return 3;
        case ColorSchemeSection: return 3;
        case CursorSection: return 2;
        case StatusBarSection: return 1;
        default: NSAssert(NO, @"unhandled section"); return 0;
    }
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    switch (section) {
        case PreviewSection: return @"Preview";
        case ColorSchemeSection: return @"Color Scheme";
        case CursorSection: return @"Cursor";
        case StatusBarSection: return @"Status Bar";
        default: return nil;
    }
}

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
    switch (section) {
        case PreviewSection: return @"Change the color scheme used for the preview.";
        default: return nil;
    }
}

- (NSString *)reuseIdentifierForIndexPath:(NSIndexPath *)indexPath {
    switch (indexPath.section) {
        case PreviewSection: return @[@"Preview", @"Color Scheme Preview"][indexPath.row];
        case MainSection: return @[@"Theme Name", @"Font", @"Font Size"][indexPath.row];
        case ColorSchemeSection: return @"Color Scheme";
        case CursorSection: return @[@"Cursor Style", @"Blink Cursor"][indexPath.row];
        case StatusBarSection: return @"Status Bar";
        default: return nil;
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == PreviewSection && indexPath.row == 0) {
        // Try a best-effort guess as to how big the preview should be.
        return [@"\n\n\n\n\n\n" sizeWithAttributes:@{NSFontAttributeName: UserPreferences.shared.approximateFont}].height + 10;
    } else {
        return UITableViewAutomaticDimension;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[self reuseIdentifierForIndexPath:indexPath] forIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    
    switch (indexPath.section) {
        case PreviewSection:
            switch (indexPath.row) {
                case 0:
                    _terminalView = [cell viewWithTag:1];
                    _terminalView.userInteractionEnabled = NO;
                    _terminalView.terminal = _terminal;
                    break;
                case 1: {
                    UISegmentedControl *segmentedControl = [cell viewWithTag:1];
                    [segmentedControl addTarget:self action:@selector(changePreviewTheme:) forControlEvents:UIControlEventValueChanged];
                    [self changePreviewTheme:segmentedControl];
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
                    break;
                }
            }
            break;
            
        case MainSection:
            switch (indexPath.row) {
                case 0:
                    cell.detailTextLabel.text = UserPreferences.shared.theme.name;
                    break;
                case 1:
                    cell.detailTextLabel.text = UserPreferences.shared.fontFamilyUserFacingName;
                    cell.detailTextLabel.font = [UIFont fontWithName:UserPreferences.shared.fontFamily size:cell.detailTextLabel.font.pointSize];
                    break;
                case 2: {
                    UserPreferences *prefs = [UserPreferences shared];
                    UILabel *label = [cell viewWithTag:1];
                    UIStepper *stepper = [cell viewWithTag:2];
                    label.text = prefs.fontSize.stringValue;
                    stepper.value = prefs.fontSize.doubleValue;
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
                    break;
                }
            }
            break;
            
        case ColorSchemeSection:
            switch (indexPath.row) {
                case 0:
                    cell.textLabel.text = @"Match System";
                    break;
                case 1:
                    cell.textLabel.text = @"Light";
                    break;
                case 2:
                    cell.textLabel.text = @"Dark";
                    break;
            }
            cell.accessoryType = indexPath.row == UserPreferences.shared.colorScheme ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
            break;
            
        case CursorSection:
        case StatusBarSection:
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            break;
    }
    
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    switch (indexPath.section) {
        case MainSection:
            switch (indexPath.row) {
                case 0: { // theme
                    ThemesViewController *themesViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Themes"];
                    [self.navigationController pushViewController:themesViewController animated:YES];
                    break;
                }
                case 1: // font family
                    [self selectFont:nil];
                    break;
            }
            break;
        case ColorSchemeSection:
            [UserPreferences.shared setColorScheme:indexPath.row];
    }
}

- (void)updateOtherControls {
    self.hideStatusBar.on = UserPreferences.shared.hideStatusBar;
    self.cursorStyle.selectedSegmentIndex = UserPreferences.shared.cursorStyle;
    self.blinkCursor.on = UserPreferences.shared.blinkCursor;
    [self setNeedsStatusBarAppearanceUpdate];
}

- (void)changePreviewTheme:(UISegmentedControl *)sender {
    _terminalView.overrideAppearance = sender.selectedSegmentIndex ? OverrideAppearanceDark : OverrideAppearanceLight;
    _terminalView.backgroundColor = [[UIColor alloc] ish_initWithHexString:(sender.selectedSegmentIndex ? UserPreferences.shared.theme.darkPalette : UserPreferences.shared.theme.lightPalette).backgroundColor];
}

- (void)selectFont:(id)sender {
    if (@available(iOS 13, *)) {
        [self.navigationController pushViewController:self.fontPicker animated:YES];
        return;
    }
    
    FontPickerViewController *fontPicker = [self.storyboard instantiateViewControllerWithIdentifier:@"FontPicker"];
    [self.navigationController pushViewController:fontPicker animated:YES];
}

- (void)fontPickerViewControllerDidPickFont:(UIFontPickerViewController *)viewController API_AVAILABLE(ios(13.0)) {
    UserPreferences.shared.fontFamily = viewController.selectedFontDescriptor.fontAttributes[UIFontDescriptorFamilyAttribute];
    [self.navigationController popToViewController:self animated:YES];
}

- (IBAction)resetFont:(UIBarButtonItem *)sender API_AVAILABLE(ios(13)) {
    UserPreferences.shared.fontFamily = nil;
    [self.navigationController popToViewController:self animated:YES];
}

- (IBAction)fontSizeChanged:(UIStepper *)sender {
    UserPreferences.shared.fontSize = @((int) sender.value);
}

- (IBAction)hideStatusBarChanged:(UISwitch *)sender {
    UserPreferences.shared.hideStatusBar = sender.on;
    [self setNeedsStatusBarAppearanceUpdate];
}

- (IBAction)cursorStyleChanged:(UISegmentedControl *)sender {
    [UserPreferences.shared setCursorStyle:sender.selectedSegmentIndex];
}

- (IBAction)blinkCursorChanged:(UISwitch *)sender {
    [UserPreferences.shared setBlinkCursor:sender.on];
}
@end


================================================
FILE: app/AboutExternalKeyboardViewController.h
================================================
//
//  CapsLockMappingViewController.h
//  iSH
//
//  Created by Theodore Dubois on 12/2/18.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface AboutExternalKeyboardViewController : UITableViewController

@end

NS_ASSUME_NONNULL_END


================================================
FILE: app/AboutExternalKeyboardViewController.m
================================================
//
//  CapsLockMappingViewController.m
//  iSH
//
//  Created by Theodore Dubois on 12/2/18.
//

#import "AboutExternalKeyboardViewController.h"
#import "UserPreferences.h"
#import "NSObject+SaneKVO.h"

const int kCapsLockMappingSection = 0;

@interface AboutExternalKeyboardViewController ()

@property (weak, nonatomic) IBOutlet UISwitch *optionMetaSwitch;
@property (weak, nonatomic) IBOutlet UISwitch *backtickEscapeSwitch;
@property (weak, nonatomic) IBOutlet UISwitch *overrideControlSpaceSwitch;
@property (weak, nonatomic) IBOutlet UISwitch *hideExtraKeysWithExternalKeyboardSwitch;

@end

@implementation AboutExternalKeyboardViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [UserPreferences.shared observe:@[@"capsLockMapping", @"optionMapping"]
                            options:0 owner:self usingBlock:^(typeof(self) self) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });
    }];
    [self _update];
}

- (void)_update {
    self.optionMetaSwitch.on = UserPreferences.shared.optionMapping == OptionMapEsc;
    self.backtickEscapeSwitch.on = UserPreferences.shared.backtickMapEscape;
    self.overrideControlSpaceSwitch.on = UserPreferences.shared.overrideControlSpace;
    self.hideExtraKeysWithExternalKeyboardSwitch.on = UserPreferences.shared.hideExtraKeysWithExternalKeyboard;
}

- (IBAction)optionMetaToggle:(UISwitch *)sender {
    UserPreferences.shared.optionMapping = sender.on ? OptionMapEsc : OptionMapNone;
}
- (IBAction)backtickEscapeToggle:(UISwitch *)sender {
    UserPreferences.shared.backtickMapEscape = sender.on;
}
- (IBAction)overrideControlSpaceToggle:(UISwitch *)sender {
    UserPreferences.shared.overrideControlSpace = sender.on;
}
- (IBAction)hideExtraKeysToggle:(UISwitch *)sender {
    UserPreferences.shared.hideExtraKeysWithExternalKeyboard = sender.on;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == kCapsLockMappingSection && cell.tag == UserPreferences.shared.capsLockMapping)
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    else
        cell.accessoryType = UITableViewCellAccessoryNone;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == kCapsLockMappingSection) {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        UserPreferences.shared.capsLockMapping = cell.tag;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section == 0 && ![self.class capsLockMappingSupported])
        return 0;
    return [super tableView:tableView numberOfRowsInSection:section];
}

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
    if (section == 0 && ![self.class capsLockMappingSupported])
        return @"Caps Lock mapping is broken in iOS 13.\n\n"
        @"Since iOS 13.4, Caps Lock can be remapped system-wide in Settings → General → Keyboard → Hardware Keyboard → Modifier Keys.";
    return [super tableView:tableView titleForFooterInSection:section];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (section == 0 && ![self.class capsLockMappingSupported])
        return @"";
    return [super tableView:tableView titleForHeaderInSection:section];
}

+ (BOOL)capsLockMappingSupported {
    if (@available(iOS 13, *)) {
        return NO;
    }
    return YES;
}

@end


================================================
FILE: app/AboutNavigationController.h
================================================
//
//  AboutNavigationController.h
//  iSH
//
//  Created by Theodore Dubois on 10/6/19.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface AboutNavigationController : UINavigationController

@end

NS_ASSUME_NONNULL_END


================================================
FILE: app/AboutNavigationController.m
================================================
//
//  AboutNavigationController.m
//  iSH
//
//  Created by Theodore Dubois on 10/6/19.
//

#import "AboutNavigationController.h"
#import "UserPreferences.h"
#import "NSObject+SaneKVO.h"

@interface AboutNavigationController ()

@end

@implementation AboutNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
    [UserPreferences.shared observe:@[@"colorScheme"] options:NSKeyValueObservingOptionInitial
                              owner:self usingBlock:^(typeof(self) self) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (@available(iOS 13, *)) {
                self.overrideUserInterfaceStyle = UserPreferences.shared.userInterfaceStyle;
            }
        });
    }];
}

@end


================================================
FILE: app/AboutViewController.h
================================================
//
//  AboutViewController.h
//  iSH
//
//  Created by Theodore Dubois on 9/23/18.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface AboutViewController : UITableViewController

@property BOOL includeDebugPanel;
@property BOOL recoveryMode;

@end

NS_ASSUME_NONNULL_END


================================================
FILE: app/AboutViewController.m
================================================
//
//  AboutViewController.m
//  iSH
//
//  Created by Theodore Dubois on 9/23/18.
//

#import "AboutViewController.h"
#import "AppDelegate.h"
#import "CurrentRoot.h"
#import "AppGroup.h"
#import "UserPreferences.h"
#import "iOSFS.h"
#import "UIApplication+OpenURL.h"
#import "NSObject+SaneKVO.h"

@interface AboutViewController ()
@property (weak, nonatomic) IBOutlet UITableViewCell *capsLockMappingCell;
@property (weak, nonatomic) IBOutlet UITableViewCell *themeCell;
@property (weak, nonatomic) IBOutlet UISwitch *disableDimmingSwitch;
@property (weak, nonatomic) IBOutlet UITextField *launchCommandField;
@property (weak, nonatomic) IBOutlet UITextField *bootCommandField;

@property (weak, nonatomic) IBOutlet UITableViewCell *sendFeedback;
@property (weak, nonatomic) IBOutlet UITableViewCell *openGithub;
@property (weak, nonatomic) IBOutlet UITableViewCell *openFediverse;
@property (weak, nonatomic) IBOutlet UITableViewCell *openDiscord;

@property (weak, nonatomic) IBOutlet UITableViewCell *upgradeApkCell;
@property (weak, nonatomic) IBOutlet UILabel *upgradeApkLabel;
@property (weak, nonatomic) IBOutlet UIView *upgradeApkBadge;
@property (weak, nonatomic) IBOutlet UITableViewCell *exportContainerCell;
@property (weak, nonatomic) IBOutlet UITableViewCell *resetMountsCell;

@property (weak, nonatomic) IBOutlet UILabel *versionLabel;

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *saddamHussein;

@end

@implementation AboutViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self _updateUI];
    if (self.recoveryMode) {
        self.includeDebugPanel = YES;
        self.navigationItem.title = @"Recovery Mode";
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Exit"
                                                                                  style:UIBarButtonItemStyleDone
                                                                                 target:self
                                                                                 action:@selector(exitRecovery:)];
        self.navigationItem.leftBarButtonItem = nil;
    }
    _versionLabel.text = [NSString stringWithFormat:@"iSH %@ (Build %@)",
                          [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"],
                          [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]];

    [UserPreferences.shared observe:@[@"capsLockMapping", @"fontSize", @"launchCommand", @"bootCommand"]
                            options:0 owner:self usingBlock:^(typeof(self) self) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self _updateUI];
        });
    }];
    [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_updateUI:) name:FsUpdatedNotification object:nil];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self _updateUI];
}

- (void)updateViewConstraints {
    self.saddamHussein.constant = UIEdgeInsetsInsetRect(self.tableView.frame, self.tableView.adjustedContentInset).size.height;
    [super updateViewConstraints];
}

- (IBAction)dismiss:(id)sender {
    [self dismissViewControllerAnimated:self completion:nil];
}

- (void)exitRecovery:(id)sender {
    [NSUserDefaults.standardUserDefaults setBool:NO forKey:@"recovery"];
    exit(0);
}

- (void)_updateUI:(NSNotification *)notification {
    [self _updateUI];
}

- (void)_updateUI {
    NSAssert(NSThread.isMainThread, @"This method needs to be called on the main thread");
    self.disableDimmingSwitch.on = UserPreferences.shared.shouldDisableDimming;
    self.launchCommandField.text = [UserPreferences.shared.launchCommand componentsJoinedByString:@" "];
    self.bootCommandField.text = [UserPreferences.shared.bootCommand componentsJoinedByString:@" "];

    self.upgradeApkCell.userInteractionEnabled = FsNeedsRepositoryUpdate();
    self.upgradeApkLabel.enabled = FsNeedsRepositoryUpdate();
    self.upgradeApkBadge.hidden = !FsNeedsRepositoryUpdate();
    [self.tableView reloadData];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell == self.sendFeedback) {
        [UIApplication openURL:@"mailto:tblodt@icloud.com?subject=Feedback%20for%20iSH"];
    } else if (cell == self.openGithub) {
        [UIApplication openURL:@"https://github.com/ish-app/ish"];
    } else if (cell == self.openFediverse) {
        [UIApplication openURL:@"https://publ.ish.app/ish"];
    } else if (cell == self.openDiscord) {
        [UIApplication openURL:@"https://discord.gg/HFAXj44"];
    } else if (cell == self.exportContainerCell) {
        // copy the files to the app container so they can be extracted from iTunes file sharing
        NSURL *container = ContainerURL();
        NSURL *documents = [NSFileManager.defaultManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0];
        [NSFileManager.defaultManager removeItemAtURL:[documents URLByAppendingPathComponent:@"roots copy"] error:nil];
        [NSFileManager.defaultManager copyItemAtURL:[container URLByAppendingPathComponent:@"roots"]
                                              toURL:[documents URLByAppendingPathComponent:@"roots copy"]
                                              error:nil];
    } else if (cell == self.resetMountsCell) {
#if !ISH_LINUX
        iosfs_clear_all_bookmarks();
#endif
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
    if (section == 1) { // filesystems / upgrade
        if (!FsIsManaged()) {
            return @"The current filesystem is not managed by iSH.";
        } else if (!FsNeedsRepositoryUpdate()) {
            return [NSString stringWithFormat:@"The current filesystem is using %s, which is the latest version.", CURRENT_APK_VERSION_STRING];
        } else {
            return [NSString stringWithFormat:@"An upgrade to %s is available.", CURRENT_APK_VERSION_STRING];
        }
    }
    return [super tableView:tableView titleForFooterInSection:section];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSInteger sections = [super numberOfSectionsInTableView:tableView];
    if (!self.includeDebugPanel)
        sections--;
    return sections;
}

- (IBAction)disableDimmingChanged:(id)sender {
    UserPreferences.shared.shouldDisableDimming = self.disableDimmingSwitch.on;
}

- (IBAction)textBoxSubmit:(id)sender {
    [sender resignFirstResponder];
}

- (IBAction)launchCommandChanged:(id)sender {
    UserPreferences.shared.launchCommand = [self.launchCommandField.text componentsSeparatedByString:@" "];
}

- (IBAction)bootCommandChanged:(id)sender {
    UserPreferences.shared.bootCommand = [self.bootCommandField.text componentsSeparatedByString:@" "];
}

@end


================================================
FILE: app/AccessibilityFixes.m
================================================
//
//  AccessibilityFixes.m
//  iSH
//
//  Created by Saagar Jha on 12/31/22.
//

#import "hook.h"
#import <UIKit/UIKit.h>
#import <assert.h>
#import <dlfcn.h>
#import <objc/runtime.h>

// Work around https://bugs.webkit.org/show_bug.cgi?id=249976, which causes
// https://github.com/ish-app/ish/issues/1937.

static void replacement(void) {
    NSLog(@"Hooked PageClientImpl::assistiveTechnologyMakeFirstResponder");
}

static bool patched;

static void patch_if_needed(void) {
    if (!patched && UIAccessibilityIsVoiceOverRunning()) {
        patched = true;
        // This can take a little while.
        dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{
            Dl_info info;
            dladdr((__bridge void *)objc_getClass("WKWebView"), &info);
            void *symbol = find_symbol(info.dli_fbase, "__ZN6WebKit14PageClientImpl37assistiveTechnologyMakeFirstResponderEv");
            bool hooked = hook((void *)symbol, (void *)replacement);
            assert(hooked);
        });
    }
}

__attribute__((constructor)) void accessibilityfixes_init(void) {
    if (@available(iOS 15.7, *)) {
        [NSNotificationCenter.defaultCenter addObserverForName:UIAccessibilityVoiceOverStatusDidChangeNotification
                                                        object:nil
                                                         queue:nil
                                                    usingBlock:^(NSNotification *notification) {
            patch_if_needed();
        }];
        patch_if_needed();
    }
}


================================================
FILE: app/AltIconViewController.h
================================================
//
//  IconViewController.h
//  iSH
//
//  Created by Theodore Dubois on 12/13/19.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface AltIconViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

@end

NS_ASSUME_NONNULL_END


================================================
FILE: app/AltIconViewController.m
================================================
//
//  IconViewController.m
//  iSH
//
//  Created by Theodore Dubois on 12/13/19.
//

#import "AltIconViewController.h"
#import "UIApplication+OpenURL.h"

@interface AltIconViewController ()

@property (weak) IBOutlet UICollectionView *collectionView;

@property NSDictionary<NSString *, NSDictionary *> *altIcons;
@property NSArray<NSString *> *altIconNames;

@end

@interface AltIconCell : UICollectionViewCell

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIImageView *checkboxImageView;
@property (weak, nonatomic) IBOutlet UIButton *authorButton;

@property (nonatomic) NSString *link;

- (void)updateImage:(UIImage *)image description:(NSString *)description author:(NSString *)author link:(NSURL *)link;

@end

@implementation AltIconViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.altIcons = [NSDictionary dictionaryWithContentsOfURL:
                     [NSBundle.mainBundle URLForResource:@"Icons"
                                           withExtension:@"plist"]];
    self.altIconNames = [self.altIcons.allKeys sortedArrayUsingSelector:@selector(compare:)];
    
    NSString *iconName = UIApplication.sharedApplication.alternateIconName;
    if (iconName == nil)
        iconName = @"";
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:[self.altIconNames indexOfObject:iconName]
                                                inSection:0];
    [self.collectionView selectItemAtIndexPath:indexPath
                                      animated:NO
                                scrollPosition:UICollectionViewScrollPositionTop];
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return self.altIconNames.count;
}

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
    return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"footer" forIndexPath:indexPath];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    AltIconCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"icon" forIndexPath:indexPath];
    NSString *iconName = self.altIconNames[indexPath.item];
    [cell updateImage:[UIImage imageNamed:iconName.length == 0 ? @"icon" : iconName]
          description:self.altIcons[iconName][@"description"]
               author:self.altIcons[iconName][@"author"]
                 link:self.altIcons[iconName][@"link"]];
    return cell;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    NSString *iconName = self.altIconNames[indexPath.item];
    if (iconName.length == 0)
        iconName = nil;
    [UIApplication.sharedApplication setAlternateIconName:iconName completionHandler:^(NSError *err) {
        if (err != nil)
            NSLog(@"%@", err);
    }];
}

- (IBAction)openSubmissions:(id)sender {
    [UIApplication openURL:@"https://github.com/tbodt/ish/issues/578"];
}

- (CGFloat)sideInset:(UICollectionViewFlowLayout *)layout {
    // For maximum aesthetics, there should be a decent amount of spacing between cells
    static const CGFloat kMinSpacer = 20;
    // The insets should be somewhat smaller than the spacer
    static const CGFloat kInsetToSpacerRatio = 0.75;
    
    CGFloat total = layout.collectionView.frame.size.width;
    CGFloat item = layout.itemSize.width;
    NSUInteger count = (int) (total / item);
    CGFloat spacer;
    CGFloat inset;
    do {
        CGFloat slack = total - (item * count);
        spacer = slack / (2 * kInsetToSpacerRatio + count - 1);
        inset = spacer * kInsetToSpacerRatio;
        count--;
    } while (spacer < kMinSpacer);
    return inset;
}
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewFlowLayout *)layout insetForSectionAtIndex:(NSInteger)section {
    CGFloat sideInset = [self sideInset:layout];
    return UIEdgeInsetsMake(sideInset, sideInset, 20, sideInset);
}

@end

@implementation AltIconCell

- (void)awakeFromNib {
    [super awakeFromNib];
    
    CAShapeLayer *iconMask = [CAShapeLayer new];
    iconMask.frame = self.imageView.bounds;
    iconMask.path = [UIBezierPath bezierPathWithRoundedRect:self.imageView.bounds
                                               cornerRadius:self.imageView.bounds.size.width * 0.225].CGPath;
    self.imageView.layer.mask = iconMask;
    self.imageView.layer.minificationFilter = kCAFilterTrilinear;
    
    if (@available(iOS 13, *)) {
        self.checkboxImageView.image = UIImage.checkmarkImage;
    } else {
//        self.checkboxImageView.backgroundColor = UIColor.whiteColor;
//        self.checkboxImageView.layer.cornerRadius = self.checkboxImageView.bounds.size.width / 2;
    }

    self.authorButton.titleLabel.adjustsFontForContentSizeCategory = YES;

    self.isAccessibilityElement = YES;
    self.accessibilityCustomActions = @[[[UIAccessibilityCustomAction alloc] initWithName:@"Open link" target:self selector:@selector(openSource:)]];
}

- (void)updateImage:(UIImage *)image description:(NSString *)description author:(NSString *)author link:(NSString *)url {
    self.imageView.image = image;
    [self.authorButton setTitle:[NSString stringWithFormat:@"by %@", author] forState:UIControlStateNormal];
    self.link = url;
    self.accessibilityLabel = [NSString stringWithFormat:@"%@ by %@", description, author];
}

- (IBAction)openSource:(id)sender {
    [UIApplication openURL:self.link];
}

- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    self.checkboxImageView.hidden = !selected;
    self.accessibilityTraits = selected ? UIAccessibilityTraitSelected : 0;
}

@end


================================================
FILE: app/App.xcconfig
================================================
#include "iOS.xcconfig"

PRODUCT_NAME = iSH
PRODUCT_BUNDLE_IDENTIFIER = $(PRODUCT_BUNDLE_IDENTIFIER)
INFOPLIST_FILE = app/Info.plist
INFOPLIST_PREPROCESS = YES
INFOPLIST_PREFIX_HEADER = $(BUILT_PRODUCTS_DIR)/infoplisticons.h
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
CODE_SIGN_ENTITLEMENTS = app/iSH.entitlements

HEADER_SEARCH_PATHS = $(inherited) $(SRCROOT) $(SRCROOT)/deps/libarchive/libarchive
// AccessibilityFixes.m contains a static constructor that we don't want removed
OTHER_LDFLAGS = -ObjC $(LINUX_APP_LDFLAGS) -u _accessibilityfixes_init


================================================
FILE: app/AppDelegate.h
================================================
//
//  AppDelegate.h
//  iSH
//
//  Created by Theodore Dubois on 10/17/17.
//

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
- (void)exitApp;

#if !ISH_LINUX
+ (int)bootError;
#endif

+ (void)maybePresentStartupMessageOnViewController:(UIViewController *)vc;

@end

#if !ISH_LINUX
extern NSString *const ProcessExitedNotification;
#else
extern NSString *const KernelPanicNotification;
#endif



================================================
FILE: app/AppDelegate.m
================================================
//
//  AppDelegate.m
//  iSH
//
//  Created by Theodore Dubois on 10/17/17.
//

#include <resolv.h>
#include <arpa/inet.h>
#include <netdb.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import "AboutViewController.h"
#import "AppDelegate.h"
#import "AppGroup.h"
#import "CurrentRoot.h"
#import "ExceptionExfiltrator.h"
#import "iOSFS.h"
#import "SceneDelegate.h"
#import "PasteboardDevice.h"
#import "LocationDevice.h"
#import "NSObject+SaneKVO.h"
#import "Roots.h"
#import "TerminalViewController.h"
#import "UserPreferences.h"
#import "UIApplication+OpenURL.h"
#include "kernel/init.h"
#include "kernel/calls.h"
#include "fs/dyndev.h"
#include "fs/devices.h"
#include "fs/path.h"

#if ISH_LINUX
#import "LinuxInterop.h"
#endif

@interface AppDelegate ()

@property BOOL exiting;
@property SCNetworkReachabilityRef reachability;

@end

#if !ISH_LINUX
static void ios_handle_exit(struct task *task, int code) {
    // we are interested in init and in children of init
    // this is called with pids_lock as an implementation side effect, please do not cite as an example of good API design
    if (task->parent != NULL && task->parent->parent != NULL)
        return;
    // pid should be saved now since task would be freed
    pid_t pid = task->pid;
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:ProcessExitedNotification
                                                            object:nil
                                                          userInfo:@{@"pid": @(pid),
                                                                     @"code": @(code)}];
    });
}

static void ios_handle_die(const char *msg) {
    NSString *message = [NSString stringWithFormat:@"%s: %s", __func__, msg];
    iSHExceptionHandler([[NSException alloc] initWithName:NSGenericException reason:message userInfo:nil]);
}
#elif ISH_LINUX
void ReportPanic(const char *message) {
    [NSNotificationCenter.defaultCenter postNotificationName:KernelPanicNotification object:nil userInfo:@{@"message":@(message)}];
}
#endif

static int bootError;
static NSString *const kSkipStartupMessage = @"Skip Startup Message";

@implementation AppDelegate

- (int)boot {
#if !ISH_LINUX
    NSURL *root = [Roots.instance rootUrl:Roots.instance.defaultRoot];

    int err = mount_root(&fakefs, [root URLByAppendingPathComponent:@"data"].fileSystemRepresentation);
    if (err < 0)
        return err;

    fs_register(&iosfs);
    fs_register(&iosfs_unsafe);

    // need to do this first so that we can have a valid current for the generic_mknod calls
    err = become_first_process();
    if (err < 0)
        return err;

    FsInitialize();

    // create some device nodes
    // this will do nothing if they already exist
    generic_mknodat(AT_PWD, "/dev/tty1", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 1));
    generic_mknodat(AT_PWD, "/dev/tty2", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 2));
    generic_mknodat(AT_PWD, "/dev/tty3", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 3));
    generic_mknodat(AT_PWD, "/dev/tty4", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 4));
    generic_mknodat(AT_PWD, "/dev/tty5", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 5));
    generic_mknodat(AT_PWD, "/dev/tty6", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 6));
    generic_mknodat(AT_PWD, "/dev/tty7", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 7));

    generic_mknodat(AT_PWD, "/dev/tty", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_TTY_MINOR));
    generic_mknodat(AT_PWD, "/dev/console", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_CONSOLE_MINOR));
    generic_mknodat(AT_PWD, "/dev/ptmx", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_PTMX_MINOR));

    generic_mknodat(AT_PWD, "/dev/null", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_NULL_MINOR));
    generic_mknodat(AT_PWD, "/dev/zero", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_ZERO_MINOR));
    generic_mknodat(AT_PWD, "/dev/full", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_FULL_MINOR));
    generic_mknodat(AT_PWD, "/dev/random", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_RANDOM_MINOR));
    generic_mknodat(AT_PWD, "/dev/urandom", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_URANDOM_MINOR));
    
    generic_mkdirat(AT_PWD, "/dev/pts", 0755);
    
    // Permissions on / have been broken for a while, let's fix them
    generic_setattrat(AT_PWD, "/", (struct attr) {.type = attr_mode, .mode = 0755}, false);
    
    // Register clipboard device driver and create device node for it
    err = dyn_dev_register(&clipboard_dev, DEV_CHAR, DYN_DEV_MAJOR, DEV_CLIPBOARD_MINOR);
    if (err != 0) {
        return err;
    }
    generic_mknodat(AT_PWD, "/dev/clipboard", S_IFCHR|0666, dev_make(DYN_DEV_MAJOR, DEV_CLIPBOARD_MINOR));
    
    err = dyn_dev_register(&location_dev, DEV_CHAR, DYN_DEV_MAJOR, DEV_LOCATION_MINOR);
    if (err != 0)
        return err;
    generic_mknodat(AT_PWD, "/dev/location", S_IFCHR|0666, dev_make(DYN_DEV_MAJOR, DEV_LOCATION_MINOR));

    do_mount(&procfs, "proc", "/proc", "", 0);
    do_mount(&devptsfs, "devpts", "/dev/pts", "", 0);

    iosfs_init(); // let it mount any filesystems from user defaults

    [self configureDns];
    
    exit_hook = ios_handle_exit;
    die_handler = ios_handle_die;
#if !TARGET_OS_SIMULATOR
    NSString *sockTmp = [NSTemporaryDirectory() stringByAppendingString:@"ishsock"];
    sock_tmp_prefix = strdup(sockTmp.UTF8String);
#endif
    
    tty_drivers[TTY_CONSOLE_MAJOR] = &ios_console_driver;
    set_console_device(TTY_CONSOLE_MAJOR, 1);
    err = create_stdio("/dev/console", TTY_CONSOLE_MAJOR, 1);
    if (err < 0)
        return err;
    
    NSArray<NSString *> *command;
    command = UserPreferences.shared.bootCommand;
    NSLog(@"%@", command);
    char argv[4096];
    [Terminal convertCommand:command toArgs:argv limitSize:sizeof(argv)];
    const char *envp = "TERM=xterm-256color\0";
    err = do_execve(command[0].UTF8String, command.count, argv, envp);
    if (err < 0)
        return err;
    task_start(current);

#else
    // On first launch, this will trigger the import of the default root. Make sure to do this before entering the kernel, because it needs to run something on the main thread, and that would deadlock.
    [Roots instance];
    NSArray<NSString *> *args = @[];
    actuate_kernel([args componentsJoinedByString:@" "].UTF8String);
#endif
    
    return 0;
}

#if ISH_LINUX
const char *DefaultRootPath() {
    return [Roots.instance rootUrl:Roots.instance.defaultRoot].fileSystemRepresentation;
}

void SyncHostname(void) {
    async_do_in_workqueue(^{
        char hostname[256];
        if (gethostname(hostname, sizeof(hostname)) < 0)
            return;
        linux_sethostname(hostname);
    });
}
#endif

- (void)configureDns {
#if !ISH_LINUX
    struct __res_state res;
    if (EXIT_SUCCESS != res_ninit(&res)) {
        exit(2);
    }
    NSMutableString *resolvConf = [NSMutableString new];
    if (res.dnsrch[0] != NULL) {
        [resolvConf appendString:@"search"];
        for (int i = 0; res.dnsrch[i] != NULL; i++) {
            [resolvConf appendFormat:@" %s", res.dnsrch[i]];
        }
        [resolvConf appendString:@"\n"];
    }
    union res_sockaddr_union servers[NI_MAXSERV];
    int serversFound = res_getservers(&res, servers, NI_MAXSERV);
    char address[NI_MAXHOST];
    for (int i = 0; i < serversFound; i ++) {
        union res_sockaddr_union s = servers[i];
        if (s.sin.sin_len == 0)
            continue;
        getnameinfo((struct sockaddr *) &s.sin, s.sin.sin_len,
                    address, sizeof(address),
                    NULL, 0, NI_NUMERICHOST);
        [resolvConf appendFormat:@"nameserver %s\n", address];
    }
    
    current = pid_get_task(1);
    struct fd *fd = generic_open("/etc/resolv.conf", O_WRONLY_ | O_CREAT_ | O_TRUNC_, 0666);
    if (!IS_ERR(fd)) {
        fd->ops->write(fd, resolvConf.UTF8String, [resolvConf lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
        fd_close(fd);
    }
#endif
}

+ (int)bootError {
    return bootError;
}

+ (void)maybePresentStartupMessageOnViewController:(UIViewController *)vc {
    if ([NSUserDefaults.standardUserDefaults integerForKey:kSkipStartupMessage] >= 1)
        return;
    if (!FsIsManaged()) {
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Install iSH’s built-in APK?"
                                                                       message:@"iSH now includes the APK package manager, but it must be manually activated."
                                                                preferredStyle:UIAlertControllerStyleAlert];
        [alert addAction:[UIAlertAction actionWithTitle:@"Show me how"
                                                  style:UIAlertActionStyleDefault
                                                handler:^(UIAlertAction * _Nonnull action) {
            [UIApplication openURL:@"https://go.ish.app/get-apk"];
        }]];
        [alert addAction:[UIAlertAction actionWithTitle:@"Don't show again"
                                                  style:UIAlertActionStyleDefault
                                                handler:nil]];
        [vc presentViewController:alert animated:YES completion:nil];
    }
    [NSUserDefaults.standardUserDefaults setInteger:1 forKey:kSkipStartupMessage];
}

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions {
    NSUserDefaults *defaults = NSUserDefaults.standardUserDefaults;
    if ([defaults boolForKey:@"hail mary"]) {
        [defaults removeObjectForKey:kPreferenceBootCommandKey];
        [defaults removeObjectForKey:kPreferenceLaunchCommandKey];
        [defaults setBool:NO forKey:@"hail mary"];
    }
    if ([NSUserDefaults.standardUserDefaults boolForKey:@"recovery"])
        return YES;

    bootError = [self boot];

#if ISH_LINUX
    [NSNotificationCenter.defaultCenter addObserverForName:UIApplicationWillEnterForegroundNotification object:UIApplication.sharedApplication queue:nil usingBlock:^(NSNotification * _Nonnull note) {
        SyncHostname();
    }];
    SyncHostname();
#endif

    return YES;
}

void NetworkReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) {
    AppDelegate *self = (__bridge AppDelegate *) info;
    [self configureDns];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // get the network permissions popup to appear on chinese devices
    [[NSURLSession.sharedSession dataTaskWithURL:[NSURL URLWithString:@"http://captive.apple.com"]] resume];

    if ([NSUserDefaults.standardUserDefaults boolForKey:@"FASTLANE_SNAPSHOT"])
        [UIView setAnimationsEnabled:NO];

#if !ISH_LINUX
    NSString *ishVersion = [NSString stringWithFormat:@"iSH %@ (%@)",
                         [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"],
                         [NSBundle.mainBundle objectForInfoDictionaryKey:(NSString *) kCFBundleVersionKey]];
    extern const char *proc_ish_version;
    proc_ish_version = strdup(ishVersion.UTF8String);
    // this defaults key is set when taking app store screenshots
    extern const char *uname_hostname_override;
    NSString *hostnameOverride = UserPreferences.shared._hostnameOverride;
    if (@available(iOS 16.0, *)) { // Hostname obfuscation is in effect
        hostnameOverride = hostnameOverride ? hostnameOverride : UserPreferences.shared.hostnameOverride;
    }
    if (hostnameOverride) {
        uname_hostname_override = strdup(hostnameOverride.UTF8String);
    }
#endif
    
    [UserPreferences.shared observe:@[@"shouldDisableDimming"] options:NSKeyValueObservingOptionInitial
                              owner:self usingBlock:^(typeof(self) self) {
        dispatch_async(dispatch_get_main_queue(), ^{
            UIApplication.sharedApplication.idleTimerDisabled = UserPreferences.shared.shouldDisableDimming;
        });
    }];
    
    // This code is IPv4 and IPv6 aware: see https://developer.apple.com/library/archive/samplecode/Reachability/Listings/ReadMe_md.html
    struct sockaddr_in address = {
        .sin_len = sizeof(address),
        .sin_family = AF_INET,
    };
    self.reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (struct sockaddr *) &address);
    SCNetworkReachabilityContext context = {
        .info = (__bridge void *) self,
    };
    SCNetworkReachabilitySetCallback(self.reachability, NetworkReachabilityCallback, &context);
    SCNetworkReachabilityScheduleWithRunLoop(self.reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);

    if (self.window != nil) {
        // For iOS <13, where the app delegate owns the window instead of the scene
        if ([NSUserDefaults.standardUserDefaults boolForKey:@"recovery"]) {
            UINavigationController *vc = [[UIStoryboard storyboardWithName:@"About" bundle:nil] instantiateInitialViewController];
            AboutViewController *avc = (AboutViewController *) vc.topViewController;
            avc.recoveryMode = YES;
            self.window.rootViewController = vc;
            return YES;
        }
        TerminalViewController *vc = (TerminalViewController *) self.window.rootViewController;
        currentTerminalViewController = vc;
        [vc startNewSession];
    }
    return YES;
}

- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions API_AVAILABLE(ios(13.0)) {
    for (UISceneSession *sceneSession in sceneSessions) {
        NSString *terminalUUID = sceneSession.stateRestorationActivity.userInfo[@"TerminalUUID"];
        [[Terminal terminalWithUUID:[[NSUUID alloc] initWithUUIDString:terminalUUID]] destroy];
    }
}

- (void)dealloc {
    if (self.reachability != NULL) {
        SCNetworkReachabilityUnscheduleFromRunLoop(self.reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
        CFRelease(self.reachability);
    }
}

- (void)exitApp {
    self.exiting = YES;
    id app = [UIApplication sharedApplication];
    [app suspend];
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    if (self.exiting)
        exit(0);
}

@end

#if !ISH_LINUX
NSString *const ProcessExitedNotification = @"ProcessExitedNotification";
#else
NSString *const KernelPanicNotification = @"KernelPanicNotification";
#endif


================================================
FILE: app/AppGroup.h
================================================
//
//  AppGroup.h
//  iSH
//
//  Created by Theodore Dubois on 2/28/20.
//

#import <Foundation/Foundation.h>

NSURL *ContainerURL(void);


================================================
FILE: app/AppGroup.m
================================================
//
//  AppGroup.m
//  iSH
//
//  Created by Theodore Dubois on 2/28/20.
//

#import "AppGroup.h"
#import <Foundation/Foundation.h>
#import <mach-o/ldsyms.h>
#import <mach-o/loader.h>
#import <mach-o/getsect.h>
#import <dlfcn.h>

#define CSMAGIC_EMBEDDED_SIGNATURE 0xfade0cc0
#define CSMAGIC_EMBEDDED_ENTITLEMENTS 0xfade7171

struct cs_blob_index {
    uint32_t type;
    uint32_t offset;
};

struct cs_superblob {
    uint32_t magic;
    uint32_t length;
    uint32_t count;
    struct cs_blob_index index[];
};

struct cs_entitlements {
    uint32_t magic;
    uint32_t length;
    char entitlements[];
};

static NSDictionary *AppEntitlements(void) {
    static NSDictionary *entitlements;
    if (entitlements != nil)
        return entitlements;
    
    // Inspired by codesign.c in Darwin sources for Security.framework
    
    const struct mach_header_64 *header = &_mh_execute_header;
    
    // Simulator executables have fake entitlements in the code signature. The real entitlements can be found in an __entitlements section.
    size_t entitlements_size;
    char *entitlements_data = (char *) getsectiondata(header, "__TEXT", "__entitlements", &entitlements_size);
    if (entitlements_data != NULL) {
        NSData *data = [NSData dataWithBytesNoCopy:entitlements_data
                                            length:entitlements_size
                                      freeWhenDone:NO];
        return entitlements = [NSPropertyListSerialization propertyListWithData:data
                                                                        options:NSPropertyListImmutable
                                                                         format:nil
                                                                          error:nil];
    }
    
    // Find the LC_CODE_SIGNATURE
    struct load_command *lc = (void *) (header + 1);
    struct linkedit_data_command *cs_lc = NULL;
    for (uint32_t i = 0; i < header->ncmds; i++) {
        if (lc->cmd == LC_CODE_SIGNATURE) {
            cs_lc = (void *) lc;
            break;
        }
        lc = (void *) ((char *) lc + lc->cmdsize);
    }
    if (cs_lc == NULL)
        return nil;

    // Read the code signature off disk, as it's apparently not loaded into memory
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:NSBundle.mainBundle.executableURL error:nil];
    if (fileHandle == nil)
        return nil;
    [fileHandle seekToFileOffset:cs_lc->dataoff];
    NSData *csData = [fileHandle readDataOfLength:cs_lc->datasize];
    [fileHandle closeFile];
    const struct cs_superblob *cs = csData.bytes;
    if (ntohl(cs->magic) != CSMAGIC_EMBEDDED_SIGNATURE)
        return nil;
    
    // Find the entitlements in the code signature
    NSData *entitlementsData = nil;
    for (uint32_t i = 0; i < ntohl(cs->count); i++) {
        struct cs_entitlements *ents = (void *) ((char *) cs + ntohl(cs->index[i].offset));
        if (ntohl(ents->magic) == CSMAGIC_EMBEDDED_ENTITLEMENTS) {
            entitlementsData = [NSData dataWithBytes:ents->entitlements
                                              length:ntohl(ents->length) - offsetof(struct cs_entitlements, entitlements)];
        }
    }
    if (entitlementsData == nil)
        return nil;
    
    return entitlements = [NSPropertyListSerialization propertyListWithData:entitlementsData
                                                                    options:NSPropertyListImmutable
                                                                     format:nil
                                                                      error:nil];
}

NSArray<NSString *> *CurrentAppGroups(void) {
    return AppEntitlements()[@"com.apple.security.application-groups"];
}

NSURL *ContainerURL(void) {
    NSString *appGroup = CurrentAppGroups()[0];
    return [NSFileManager.defaultManager containerURLForSecurityApplicationGroupIdentifier:appGroup];
}


================================================
FILE: app/AppLib.xcconfig
================================================
#include "StaticLib.xcconfig"
HEADER_SEARCH_PATHS = $(inherited) $(SRCROOT) $(SRCROOT)/deps/libarchive/libarchive


================================================
FILE: app/ArrowBarButton.h
================================================
//
//  ArrowBarButton.h
//  iSH
//
//  Created by Theodore Dubois on 9/23/18.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

typedef enum : NSUInteger {
    ArrowNone = 0,
    ArrowUp,
    ArrowDown,
    ArrowLeft,
    ArrowRight,
} ArrowDirection;

@interface ArrowBarButton : UIControl

@property (nonatomic, readonly) ArrowDirection direction;
@property (nonatomic) UIKeyboardAppearance keyAppearance;

@end

NS_ASSUME_NONNULL_END


================================================
FILE: app/ArrowBarButton.m
================================================
//
//  ArrowBarButton.m
//  iSH
//
//  Created by Theodore Dubois on 9/23/18.
//

#import "ArrowBarButton.h"


@interface ArrowBarButton () <CALayerDelegate> {
    CALayer *arrowLayers[5];
}

@property CGPoint startPoint;
@property (nonatomic) ArrowDirection direction;
@property BOOL accessibilityUpDown;
@property NSTimer *timer;

@end

@implementation ArrowBarButton

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self setup];
    }
    return self;
}

static CGPoint anchors[] = {
    {},
    {.5, .95}, // ArrowUp
    {.5, .05}, // ArrowDown
    {1.05, .5}, // ArrowLeft
    {-.05, .5}, // ArrowRight
};

- (void)setup {
    self.layer.delegate = self;
    [self addTextLayer:@"↑" direction:ArrowUp];
    [self addTextLayer:@"↓" direction:ArrowDown];
    [self addTextLayer:@"←" direction:ArrowLeft];
    [self addTextLayer:@"→" direction:ArrowRight];
    [self layoutSublayersOfLayer:self.layer];
    
    self.layer.cornerRadius = 5;
    self.layer.shadowOffset = CGSizeMake(0, 1);
    self.layer.shadowOpacity = 0.4;
    self.layer.shadowRadius = 0;
    
    self.accessibilityUpDown = YES;
}

- (BOOL)isAccessibilityElement {
    return YES;
}
- (UIAccessibilityTraits)accessibilityTraits {
    return UIAccessibilityTraitAdjustable;
}
- (NSString *)accessibilityLabel {
    return self.accessibilityUpDown ? @"Arrow Keys Up or Down" : @"Arrow Keys Left or Right";
}
- (NSString *)accessibilityHint {
    return @"Double tap to toggle direction";
}

- (BOOL)accessibilityActivate {
    self.accessibilityUpDown = !self.accessibilityUpDown;
    return TRUE;
}

- (void)accessibilityIncrement {
    if (self.accessibilityUpDown)
        self.direction = ArrowUp;
    else
        self.direction = ArrowLeft; // this might be wrong in RTL
    self.direction = ArrowNone;
}
- (void)accessibilityDecrement {
    if (self.accessibilityUpDown)
        self.direction = ArrowDown;
    else
        self.direction = ArrowRight;
    self.direction = ArrowNone;
}

- (void)addTextLayer:(NSString *)text direction:(ArrowDirection)direction {
    CATextLayer *layer = [CATextLayer new];
    layer.contentsScale = UIScreen.mainScreen.scale;
    layer.string = text;
    layer.fontSize = 15;
    UIFont *font = [UIFont systemFontOfSize:layer.fontSize];
    layer.font = (__bridge CFTypeRef _Nullable) font;
    CGSize textSize = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}].size;
    layer.bounds = CGRectMake(0, 0, textSize.width, textSize.height);
    layer.foregroundColor = UIColor.blackColor.CGColor;
    
    layer.alignmentMode = kCAAlignmentCenter;
    layer.anchorPoint = anchors[direction];
    [self.layer addSublayer:layer];
    self->arrowLayers[direction] = layer;
}

- (void)layoutSublayersOfLayer:(CALayer *)superlayer {
    NSParameterAssert(superlayer == self.layer);
    for (CALayer *layer in superlayer.sublayers) {
        layer.position = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2);
    }
}

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    [super beginTrackingWithTouch:touch withEvent:event];
    self.startPoint = [touch locationInView:self];
    self.selected = YES;
    return YES;
}

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    [super continueTrackingWithTouch:touch withEvent:event];
    CGPoint currentPoint = [touch locationInView:self];
    CGPoint diff = CGPointMake(currentPoint.x - self.startPoint.x, currentPoint.y - self.startPoint.y);
    if (hypot(diff.x, diff.y) < 20) {
        self.direction = ArrowNone;
    } else if (fabs(diff.x) > fabs(diff.y)) {
        // more to the side
        if (diff.x > 0)
            self.direction = ArrowRight;
        else
            self.direction = ArrowLeft;
    } else {
        // more up and down
        if (diff.y > 0)
            self.direction = ArrowDown;
        else
            self.direction = ArrowUp;
    }
    return YES;
}

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    [super endTrackingWithTouch:touch withEvent:event];
    self.selected = NO;
    self.direction = ArrowNone;
}
- (void)cancelTrackingWithEvent:(UIEvent *)event {
    [super cancelTrackingWithEvent:event];
    self.selected = NO;
    self.direction = ArrowNone;
}

- (void)animateLayerUpdates {
    [UIView animateWithDuration:0.25 animations:^{
        for (int d = ArrowUp; d <= ArrowRight; d++) {
            CATextLayer *layer = (CATextLayer *) self->arrowLayers[d];
            if (self.direction == ArrowNone || self.direction != d) {
                layer.opacity = self.selected ? 0.25 : 1;
            } else {
                layer.opacity = 1;
            }
        }
    }];
}

- (void)setDirection:(ArrowDirection)direction {
    ArrowDirection oldDirection = _direction;
    _direction = direction;
    if (direction != oldDirection) {
        [self animateLayerUpdates];
        [self.timer invalidate];
        if (direction != ArrowNone) {
            [self sendActionsForControlEvents:UIControlEventValueChanged];
            self.timer = [NSTimer scheduledTimerWithTimeInterval:0.5 repeats:NO block:^(NSTimer *timer) {
                [self sendActionsForControlEvents:UIControlEventValueChanged];
                self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 repeats:YES block:^(NSTimer *timer) {
                    [self sendActionsForControlEvents:UIControlEventValueChanged];
                }];
            }];
        }
    }
}

- (UIColor *)textColor {
    if (self.keyAppearance == UIKeyboardAppearanceLight)
        return UIColor.blackColor;
    else
        return UIColor.whiteColor;
}

// copy pasted code :dab:
- (UIColor *)defaultColor {
    if (self.keyAppearance == UIKeyboardAppearanceLight)
        return UIColor.whiteColor;
    else
        return [UIColor colorWithRed:1 green:1 blue:1 alpha:77/255.];
}
- (UIColor *)highlightedColor {
    if (self.keyAppearance == UIKeyboardAppearanceLight)
        return [UIColor colorWithRed:172/255. green:180/255. blue:190/255. alpha:1];
    else
        return [UIColor colorWithRed:147/255. green:147/255. blue:147/255. alpha:66/255.];
}

- (void)setColors {
    if (self.selected) {
        self.backgroundColor = self.highlightedColor;
    } else {
        [UIView animateWithDuration:0 delay:0.1 options:UIViewAnimationOptionAllowUserInteraction animations:^{
            self.backgroundColor = self.defaultColor;
        } completion:nil];
    }
    for (int d = ArrowUp; d <= ArrowRight; d++) {
        CATextLayer *layer = (CATextLayer *) arrowLayers[d];
        if (self.keyAppearance == UIKeyboardAppearanceLight)
            layer.foregroundColor = UIColor.blackColor.CGColor;
        else
            layer.foregroundColor = UIColor.whiteColor.CGColor;
    }
    [self animateLayerUpdates];
}

- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    [self setColors];
}

- (void)setKeyAppearance:(UIKeyboardAppearance)keyAppearance {
    _keyAppearance = keyAppearance;
    [self setColors];
}

@end


================================================
FILE: app/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "size" : "20x20",
      "idiom" : "iphone",
      "filename" : "Icon20x20@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "20x20",
      "idiom" : "iphone",
      "filename" : "Icon20x20@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "Icon29x29@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "Icon29x29@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "Icon40x40@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "Icon40x40@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "Icon60x60@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "Icon60x60@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "20x20",
      "idiom" : "ipad",
      "filename" : "Icon20x20@1x.png",
      "scale" : "1x"
    },
    {
      "size" : "20x20",
      "idiom" : "ipad",
      "filename" : "Icon20x20@2x-1.png",
      "scale" : "2x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "Icon29x29@1x.png",
      "scale" : "1x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "Icon29x29@2x-1.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "Icon40x40@1x.png",
      "scale" : "1x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "Icon40x40@2x-1.png",
      "scale" : "2x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "Icon76x76@1x.png",
      "scale" : "1x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "Icon76x76@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "83.5x83.5",
      "idiom" : "ipad",
      "filename" : "Icon83.5x83.5@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "1024x1024",
      "idiom" : "ios-marketing",
      "filename" : "App Store.png",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: app/Assets.xcassets/Checkbox.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "checkbox.pdf"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  },
  "properties" : {
    "template-rendering-intent" : "template",
    "preserves-vector-representation" : true
  }
}

================================================
FILE: app/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: app/Assets.xcassets/Hide Keyboard.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "Hide Keyboard.pdf"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  },
  "properties" : {
    "template-rendering-intent" : "template"
  }
}

================================================
FILE: app/Assets.xcassets/Paste.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "Paste.pdf"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  },
  "properties" : {
    "template-rendering-intent" : "template"
  }
}

================================================
FILE: app/Assets.xcassets/Saddam Hussein.imageset/Contents.json
================================================
{
  "images" : [
    {
      "filename" : "satanusen.png",
      "idiom" : "universal"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: app/Assets.xcassets/X.imageset/Contents.json
================================================
{
  "images" : [
    {
      "filename" : "xmark.circle.fill.regular.large.pdf",
      "idiom" : "universal"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  },
  "properties" : {
    "preserves-vector-representation" : true,
    "template-rendering-intent" : "template"
  }
}


================================================
FILE: app/BarButton.h
================================================
//
//  AccessoryButton.h
//  iSH
//
//  Created by Theodore Dubois on 9/22/18.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface BarButton : UIButton

@property (nonatomic) UIKeyboardAppearance keyAppearance;
@property IBInspectable BOOL secondary;
@property IBInspectable BOOL toggleable;

@end

NS_ASSUME_NONNULL_END


================================================
FILE: app/BarButton.m
================================================
//
//  AccessoryButton.m
//  iSH
//
//  Created by Theodore Dubois on 9/22/18.
//

#import "BarButton.h"

@interface BarButton ()
@end

extern UIAccessibilityTraits UIAccessibilityTraitToggle;

@implementation BarButton

- (void)awakeFromNib {
    [super awakeFromNib];
    self.layer.cornerRadius = 5;
    self.layer.shadowOffset = CGSizeMake(0, 1);
    self.layer.shadowOpacity = 0.4;
    self.layer.shadowRadius = 0;
    self.backgroundColor = self.defaultColor;
    self.keyAppearance = UIKeyboardAppearanceLight;
    self.accessibilityTraits |= UIAccessibilityTraitKeyboardKey;
    if (self.toggleable) {
        self.accessibilityTraits |= 0x20000000000000;
    }
}

- (UIColor *)primaryColor {
    if (self.keyAppearance == UIKeyboardAppearanceLight)
        return UIColor.whiteColor;
    else
        return [UIColor colorWithRed:1 green:1 blue:1 alpha:77/255.];
}
- (UIColor *)secondaryColor {
    if (self.keyAppearance == UIKeyboardAppearanceLight)
        return [UIColor colorWithRed:172/255. green:180/255. blue:190/255. alpha:1];
    else
        return [UIColor colorWithRed:147/255. green:147/255. blue:147/255. alpha:66/255.];
}
- (UIColor *)defaultColor {
    if (self.secondary)
        return self.secondaryColor;
    return self.primaryColor;
}
- (UIColor *)highlightedColor {
    if (!self.secondary)
        return self.secondaryColor;
    return self.primaryColor;
}

- (void)chooseBackground {
    if (self.selected || self.highlighted) {
        self.backgroundColor = self.highlightedColor;
    } else {
        [UIView animateWithDuration:0 delay:0.1 options:UIViewAnimationOptionAllowUserInteraction animations:^{
            self.backgroundColor = self.defaultColor;
        } completion:nil];
    }
    if (self.keyAppearance == UIKeyboardAppearanceLight) {
        self.tintColor = UIColor.blackColor;
    } else {
        self.tintColor = UIColor.whiteColor;
    }
    [self setTitleColor:self.tintColor forState:UIControlStateNormal];
}

- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    [self chooseBackground];
}
- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    [self chooseBackground];
}

- (void)setKeyAppearance:(UIKeyboardAppearance)keyAppearance {
    _keyAppearance = keyAppearance;
    [self chooseBackground];
}

- (NSString *)accessibilityValue {
    if (self.toggleable) {
        return self.selected ? @"1" : @"0";
    }
    return nil;
}

@end


================================================
FILE: app/Base.lproj/About.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="0yy-Uo-cZb">
    <device id="retina4_0" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="collection view cell content view" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--Settings-->
        <scene sceneID="gzB-oj-TRf">
            <objects>
                <tableViewController id="yJz-O7-jlW" customClass="AboutViewController" sceneMemberID="viewController">
                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="fxP-eK-TyP">
                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
                        <view key="tableFooterView" contentMode="scaleToFill" id="vHu-FA-YnK">
                            <rect key="frame" x="0.0" y="856.5" width="320" height="44"/>
                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                            <subviews>
                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="iSH unknown (Build unknown)" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Xil-tm-WGD" userLabel="versionLabel">
                                    <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
                                    <color key="textColor" systemColor="secondaryLabelColor"/>
                                    <nil key="highlightedColor"/>
                                </label>
                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Saddam Hussein" translatesAutoresizingMaskIntoConstraints="NO" id="7wB-HV-c14">
                                    <rect key="frame" x="233" y="44" width="79" height="17"/>
                                    <constraints>
                                        <constraint firstAttribute="width" constant="79" id="pby-mm-KlE"/>
                                        <constraint firstAttribute="height" constant="17" id="qax-kw-1lB"/>
                                    </constraints>
                                </imageView>
                            </subviews>
                            <constraints>
                                <constraint firstItem="7wB-HV-c14" firstAttribute="top" secondItem="vHu-FA-YnK" secondAttribute="bottom" id="bcR-YQ-PkC"/>
                                <constraint firstAttribute="trailing" secondItem="7wB-HV-c14" secondAttribute="trailing" constant="8" id="f9L-RV-ToU"/>
                            </constraints>
                        </view>
                        <sections>
                            <tableViewSection footerTitle="When this option is enabled, the screen will not dim when iSH is in the foreground." id="tuR-Og-SE8">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="1Co-nG-Sij" style="IBUITableViewCellStyleDefault" id="dqn-Cd-cNm" userLabel="Theme">
                                        <rect key="frame" x="0.0" y="18" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="dqn-Cd-cNm" id="i9s-qj-CxN">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Appearance" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="1Co-nG-Sij">
                                                    <rect key="frame" x="16" y="0.0" width="269.5" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                        <connections>
                                            <segue destination="ItN-wa-djf" kind="show" id="Kbq-17-aS2"/>
                                        </connections>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="xvW-ah-hsy" style="IBUITableViewCellStyleDefault" id="31N-0g-RhF" userLabel="External Keyboard">
                                        <rect key="frame" x="0.0" y="61.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="31N-0g-RhF" id="VWO-ke-dtY">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="External Keyboard" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="xvW-ah-hsy">
                                                    <rect key="frame" x="16" y="0.0" width="269.5" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                        <connections>
                                            <segue destination="Zzy-IN-laJ" kind="show" id="3W3-8y-gVF"/>
                                        </connections>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="6Qv-kp-ISr" style="IBUITableViewCellStyleDefault" id="LVQ-SX-dAA" userLabel="Caps Lock">
                                        <rect key="frame" x="0.0" y="105" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="LVQ-SX-dAA" id="plU-fp-Ybd">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="App Icon" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="6Qv-kp-ISr">
                                                    <rect key="frame" x="16" y="0.0" width="269.5" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                        <connections>
                                            <segue destination="cfv-rk-mN1" kind="show" id="0jv-rd-adN"/>
                                        </connections>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="3CC-Gj-X6f" userLabel="Disable Dimming">
                                        <rect key="frame" x="0.0" y="148.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="3CC-Gj-X6f" id="6Sy-Y9-UdH">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Keep Screen Turned On" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Iov-xn-a0L">
                                                    <rect key="frame" x="16" y="11.5" width="181" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cPj-sQ-qsh">
                                                    <rect key="frame" x="255" y="6.5" width="51" height="31"/>
                                                    <connections>
                                                        <action selector="disableDimmingChanged:" destination="yJz-O7-jlW" eventType="valueChanged" id="usF-cn-Kbp"/>
                                                    </connections>
                                                </switch>
                                            </subviews>
                                            <constraints>
                                                <constraint firstItem="cPj-sQ-qsh" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Iov-xn-a0L" secondAttribute="trailing" constant="8" symbolic="YES" id="9uc-hi-DmQ"/>
                                                <constraint firstItem="Iov-xn-a0L" firstAttribute="leading" secondItem="6Sy-Y9-UdH" secondAttribute="leadingMargin" id="aLB-ta-oqS"/>
                                                <constraint firstItem="cPj-sQ-qsh" firstAttribute="centerY" secondItem="6Sy-Y9-UdH" secondAttribute="centerY" id="eCa-AP-AqQ"/>
                                                <constraint firstAttribute="trailingMargin" secondItem="cPj-sQ-qsh" secondAttribute="trailing" id="jaj-Bb-Tg1"/>
                                                <constraint firstItem="Iov-xn-a0L" firstAttribute="centerY" secondItem="6Sy-Y9-UdH" secondAttribute="centerY" id="sI8-H8-9M6"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                            <tableViewSection id="u3N-3a-97w">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="dVs-7k-zeJ" style="IBUITableViewCellStyleDefault" id="HHU-Ju-BtM">
                                        <rect key="frame" x="0.0" y="256" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="HHU-Ju-BtM" id="CqF-qp-HgQ">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Filesystems" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="dVs-7k-zeJ">
                                                    <rect key="frame" x="16" y="0.0" width="269.5" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                        <connections>
                                            <segue destination="gsu-Hv-LDC" kind="show" id="tif-za-oNY"/>
                                        </connections>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" id="Huf-xT-ejJ">
                                        <rect key="frame" x="0.0" y="299.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Huf-xT-ejJ" id="44W-gn-26V">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Upgrade Repositories" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="L09-wA-jCg">
                                                    <rect key="frame" x="16" y="11.5" width="165" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="l5o-Y7-j4W">
                                                    <rect key="frame" x="275.5" y="17" width="10" height="10"/>
                                                    <color key="backgroundColor" systemColor="systemRedColor"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="10" id="28W-HE-QpJ"/>
                                                        <constraint firstAttribute="width" constant="10" id="iaA-gZ-0Pn"/>
                                                    </constraints>
                                                    <userDefinedRuntimeAttributes>
                                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
                                                            <integer key="value" value="5"/>
                                                        </userDefinedRuntimeAttribute>
                                                    </userDefinedRuntimeAttributes>
                                                </view>
                                            </subviews>
                                            <constraints>
                                                <constraint firstItem="L09-wA-jCg" firstAttribute="centerY" secondItem="44W-gn-26V" secondAttribute="centerY" id="4He-R9-ToQ"/>
                                                <constraint firstAttribute="trailingMargin" secondItem="l5o-Y7-j4W" secondAttribute="trailing" id="8b0-UB-r6d"/>
                                                <constraint firstItem="L09-wA-jCg" firstAttribute="leading" secondItem="44W-gn-26V" secondAttribute="leadingMargin" id="l0q-Rr-W6r"/>
                                                <constraint firstItem="l5o-Y7-j4W" firstAttribute="centerY" secondItem="44W-gn-26V" secondAttribute="centerY" id="ppV-Dx-99y"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                        <connections>
                                            <segue destination="9eV-Jd-Xng" kind="show" id="R7o-uj-fFN"/>
                                        </connections>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                            <tableViewSection footerTitle="" id="DVR-sH-TdL">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="g6W-FX-yYa" style="IBUITableViewCellStyleDefault" id="gMm-4C-5X3">
                                        <rect key="frame" x="0.0" y="379" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="gMm-4C-5X3" id="mVT-2h-5kM">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Send Feedback" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="g6W-FX-yYa">
                                                    <rect key="frame" x="16" y="0.0" width="269.5" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="Fe5-tr-fWm" style="IBUITableViewCellStyleDefault" id="F4i-eC-hQ6">
                                        <rect key="frame" x="0.0" y="422.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="F4i-eC-hQ6" id="gU6-0E-hOf">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="iSH on GitHub" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Fe5-tr-fWm">
                                                    <rect key="frame" x="16" y="0.0" width="269.5" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="xMw-wC-igF" style="IBUITableViewCellStyleDefault" id="K5r-jy-Dzl">
                                        <rect key="frame" x="0.0" y="466" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="K5r-jy-Dzl" id="UIr-IB-yu1">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="iSH Discord Server" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="xMw-wC-igF">
                                                    <rect key="frame" x="16" y="0.0" width="269.5" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="wyO-AY-ccm" style="IBUITableViewCellStyleDefault" id="bge-GA-6p8">
                                        <rect key="frame" x="0.0" y="509.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="bge-GA-6p8" id="JXA-Ff-hkB">
                                            <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="iSH on the Fediverse" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="wyO-AY-ccm">
                                                    <rect key="frame" x="16" y="0.0" width="269.5" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                            <tableViewSection headerTitle="Secret Advanced Debugging Options" footerTitle="Warning: Changing these can break everything! If that happens, there's a reset switch in the Settings app." id="d0T-DL-SuP">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="RKb-ed-FOs" userLabel="Init Command">
                                        <rect key="frame" x="0.0" y="620.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="RKb-ed-FOs" id="I4F-81-mWS">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" horizontalHuggingPriority="1000" insetsLayoutMarginsFromSafeArea="NO" text="Launch cmd" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="G8D-8d-aOp">
                                                    <rect key="frame" x="16" y="11.5" width="94" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="/bin/login -f root" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="gDx-hv-hhV">
                                                    <rect key="frame" x="122" y="13" width="182" height="18"/>
                                                    <fontDescription key="fontDescription" name="Menlo-Regular" family="Menlo" pointSize="14"/>
                                                    <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="alphabet" returnKeyType="done" smartDashesType="no" smartInsertDeleteType="no" smartQuotesType="no"/>
                                                    <connections>
                                                        <action selector="launchCommandChanged:" destination="yJz-O7-jlW" eventType="editingDidEnd" id="y9m-tQ-j9F"/>
                                                        <action selector="textBoxSubmit:" destination="yJz-O7-jlW" eventType="primaryActionTriggered" id="Dyo-E6-Kdv"/>
                                                    </connections>
                                                </textField>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="trailingMargin" secondItem="gDx-hv-hhV" secondAttribute="trailing" id="D9N-xY-fFU"/>
                                                <constraint firstItem="gDx-hv-hhV" firstAttribute="centerY" secondItem="I4F-81-mWS" secondAttribute="centerY" id="cX0-Gk-kRS"/>
                                                <constraint firstItem="G8D-8d-aOp" firstAttribute="leading" secondItem="I4F-81-mWS" secondAttribute="leadingMargin" id="fgO-5O-vR0"/>
                                                <constraint firstItem="gDx-hv-hhV" firstAttribute="leading" secondItem="G8D-8d-aOp" secondAttribute="trailing" constant="12" id="hBx-u1-IKQ"/>
                                                <constraint firstItem="G8D-8d-aOp" firstAttribute="centerY" secondItem="I4F-81-mWS" secondAttribute="centerY" id="uj3-2p-3Sp"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="Xc7-9V-RXm" userLabel="Boot Command">
                                        <rect key="frame" x="0.0" y="664" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Xc7-9V-RXm" id="IEt-PC-8fZ">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" horizontalHuggingPriority="1000" insetsLayoutMarginsFromSafeArea="NO" text="Boot cmd" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ivg-bB-NKL">
                                                    <rect key="frame" x="16" y="11.5" width="74" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="/bin/login -f root" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="bKw-tV-nX1">
                                                    <rect key="frame" x="102" y="13" width="202" height="18"/>
                                                    <fontDescription key="fontDescription" name="Menlo-Regular" family="Menlo" pointSize="14"/>
                                                    <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="alphabet" returnKeyType="done" smartDashesType="no" smartInsertDeleteType="no" smartQuotesType="no"/>
                                                    <connections>
                                                        <action selector="bootCommandChanged:" destination="yJz-O7-jlW" eventType="editingDidEnd" id="ejb-CC-17T"/>
                                                        <action selector="textBoxSubmit:" destination="yJz-O7-jlW" eventType="primaryActionTriggered" id="yMs-ke-b76"/>
                                                    </connections>
                                                </textField>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="trailingMargin" secondItem="bKw-tV-nX1" secondAttribute="trailing" id="CvM-TM-j0U"/>
                                                <constraint firstItem="Ivg-bB-NKL" firstAttribute="centerY" secondItem="IEt-PC-8fZ" secondAttribute="centerY" id="Exg-3t-5dt"/>
                                                <constraint firstItem="Ivg-bB-NKL" firstAttribute="leading" secondItem="IEt-PC-8fZ" secondAttribute="leadingMargin" id="Qck-mT-DsJ"/>
                                                <constraint firstItem="bKw-tV-nX1" firstAttribute="centerY" secondItem="IEt-PC-8fZ" secondAttribute="centerY" id="RgS-ZD-0gA"/>
                                                <constraint firstItem="bKw-tV-nX1" firstAttribute="leading" secondItem="Ivg-bB-NKL" secondAttribute="trailing" constant="12" id="o1M-2S-D93"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="blue" indentationWidth="10" textLabel="83j-2z-XRR" style="IBUITableViewCellStyleDefault" id="OIE-9g-Btx" userLabel="Export">
                                        <rect key="frame" x="0.0" y="707.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="OIE-9g-Btx" id="uY3-tT-dwz">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Export container" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="83j-2z-XRR">
                                                    <rect key="frame" x="8" y="0.0" width="304" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="blue" indentationWidth="10" textLabel="Ozh-OX-eF1" style="IBUITableViewCellStyleDefault" id="Bqt-ud-CI0" userLabel="Reset mounts">
                                        <rect key="frame" x="0.0" y="751" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Bqt-ud-CI0" id="K2f-8z-let">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Reset ios mounts" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Ozh-OX-eF1">
                                                    <rect key="frame" x="8" y="0.0" width="304" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                        </sections>
                        <connections>
                            <outlet property="dataSource" destination="yJz-O7-jlW" id="UX1-BB-BA1"/>
                            <outlet property="delegate" destination="yJz-O7-jlW" id="sDs-T2-0bL"/>
                        </connections>
                    </tableView>
                    <navigationItem key="navigationItem" title="Settings" id="bpe-0g-cWF">
                        <barButtonItem key="rightBarButtonItem" style="done" systemItem="done" id="vOn-qw-XSp">
                            <connections>
                                <action selector="dismiss:" destination="yJz-O7-jlW" id="q2h-Xl-XBU"/>
                            </connections>
                        </barButtonItem>
                    </navigationItem>
                    <connections>
                        <outlet property="bootCommandField" destination="bKw-tV-nX1" id="MVz-gk-QE7"/>
                        <outlet property="capsLockMappingCell" destination="31N-0g-RhF" id="UjF-21-3df"/>
                        <outlet property="disableDimmingSwitch" destination="cPj-sQ-qsh" id="Kjp-xA-A0Y"/>
                        <outlet property="exportContainerCell" destination="OIE-9g-Btx" id="qxo-l5-0Mq"/>
                        <outlet property="launchCommandField" destination="gDx-hv-hhV" id="RQn-gk-Dx8"/>
                        <outlet property="openDiscord" destination="K5r-jy-Dzl" id="b4l-Vr-6l8"/>
                        <outlet property="openFediverse" destination="bge-GA-6p8" id="ghM-X8-itm"/>
                        <outlet property="openGithub" destination="F4i-eC-hQ6" id="66M-sQ-RJR"/>
                        <outlet property="resetMountsCell" destination="Bqt-ud-CI0" id="2AS-2S-XCr"/>
                        <outlet property="saddamHussein" destination="bcR-YQ-PkC" id="mUA-6I-CB9"/>
                        <outlet property="sendFeedback" destination="gMm-4C-5X3" id="nhX-ZH-zyP"/>
                        <outlet property="themeCell" destination="dqn-Cd-cNm" id="dfh-et-0o7"/>
                        <outlet property="upgradeApkBadge" destination="l5o-Y7-j4W" id="AI2-IM-NVw"/>
                        <outlet property="upgradeApkCell" destination="Huf-xT-ejJ" id="CBX-wc-11e"/>
                        <outlet property="upgradeApkLabel" destination="L09-wA-jCg" id="wMj-ht-DsI"/>
                        <outlet property="versionLabel" destination="Xil-tm-WGD" id="ZzC-E6-VER"/>
                    </connections>
                </tableViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="OPJ-Ps-ATb" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="243.75" y="157.3943661971831"/>
        </scene>
        <!--External Keyboard-->
        <scene sceneID="VbH-40-Znm">
            <objects>
                <tableViewController title="External Keyboard" id="Zzy-IN-laJ" customClass="AboutExternalKeyboardViewController" sceneMemberID="viewController">
                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="ZlS-Ig-a8Z">
                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
                        <sections>
                            <tableViewSection headerTitle="Map Caps Lock" id="oTd-4i-TSa">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" tag="1" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="zuo-ZW-n37" style="IBUITableViewCellStyleDefault" id="8ZS-Wp-1TX">
                                        <rect key="frame" x="0.0" y="55.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="8ZS-Wp-1TX" id="GMp-XT-GYq">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Control" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="zuo-ZW-n37">
                                                    <rect key="frame" x="16" y="0.0" width="288" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" tag="2" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="NR7-h5-BZD" style="IBUITableViewCellStyleDefault" id="IMH-6g-rLD">
                                        <rect key="frame" x="0.0" y="99" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="IMH-6g-rLD" id="Qea-lO-LfG">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Escape" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="NR7-h5-BZD">
                                                    <rect key="frame" x="16" y="0.0" width="288" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="CXm-1h-hy1" style="IBUITableViewCellStyleDefault" id="zqH-hq-4Oi">
                                        <rect key="frame" x="0.0" y="142.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="zqH-hq-4Oi" id="Wpu-8A-Fbd">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="None" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="CXm-1h-hy1">
                                                    <rect key="frame" x="16" y="0.0" width="288" height="43.5"/>
                                                    <autoresizingMask key="autoresizingMask"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                            <tableViewSection id="zbj-zP-Xeq">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="cA4-62-G0Z" userLabel="Option to Meta">
                                        <rect key="frame" x="0.0" y="222" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="cA4-62-G0Z" id="ZYe-JS-rbD">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Option → Meta" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qax-I0-tqo">
                                                    <rect key="frame" x="16" y="11.5" width="114" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OEG-YY-LTw">
                                                    <rect key="frame" x="255" y="6.5" width="51" height="31"/>
                                                    <connections>
                                                        <action selector="optionMetaToggle:" destination="Zzy-IN-laJ" eventType="valueChanged" id="HgW-4j-jIU"/>
                                                    </connections>
                                                </switch>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="trailingMargin" secondItem="OEG-YY-LTw" secondAttribute="trailing" id="Gs0-yB-zcq"/>
                                                <constraint firstItem="OEG-YY-LTw" firstAttribute="centerY" secondItem="ZYe-JS-rbD" secondAttribute="centerY" id="MSx-We-wjF"/>
                                                <constraint firstItem="qax-I0-tqo" firstAttribute="centerY" secondItem="ZYe-JS-rbD" secondAttribute="centerY" id="dct-90-ZT3"/>
                                                <constraint firstItem="OEG-YY-LTw" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="qax-I0-tqo" secondAttribute="trailing" constant="8" symbolic="YES" id="hQM-OL-TER"/>
                                                <constraint firstItem="qax-I0-tqo" firstAttribute="leading" secondItem="ZYe-JS-rbD" secondAttribute="leadingMargin" id="rrF-nN-OZe"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="NQy-68-Suu" userLabel="Backtick to Escape">
                                        <rect key="frame" x="0.0" y="265.5" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="NQy-68-Suu" id="9xb-BP-fQ4">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Backtick → Escape" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zWx-Iz-vdm">
                                                    <rect key="frame" x="16" y="11.5" width="144.5" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8xc-Rx-eue">
                                                    <rect key="frame" x="255" y="6.5" width="51" height="31"/>
                                                    <connections>
                                                        <action selector="backtickEscapeToggle:" destination="Zzy-IN-laJ" eventType="valueChanged" id="p9Y-6t-nCW"/>
                                                    </connections>
                                                </switch>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="trailingMargin" secondItem="8xc-Rx-eue" secondAttribute="trailing" id="eUW-U2-ocF"/>
                                                <constraint firstItem="zWx-Iz-vdm" firstAttribute="centerY" secondItem="9xb-BP-fQ4" secondAttribute="centerY" id="rCn-c3-wFO"/>
                                                <constraint firstItem="8xc-Rx-eue" firstAttribute="centerY" secondItem="9xb-BP-fQ4" secondAttribute="centerY" id="rsO-uq-LfO"/>
                                                <constraint firstItem="zWx-Iz-vdm" firstAttribute="leading" secondItem="9xb-BP-fQ4" secondAttribute="leadingMargin" id="rzg-p7-z1r"/>
                                                <constraint firstItem="8xc-Rx-eue" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="zWx-Iz-vdm" secondAttribute="trailing" constant="8" symbolic="YES" id="vLw-yG-Xlc"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                            <tableViewSection footerTitle="If this is off, ctrl-space switches keyboard layouts." id="Ucf-cb-qkd">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="9gO-wR-cmz" userLabel="Backtick to Escape">
                                        <rect key="frame" x="0.0" y="345" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="9gO-wR-cmz" id="v3f-Ht-Vrg">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Send ctrl-space to terminal" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KvX-Y2-vlm">
                                                    <rect key="frame" x="16" y="11.5" width="207.5" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="554-OF-h41">
                                                    <rect key="frame" x="255" y="6.5" width="51" height="31"/>
                                                    <connections>
                                                        <action selector="overrideControlSpaceToggle:" destination="Zzy-IN-laJ" eventType="valueChanged" id="IxB-9q-539"/>
                                                    </connections>
                                                </switch>
                                            </subviews>
                                            <constraints>
                                                <constraint firstItem="KvX-Y2-vlm" firstAttribute="leading" secondItem="v3f-Ht-Vrg" secondAttribute="leadingMargin" id="O30-Pm-qhg"/>
                                                <constraint firstItem="554-OF-h41" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="KvX-Y2-vlm" secondAttribute="trailing" constant="8" symbolic="YES" id="WXv-yr-I8K"/>
                                                <constraint firstAttribute="trailingMargin" secondItem="554-OF-h41" secondAttribute="trailing" id="fXw-Jh-WJU"/>
                                                <constraint firstItem="KvX-Y2-vlm" firstAttribute="centerY" secondItem="v3f-Ht-Vrg" secondAttribute="centerY" id="nMZ-KF-V5c"/>
                                                <constraint firstItem="554-OF-h41" firstAttribute="centerY" secondItem="v3f-Ht-Vrg" secondAttribute="centerY" id="ud3-BX-Rdt"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                            <tableViewSection headerTitle="Extra keys" footerTitle="When extra keys are hidden, Settings can be opened with the ⌘, shortcut" id="Kaj-9x-pfF">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="TM9-T2-EDa" userLabel="Backtick to Escape">
                                        <rect key="frame" x="0.0" y="480" width="320" height="43.5"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="TM9-T2-EDa" id="K8q-us-D80">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Hide with external keyboard" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PWB-d9-Zhd">
                                                    <rect key="frame" x="16" y="11.5" width="212" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="IcN-9M-x1K">
                                                    <rect key="frame" x="255" y="6.5" width="51" height="31"/>
                                                    <connections>
                                                        <action selector="hideExtraKeysToggle:" destination="Zzy-IN-laJ" eventType="valueChanged" id="kQA-Pi-MZM"/>
                                                    </connections>
                                                </switch>
                                            </subviews>
                                            <constraints>
                                                <constraint firstItem="PWB-d9-Zhd" firstAttribute="leading" secondItem="K8q-us-D80" secondAttribute="leadingMargin" id="FGk-hn-hnq"/>
                                                <constraint firstItem="PWB-d9-Zhd" firstAttribute="centerY" secondItem="K8q-us-D80" secondAttribute="centerY" id="I9n-5H-Jr4"/>
                                                <constraint firstAttribute="trailingMargin" secondItem="IcN-9M-x1K" secondAttribute="trailing" id="fig-KE-i9e"/>
                                                <constraint firstItem="IcN-9M-x1K" firstAttribute="centerY" secondItem="K8q-us-D80" secondAttribute="centerY" id="wZF-ty-HqH"/>
                                                <constraint firstItem="IcN-9M-x1K" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="PWB-d9-Zhd" secondAttribute="trailing" constant="8" symbolic="YES" id="xr3-MR-x1Q"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                        </sections>
                        <connections>
                            <outlet property="dataSource" destination="Zzy-IN-laJ" id="NPA-6F-jMj"/>
                            <outlet property="delegate" destination="Zzy-IN-laJ" id="g26-vd-TC5"/>
                        </connections>
                    </tableView>
                    <navigationItem key="navigationItem" title="External Keyboard" id="s64-vm-Jln"/>
                    <connections>
                        <outlet property="backtickEscapeSwitch" destination="8xc-Rx-eue" id="jkl-oc-V9N"/>
                        <outlet property="hideExtraKeysWithExternalKeyboardSwitch" destination="IcN-9M-x1K" id="Lw3-4l-9R6"/>
                        <outlet property="optionMetaSwitch" destination="OEG-YY-LTw" id="b2K-Ug-Jij"/>
                        <outlet property="overrideControlSpaceSwitch" destination="554-OF-h41" id="js8-8D-1Ua"/>
                    </connections>
                </tableViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="XlH-jX-0dL" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="1057.5" y="429.92957746478874"/>
        </scene>
        <!--App Icon-->
        <scene sceneID="jc8-Gv-xpK">
            <objects>
                <viewController title="App Icon" id="cfv-rk-mN1" customClass="AltIconViewController" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="bZC-Ac-YDX">
                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="wGQ-0K-Rcg">
                                <rect key="frame" x="0.0" y="64" width="320" height="504"/>
                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                <collectionViewFlowLayout key="collectionViewLayout" automaticEstimatedItemSize="YES" minimumLineSpacing="20" minimumInteritemSpacing="0.0" id="zz1-Bs-CFW">
                                    <size key="itemSize" width="120" height="120"/>
                                    <size key="headerReferenceSize" width="0.0" height="0.0"/>
                                    <size key="footerReferenceSize" width="50" height="50"/>
                                    <inset key="sectionInset" minX="30" minY="30" maxX="30" maxY="30"/>
                                    <userDefinedRuntimeAttributes>
                                        <userDefinedRuntimeAttribute type="boolean" keyPath="sectionFootersPinToVisibleBounds" value="NO"/>
                                    </userDefinedRuntimeAttributes>
                                </collectionViewFlowLayout>
                                <cells>
                                    <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="icon" id="S3m-Be-XtT" customClass="AltIconCell">
                                        <rect key="frame" x="30" y="30" width="120" height="147"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                                        <collectionViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="IWa-a1-skf">
                                            <rect key="frame" x="0.0" y="0.0" width="120" height="147"/>
                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                            <subviews>
                                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon.png" translatesAutoresizingMaskIntoConstraints="NO" id="9aw-Kk-k95">
                                                    <rect key="frame" x="0.0" y="0.0" width="120" height="120"/>
                                                    <constraints>
                                                        <constraint firstAttribute="width" constant="120" id="2sn-wy-ZoN"/>
                                                        <constraint firstAttribute="height" constant="120" id="Zde-qc-BM8"/>
                                                    </constraints>
                                                </imageView>
                                                <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Checkbox" translatesAutoresizingMaskIntoConstraints="NO" id="cAC-0O-uY6">
                                                    <rect key="frame" x="74" y="74" width="38" height="38"/>
                                                    <constraints>
                                                        <constraint firstAttribute="width" constant="38" id="WO8-mB-47S"/>
                                                        <constraint firstAttribute="height" constant="38" id="fG2-qK-0uJ"/>
                                                    </constraints>
                                                </imageView>
                                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WNa-qg-ZN5">
                                                    <rect key="frame" x="0.0" y="120" width="120" height="27"/>
                                                    <fontDescription key="fontDescription" style="UICTFontTextStyleCaption1"/>
                                                    <state key="normal" title="by @author"/>
                                                    <connections>
                                                        <action selector="openSource:" destination="S3m-Be-XtT" eventType="primaryActionTriggered" id="YSV-x5-8bZ"/>
                                                    </connections>
                                                </button>
                                            </subviews>
                                            <constraints>
                                                <constraint firstItem="9aw-Kk-k95" firstAttribute="bottom" secondItem="cAC-0O-uY6" secondAttribute="bottom" constant="8" id="1Nx-lw-WeM"/>
                                                <constraint firstAttribute="trailing" secondItem="WNa-qg-ZN5" secondAttribute="trailing" id="1QP-qJ-bqg"/>
                                                <constraint firstItem="9aw-Kk-k95" firstAttribute="top" secondItem="IWa-a1-skf" secondAttribute="top" id="79p-Wm-2JF"/>
                                                <constraint firstItem="9aw-Kk-k95" firstAttribute="leading" secondItem="IWa-a1-skf" secondAttribute="leading" id="aFx-qK-TC2"/>
                                                <constraint firstAttribute="bottom" secondItem="WNa-qg-ZN5" secondAttribute="bottom" id="aGh-9T-AGA"/>
                                                <constraint firstItem="WNa-qg-ZN5" firstAttribute="leading" secondItem="IWa-a1-skf" secondAttribute="leading" id="cdk-fK-xdr"/>
                                                <constraint firstAttribute="trailing" secondItem="9aw-Kk-k95" secondAttribute="trailing" id="jeT-pz-ZFy"/>
                                                <constraint firstAttribute="trailing" secondItem="cAC-0O-uY6" secondAttribute="trailing" constant="8" id="l0V-Kb-Ul1"/>
                                                <constraint firstItem="WNa-qg-ZN5" firstAttribute="top" secondItem="9aw-Kk-k95" secondAttribute="bottom" id="oF2-JH-EmI"/>
                                            </constraints>
                                        </collectionViewCellContentView>
                                        <connections>
                                            <outlet property="authorButton" destination="WNa-qg-ZN5" id="3mb-95-R06"/>
                                            <outlet property="checkboxImageView" destination="cAC-0O-uY6" id="9Jd-uf-T9P"/>
                                            <outlet property="imageView" destination="9aw-Kk-k95" id="tW1-tN-k8G"/>
                                        </connections>
                                    </collectionViewCell>
                                </cells>
                                <collectionReusableView key="sectionFooterView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" reuseIdentifier="footer" id="lNw-1e-UqP">
                                    <rect key="frame" x="0.0" y="207" width="320" height="50"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="L98-Nf-4Wv">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="50"/>
                                            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="qL6-vf-qc3">
                                                <rect key="frame" x="0.0" y="0.0" width="320" height="50"/>
                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                                <subviews>
                                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="E9e-hb-zQw">
                                                        <rect key="frame" x="0.0" y="0.0" width="320" height="50"/>
                                                        <state key="normal" title="Submit your own icon!"/>
                                                        <connections>
                                                            <action selector="openSubmissions:" destination="cfv-rk-mN1" eventType="primaryActionTriggered" id="d9r-k6-6Vz"/>
                                                        </connections>
                                                    </button>
                                                </subviews>
                                                <constraints>
                                                    <constraint firstItem="E9e-hb-zQw" firstAttribute="leading" secondItem="qL6-vf-qc3" secondAttribute="leading" id="07g-r1-yQe"/>
                                                    <constraint firstAttribute="bottom" secondItem="E9e-hb-zQw" secondAttribute="bottom" id="1Nw-tH-oGL"/>
                                                    <constraint firstAttribute="trailing" secondItem="E9e-hb-zQw" secondAttribute="trailing" id="Mr4-0C-09T"/>
                                                    <constraint firstItem="E9e-hb-zQw" firstAttribute="top" secondItem="qL6-vf-qc3" secondAttribute="top" id="wcu-3V-6BT"/>
                                                </constraints>
                                            </view>
                                            <blurEffect style="regular"/>
                                        </visualEffectView>
                                    </subviews>
                                    <constraints>
                                        <constraint firstItem="L98-Nf-4Wv" firstAttribute="leading" secondItem="lNw-1e-UqP" secondAttribute="leading" id="6Rs-ht-afI"/>
                                        <constraint firstAttribute="trailing" secondItem="L98-Nf-4Wv" secondAttribute="trailing" id="F9n-YU-6bs"/>
                                        <constraint firstItem="L98-Nf-4Wv" firstAttribute="top" secondItem="lNw-1e-UqP" secondAttribute="top" id="b2D-gK-294"/>
                                        <constraint firstAttribute="bottom" secondItem="L98-Nf-4Wv" secondAttribute="bottom" id="yy8-dN-Lqd"/>
                                    </constraints>
                                </collectionReusableView>
                                <connections>
                                    <outlet property="dataSource" destination="cfv-rk-mN1" id="Ejj-y8-k4C"/>
                                    <outlet property="delegate" destination="cfv-rk-mN1" id="LaN-3H-ht3"/>
                                </connections>
                            </collectionView>
                        </subviews>
                        <viewLayoutGuide key="safeArea" id="G6v-G0-r5a"/>
                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                        <constraints>
                            <constraint firstItem="wGQ-0K-Rcg" firstAttribute="top" secondItem="G6v-G0-r5a" secondAttribute="top" id="ECg-8n-6xl"/>
                            <constraint firstItem="wGQ-0K-Rcg" firstAttribute="trailing" secondItem="G6v-G0-r5a" secondAttribute="trailing" id="JXu-0v-zd6"/>
                            <constraint firstItem="wGQ-0K-Rcg" firstAttribute="leading" secondItem="G6v-G0-r5a" secondAttribute="leading" id="o7s-il-U4s"/>
                            <constraint firstAttribute="bottom" secondItem="wGQ-0K-Rcg" secondAttribute="bottom" id="pTK-0F-HyJ"/>
                        </constraints>
                    </view>
                    <navigationItem key="navigationItem" title="App Icon" id="5QX-R3-V8P"/>
                    <connections>
                        <outlet property="collectionView" destination="wGQ-0K-Rcg" id="GJB-nY-8gE"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="wE1-cE-kl7" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="1057.5" y="1132.3943661971832"/>
        </scene>
        <!--Upgrade-->
        <scene sceneID="D8q-Fv-Sfr">
            <objects>
                <viewController title="Upgrade" id="9eV-Jd-Xng" customClass="UpgradeRootViewController" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="GV8-4O-0fU">
                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6OQ-mF-Mur" customClass="TerminalView">
                                <rect key="frame" x="0.0" y="64" width="320" height="504"/>
                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                <userDefinedRuntimeAttributes>
                                    <userDefinedRuntimeAttribute type="boolean" keyPath="canBecomeFirstResponder" value="NO"/>
                                </userDefinedRuntimeAttributes>
                            </view>
                        </subviews>
                        <viewLayoutGuide key="safeArea" id="1GV-qG-uh7"/>
                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                        <constraints>
                            <constraint firstItem="1GV-qG-uh7" firstAttribute="trailing" secondItem="6OQ-mF-Mur" secondAttribute="trailing" id="ZCA-Q1-Odv"/>
                            <constraint firstItem="6OQ-mF-Mur" firstAttribute="leading" secondItem="1GV-qG-uh7" secondAttribute="leading" id="gbg-DM-mLG"/>
                            <constraint firstItem="6OQ-mF-Mur" firstAttribute="top" secondItem="1GV-qG-uh7" secondAttribute="top" id="jGK-vN-hUm"/>
                            <constraint firstItem="1GV-qG-uh7" firstAttribute="bottom" secondItem="6OQ-mF-Mur" secondAttribute="bottom" id="mK6-ba-K1i"/>
                        </constraints>
                    </view>
                    <navigationItem key="navigationItem" title="Upgrade" id="uXA-OB-CN7">
                        <barButtonItem key="rightBarButtonItem" title="Start" style="done" id="R2f-RB-uga">
                            <connections>
                                <action selector="upgrade:" destination="9eV-Jd-Xng" id="LNT-XH-Qvi"/>
                            </connections>
                        </barButtonItem>
                    </navigationItem>
                    <connections>
                        <outlet property="terminalView" destination="6OQ-mF-Mur" id="mGv-Yc-HQL"/>
                        <outlet property="upgradeButton" destination="R2f-RB-uga" id="n2L-Vs-nDF"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="Ncd-Qn-RO3" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="1057.5" y="1810.5633802816901"/>
        </scene>
        <!--Appearance-->
        <scene sceneID="Sh1-9Z-h4V">
            <objects>
                <tableViewController title="Appearance" id="ItN-wa-djf" customClass="AboutAppearanceViewController" sceneMemberID="viewController">
                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="mE8-Gn-C1h">
                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="Preview" id="X0d-0Q-g9Z">
                                <rect key="frame" x="0.0" y="55.5" width="320" height="43.5"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="X0d-0Q-g9Z" id="vGk-di-wEa">
                                    <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <view tag="1" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Hp-uz-xk8" customClass="TerminalView">
                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstAttribute="width" constant="10000" id="cS3-3L-ORC"/>
                                            </constraints>
                                        </view>
                                    </subviews>
                                    <constraints>
                                        <constraint firstItem="8Hp-uz-xk8" firstAttribute="leading" secondItem="vGk-di-wEa" secondAttribute="leading" id="IvO-5q-Ir8"/>
                                        <constraint firstAttribute="trailing" secondItem="8Hp-uz-xk8" secondAttribute="trailing" id="Mi3-jN-uSP"/>
                                        <constraint firstItem="8Hp-uz-xk8" firstAttribute="top" secondItem="vGk-di-wEa" secondAttribute="top" id="ays-3b-poh"/>
                                        <constraint firstAttribute="bottom" secondItem="8Hp-uz-xk8" secondAttribute="bottom" id="xt8-nS-iIx"/>
                                    </constraints>
                                </tableViewCellContentView>
                            </tableViewCell>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="Color Scheme Preview" id="7Dn-Oz-2zq">
                                <rect key="frame" x="0.0" y="99" width="320" height="43.5"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7Dn-Oz-2zq" id="jj6-87-x30">
                                    <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <segmentedControl opaque="NO" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="aLu-k6-NCW">
                                            <rect key="frame" x="20" y="6.5" width="280" height="32"/>
                                            <segments>
                                                <segment title="Light"/>
                                                <segment title="Dark"/>
                                            </segments>
                                        </segmentedControl>
                                    </subviews>
                                    <constraints>
                                        <constraint firstAttribute="trailing" secondItem="aLu-k6-NCW" secondAttribute="trailing" constant="20" symbolic="YES" id="ZsL-av-hVD"/>
                                        <constraint firstItem="aLu-k6-NCW" firstAttribute="centerY" secondItem="jj6-87-x30" secondAttribute="centerY" id="e45-2q-GEK"/>
                                        <constraint firstItem="aLu-k6-NCW" firstAttribute="leading" secondItem="jj6-87-x30" secondAttribute="leading" constant="20" symbolic="YES" id="rgN-F3-Eni"/>
                                    </constraints>
                                </tableViewCellContentView>
                            </tableViewCell>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="Theme Name" textLabel="6jC-28-tzS" detailTextLabel="5o9-8G-nwe" style="IBUITableViewCellStyleValue1" id="4dw-XR-CAv">
                                <rect key="frame" x="0.0" y="142.5" width="320" height="43.5"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="4dw-XR-CAv" id="OG6-NN-pG6">
                                    <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Theme" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="6jC-28-tzS">
                                            <rect key="frame" x="16" y="12" width="53" height="20.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                            <nil key="textColor"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                        <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Default" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5o9-8G-nwe">
                                            <rect key="frame" x="230.5" y="12" width="55" height="20.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                            <color key="textColor" systemColor="secondaryLabelColor"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                    </subviews>
                                </tableViewCellContentView>
                            </tableViewCell>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="Font" textLabel="gtJ-eb-DvQ" detailTextLabel="5wC-O1-dx3" style="IBUITableViewCellStyleValue1" id="qEy-gj-mmp">
                                <rect key="frame" x="0.0" y="186" width="320" height="43.5"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qEy-gj-mmp" id="lIf-2w-14C">
                                    <rect key="frame" x="0.0" y="0.0" width="293.5" height="43.5"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Font" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="gtJ-eb-DvQ">
                                            <rect key="frame" x="16" y="12" width="34.5" height="20.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                            <nil key="textColor"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                        <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Menlo" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5wC-O1-dx3">
                                            <rect key="frame" x="238.5" y="12" width="47" height="20.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                            <color key="textColor" systemColor="secondaryLabelColor"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                    </subviews>
                                </tableViewCellContentView>
                            </tableViewCell>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="Font Size" id="CTf-zd-xjl">
                                <rect key="frame" x="0.0" y="229.5" width="320" height="43.5"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="CTf-zd-xjl" id="udT-7d-Xzj">
                                    <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Font Size" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4j6-te-7NU">
                                            <rect key="frame" x="16" y="11.5" width="71" height="21"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                            <nil key="textColor"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                        <label opaque="NO" multipleTouchEnabled="YES" tag="1" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="12" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fa7-Ao-v3L">
                                            <rect key="frame" x="176" y="11.5" width="18" height="21"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                            <nil key="textColor"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                        <stepper opaque="NO" tag="2" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="1" minimumValue="1" maximumValue="72" translatesAutoresizingMaskIntoConstraints="NO" id="YM7-vq-8vn">
                                            <rect key="frame" x="210" y="6" width="94" height="32"/>
                                            <connections>
                                                <action selector="fontSizeChanged:" destination="ItN-wa-djf" eventType="valueChanged" id="tFw-AQ-SyM"/>
                                            </connections>
                                        </stepper>
                                    </subviews>
                                    <constraints>
                                        <constraint firstItem="YM7-vq-8vn" firstAttribute="leading" secondItem="Fa7-Ao-v3L" secondAttribute="trailing" constant="16" id="1yZ-wH-OqE"/>
                                        <constraint firstItem="YM7-vq-8vn" firstAttribute="centerY" secondItem="udT-7d-Xzj" secondAttribute="centerY" id="AtZ-sJ-V0A"/>
                                        <constraint firstItem="Fa7-Ao-v3L" firstAttribute="centerY" secondItem="udT-7d-Xzj" secondAttribute="centerY" id="JqA-AW-PFg"/>
                                        <constraint firstItem="4j6-te-7NU" firstAttribute="centerY" secondItem="udT-7d-Xzj" secondAttribute="centerY" id="ZUT-zc-ZLF"/>
                                  
Download .txt
gitextract_xua3mraa/

├── .editorconfig
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       ├── autolabel.yml
│       ├── ci.yml
│       ├── deploy-site.yml
│       ├── update-alpine-repo.yml
│       └── upload-build.yml
├── .gitignore
├── .gitmodules
├── Gemfile
├── ISSUE_TEMPLATE.md
├── LICENSE.IOS
├── LICENSE.md
├── README.md
├── README_JP.md
├── README_KO.md
├── README_ZH.md
├── SECURITY.md
├── app/
│   ├── AboutAppearanceViewController.h
│   ├── AboutAppearanceViewController.m
│   ├── AboutExternalKeyboardViewController.h
│   ├── AboutExternalKeyboardViewController.m
│   ├── AboutNavigationController.h
│   ├── AboutNavigationController.m
│   ├── AboutViewController.h
│   ├── AboutViewController.m
│   ├── AccessibilityFixes.m
│   ├── AltIconViewController.h
│   ├── AltIconViewController.m
│   ├── App.xcconfig
│   ├── AppDelegate.h
│   ├── AppDelegate.m
│   ├── AppGroup.h
│   ├── AppGroup.m
│   ├── AppLib.xcconfig
│   ├── ArrowBarButton.h
│   ├── ArrowBarButton.m
│   ├── Assets.xcassets/
│   │   ├── AppIcon.appiconset/
│   │   │   └── Contents.json
│   │   ├── Checkbox.imageset/
│   │   │   └── Contents.json
│   │   ├── Contents.json
│   │   ├── Hide Keyboard.imageset/
│   │   │   └── Contents.json
│   │   ├── Paste.imageset/
│   │   │   └── Contents.json
│   │   ├── Saddam Hussein.imageset/
│   │   │   └── Contents.json
│   │   └── X.imageset/
│   │       └── Contents.json
│   ├── BarButton.h
│   ├── BarButton.m
│   ├── Base.lproj/
│   │   ├── About.storyboard
│   │   ├── LaunchScreen.storyboard
│   │   └── Terminal.storyboard
│   ├── CLI.xcconfig
│   ├── CurrentRoot.h
│   ├── CurrentRoot.m
│   ├── DelayedUITask.h
│   ├── DelayedUITask.m
│   ├── ExceptionExfiltrator.h
│   ├── ExceptionExfiltrator.m
│   ├── FileProvider/
│   │   ├── FileProviderEnumerator.h
│   │   ├── FileProviderEnumerator.m
│   │   ├── FileProviderExtension.h
│   │   ├── FileProviderExtension.m
│   │   ├── FileProviderItem.h
│   │   ├── FileProviderItem.m
│   │   ├── Info.plist
│   │   ├── NSError+ISHErrno.h
│   │   ├── NSError+ISHErrno.m
│   │   └── iSHFileProvider.entitlements
│   ├── FontPickerViewController.h
│   ├── FontPickerViewController.m
│   ├── IOSCalls.m
│   ├── Icons/
│   │   └── Icons.plist
│   ├── Info.plist
│   ├── Linux.xcconfig
│   ├── LinuxInterop.c
│   ├── LinuxInterop.h
│   ├── LinuxPTY.c
│   ├── LinuxRoot.c
│   ├── LinuxTTY.c
│   ├── LocationDevice.h
│   ├── LocationDevice.m
│   ├── NSObject+SaneKVO.h
│   ├── NSObject+SaneKVO.m
│   ├── NotLinux.xcconfig
│   ├── PassthroughView.h
│   ├── PassthroughView.m
│   ├── PasteboardDevice.h
│   ├── PasteboardDevice.m
│   ├── PasteboardDeviceLinux.c
│   ├── ProgressReportViewController.h
│   ├── ProgressReportViewController.m
│   ├── Project.xcconfig
│   ├── ProjectDebug.xcconfig
│   ├── ProjectDebugLinux.xcconfig
│   ├── ProjectRelease.xcconfig
│   ├── ProjectReleaseLinux.xcconfig
│   ├── Roots.h
│   ├── Roots.m
│   ├── Roots.storyboard
│   ├── RootsTableViewController.h
│   ├── RootsTableViewController.m
│   ├── SceneDelegate.h
│   ├── SceneDelegate.m
│   ├── ScrollbarView.h
│   ├── ScrollbarView.m
│   ├── Settings.bundle/
│   │   └── Root.plist
│   ├── StaticLib.xcconfig
│   ├── StaticLibLinux.xcconfig
│   ├── StaticLibLinuxUser.xcconfig
│   ├── Terminal.h
│   ├── Terminal.m
│   ├── TerminalView.h
│   ├── TerminalView.m
│   ├── TerminalViewController.h
│   ├── TerminalViewController.m
│   ├── Theme.h
│   ├── Theme.m
│   ├── ThemeViewController.h
│   ├── ThemeViewController.m
│   ├── ThemesViewController.h
│   ├── ThemesViewController.m
│   ├── UIApplication+OpenURL.h
│   ├── UIApplication+OpenURL.m
│   ├── UITests/
│   │   ├── Info.plist
│   │   ├── Screenshots.m
│   │   ├── Screenshots.xctestplan
│   │   └── UITests.m
│   ├── UIViewController+Extras.h
│   ├── UIViewController+Extras.m
│   ├── UpgradeRootViewController.h
│   ├── UpgradeRootViewController.m
│   ├── UserPreferences.h
│   ├── UserPreferences.m
│   ├── ViewController.h
│   ├── XcodeDebug.xcconfig
│   ├── XcodeDefault.xcconfig
│   ├── XcodeRelease.xcconfig
│   ├── gen_apk_repositories.py
│   ├── hook.c
│   ├── hook.h
│   ├── iOS.xcconfig
│   ├── iOSFS.h
│   ├── iOSFS.m
│   ├── iSH.entitlements
│   ├── iSH.xcconfig
│   ├── main.m
│   ├── terminal/
│   │   ├── term.css
│   │   ├── term.html
│   │   └── term.js
│   ├── xcode-meson.sh
│   └── xcode-ninja.sh
├── asbestos/
│   ├── asbestos.c
│   ├── asbestos.h
│   ├── frame.h
│   ├── gadgets-aarch64/
│   │   ├── bits.S
│   │   ├── control.S
│   │   ├── entry.S
│   │   ├── gadgets.h
│   │   ├── math.S
│   │   ├── math.h
│   │   ├── memory.S
│   │   ├── misc.S
│   │   └── string.S
│   ├── gadgets-generic.h
│   ├── gadgets-x86_64/
│   │   ├── bits.S
│   │   ├── control.S
│   │   ├── entry.S
│   │   ├── gadgets.h
│   │   ├── math.S
│   │   ├── memory.S
│   │   ├── misc.S
│   │   └── string.S
│   ├── gen.c
│   ├── gen.h
│   ├── helpers.c
│   └── offsets.c
├── debug.h
├── deps/
│   ├── aports/
│   │   ├── sync-archive.sh
│   │   ├── v3.14/
│   │   │   ├── community/
│   │   │   │   └── x86/
│   │   │   │       └── index.txt
│   │   │   └── main/
│   │   │       └── x86/
│   │   │           └── index.txt
│   │   ├── v3.17/
│   │   │   ├── community/
│   │   │   │   └── x86/
│   │   │   │       └── index.txt
│   │   │   └── main/
│   │   │       └── x86/
│   │   │           └── index.txt
│   │   ├── v3.18/
│   │   │   ├── community/
│   │   │   │   └── x86/
│   │   │   │       └── index.txt
│   │   │   └── main/
│   │   │       └── x86/
│   │   │           └── index.txt
│   │   └── v3.19/
│   │       ├── community/
│   │       │   └── x86/
│   │       │       └── index.txt
│   │       └── main/
│   │           └── x86/
│   │               └── index.txt
│   ├── clone-linux.sh
│   ├── config.h
│   ├── kconfig-fragment.sh
│   ├── libarchive.xcodeproj/
│   │   ├── project.pbxproj
│   │   └── project.xcworkspace/
│   │       ├── contents.xcworkspacedata
│   │       └── xcshareddata/
│   │           └── IDEWorkspaceChecks.plist
│   ├── linux-build.sh
│   ├── linux-sparse.txt
│   ├── linux.config
│   ├── makefilter.py
│   └── meson.build
├── emu/
│   ├── cpu.h
│   ├── cpuid.h
│   ├── decode.h
│   ├── float80-test.c
│   ├── float80.c
│   ├── float80.h
│   ├── fpu.c
│   ├── fpu.h
│   ├── interrupt.h
│   ├── mmu.h
│   ├── mmx.c
│   ├── modrm.h
│   ├── tlb.c
│   ├── tlb.h
│   ├── vec.c
│   └── vec.h
├── fastlane/
│   ├── Appfile
│   ├── Deliverfile
│   ├── Fastfile
│   ├── Matchfile
│   ├── README.md
│   ├── Snapfile
│   ├── SnapshotHelper.swift
│   └── footer.txt
├── fs/
│   ├── adhoc.c
│   ├── dev.c
│   ├── dev.h
│   ├── devices.h
│   ├── dir.c
│   ├── dyndev.c
│   ├── dyndev.h
│   ├── fake-db.c
│   ├── fake-db.h
│   ├── fake-migrate.c
│   ├── fake-rebuild.c
│   ├── fake.c
│   ├── fake.h
│   ├── fd.c
│   ├── fd.h
│   ├── fix_path.h
│   ├── generic.c
│   ├── inode.c
│   ├── inode.h
│   ├── lock.c
│   ├── mem.c
│   ├── mem.h
│   ├── mount.c
│   ├── path.c
│   ├── path.h
│   ├── pipe.c
│   ├── poll.c
│   ├── poll.h
│   ├── proc/
│   │   ├── entry.c
│   │   ├── ish.c
│   │   ├── ish.h
│   │   ├── pid.c
│   │   └── root.c
│   ├── proc.c
│   ├── proc.h
│   ├── pty.c
│   ├── real.c
│   ├── real.h
│   ├── sock.c
│   ├── sock.h
│   ├── sockrestart.c
│   ├── sockrestart.h
│   ├── sqlutil.h
│   ├── stat.c
│   ├── stat.h
│   ├── tmp.c
│   ├── tty-real.c
│   ├── tty.c
│   └── tty.h
├── iSH.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── xcshareddata/
│       ├── xcdebugger/
│       │   └── Breakpoints_v2.xcbkptlist
│       └── xcschemes/
│           ├── Screenshots.xcscheme
│           ├── iSH+Linux.xcscheme
│           ├── iSH.xcscheme
│           └── ish-cli.xcscheme
├── ish-gdb.gdb
├── ish-lldb.lldb
├── kernel/
│   ├── calls.c
│   ├── calls.h
│   ├── elf.h
│   ├── epoll.c
│   ├── errno.c
│   ├── errno.h
│   ├── eventfd.c
│   ├── exec.c
│   ├── exit.c
│   ├── fork.c
│   ├── fs.c
│   ├── fs.h
│   ├── fs_info.c
│   ├── futex.c
│   ├── futex.h
│   ├── getset.c
│   ├── group.c
│   ├── init.c
│   ├── init.h
│   ├── ipc.c
│   ├── log.c
│   ├── memory.c
│   ├── memory.h
│   ├── misc.c
│   ├── mm.h
│   ├── mmap.c
│   ├── personality.h
│   ├── poll.c
│   ├── ptrace.c
│   ├── ptrace.h
│   ├── random.c
│   ├── random.h
│   ├── resource.c
│   ├── resource.h
│   ├── signal.c
│   ├── signal.h
│   ├── task.c
│   ├── task.h
│   ├── time.c
│   ├── time.h
│   ├── tls.c
│   ├── uname.c
│   ├── user.c
│   ├── vdso.c
│   └── vdso.h
├── linux/
│   ├── emu_asbestos.c
│   ├── emu_unicorn.c
│   ├── emu_unicorn.h
│   ├── emu_unicorn_kernel.c
│   ├── fakefs.c
│   └── main.c
├── main.c
├── meson.build
├── meson_options.txt
├── misc.h
├── platform/
│   ├── darwin.c
│   ├── linux.c
│   └── platform.h
├── shell.nix
├── tests/
│   ├── .gitignore
│   ├── e2e/
│   │   ├── e2e.bash
│   │   ├── fpu/
│   │   │   ├── expected.txt
│   │   │   ├── test.sh
│   │   │   └── test_fpu.c
│   │   ├── hello/
│   │   │   ├── expected.txt
│   │   │   ├── test.sh
│   │   │   ├── test_c.c
│   │   │   ├── test_python2.py
│   │   │   └── test_python3.py
│   │   ├── qemu/
│   │   │   ├── expected.txt
│   │   │   ├── qemu-test-muldiv.h
│   │   │   ├── qemu-test-shift.h
│   │   │   ├── qemu-test.c
│   │   │   ├── qemu-test.h
│   │   │   └── test.sh
│   │   ├── shell/
│   │   │   ├── expected.txt
│   │   │   └── test.sh
│   │   └── sse2/
│   │       ├── expected.txt
│   │       ├── movaps.c
│   │       ├── movss.c
│   │       ├── paddq.c
│   │       ├── psllq.c
│   │       ├── psrlq.c
│   │       ├── test.sh
│   │       └── xorps.c
│   └── manual/
│       ├── cat.c
│       ├── fibbonaci.c
│       ├── forkexec.c
│       ├── get-busybox.sh
│       ├── getdents.c
│       ├── hello-clib.c
│       ├── hello.c
│       ├── looper.c
│       ├── meson.build
│       ├── modify.c
│       ├── signal.c
│       ├── stat.c
│       └── thread.c
├── tools/
│   ├── fakefs.c
│   ├── fakefs.h
│   ├── fakefsify.c
│   ├── meson.build
│   ├── ptraceomatic-config.h
│   ├── ptraceomatic-gdb.gdb
│   ├── ptraceomatic.c
│   ├── ptutil.c
│   ├── ptutil.h
│   ├── staticdefine.h
│   ├── staticdefine.sh
│   ├── transplant.h
│   ├── undefined-flags.c
│   ├── undefined-flags.h
│   ├── unicornomatic.c
│   ├── vdso-dump.c
│   ├── vdso-transplant-main.c
│   └── vdso-transplant.c
├── util/
│   ├── bits.h
│   ├── fchdir.c
│   ├── fchdir.h
│   ├── fifo.c
│   ├── fifo.h
│   ├── list.h
│   ├── refcount.h
│   ├── sync.c
│   ├── sync.h
│   ├── timer.c
│   └── timer.h
├── vdso/
│   ├── check-cc.sh
│   ├── meson.build
│   ├── note.S
│   ├── vdso.S
│   ├── vdso.c
│   └── vdso.lds
└── xX_main_Xx.h
Download .txt
SYMBOL INDEX (2332 symbols across 181 files)

FILE: app/FileProvider/FileProviderExtension.h
  type fakefs_mount (line 11) | struct fakefs_mount {
  type fakefs_mount (line 19) | struct fakefs_mount

FILE: app/FileProvider/FileProviderItem.h
  type fakefs_mount (line 15) | struct fakefs_mount

FILE: app/LinuxInterop.c
  function actuate_kernel (line 30) | void actuate_kernel(const char *cmdline) {
  function panic_report (line 35) | static int panic_report(struct notifier_block *nb, unsigned long action,...
  type notifier_block (line 43) | struct notifier_block
  function panic_report_init (line 47) | static int __init panic_report_init(void) {
  function irqreturn_t (line 55) | static irqreturn_t call_block_irq(int irq, void *dev) {
  function async_do_in_irq (line 67) | void async_do_in_irq(void (^block)(void)) {
  type ios_work (line 75) | struct ios_work {
  function do_ios_work (line 80) | static void do_ios_work(struct work_struct *work) {
  function async_do_in_workqueue (line 87) | void async_do_in_workqueue(void (^block)(void)) {
  function call_block_init (line 96) | static int __init call_block_init(void) {
  type ish_session (line 110) | struct ish_session {
  function session_init (line 117) | static int session_init(struct subprocess_info *info, struct cred *cred) {
  function session_cleanup (line 134) | static void session_cleanup(struct subprocess_info *info) {
  function linux_start_session (line 145) | void linux_start_session(const char *exe, const char *const *argv, const...
  function linux_sethostname (line 155) | void linux_sethostname(const char *hostname) {
  function linux_read_file (line 169) | ssize_t linux_read_file(const char *path, char *buf, size_t size) {
  function linux_write_file (line 179) | ssize_t linux_write_file(const char *path, const char *buf, size_t size) {
  function linux_remove_directory (line 185) | int linux_remove_directory(const char *path) {

FILE: app/LinuxInterop.h
  type linux_tty (line 35) | struct linux_tty {
  type linux_tty_callbacks (line 38) | struct linux_tty_callbacks {
  type file (line 46) | struct file
  type linux_tty (line 50) | struct linux_tty

FILE: app/LinuxPTY.c
  type path (line 24) | struct path
  type ios_pty_wq (line 26) | struct ios_pty_wq {
  type ios_pty (line 32) | struct ios_pty {
  function ios_pty_output_work (line 46) | static void ios_pty_output_work(struct work_struct *output_work) {
  function ios_pty_cleanup (line 71) | static void ios_pty_cleanup(struct ios_pty *pty) {
  function ios_pty_cb_can_output (line 81) | static void ios_pty_cb_can_output(struct linux_tty *linux_tty) {
  function ios_pty_cb_send_input (line 86) | static void ios_pty_cb_send_input(struct linux_tty *linux_tty, const cha...
  function ios_pty_cb_resize (line 95) | static void ios_pty_cb_resize(struct linux_tty *linux_tty, int cols, int...
  function ios_pty_cb_hangup (line 104) | static void ios_pty_cb_hangup(struct linux_tty *linux_tty) {
  type linux_tty_callbacks (line 108) | struct linux_tty_callbacks
  function ios_pty_poll_cb_work (line 115) | static void ios_pty_poll_cb_work(struct work_struct *work) {
  function ptm_callback (line 124) | static int ptm_callback(struct wait_queue_entry *wq_entry, unsigned mode...
  function poll_callback (line 130) | static void poll_callback(struct file *file, wait_queue_head_t *whead, p...
  type file (line 141) | struct file
  type file (line 142) | struct file
  type file (line 158) | struct file
  type ios_pty (line 161) | struct ios_pty
  function __init (line 185) | static __init int ios_pty_init(void) {

FILE: app/LinuxRoot.c
  function __init (line 19) | static __init int ish_rootfs(void) {

FILE: app/LinuxTTY.c
  function nslog_console_write (line 17) | static void nslog_console_write(struct console *console, const char *dat...
  type console (line 21) | struct console
  function __init (line 28) | static __init int nslog_init(void) {
  type ios_tty (line 34) | struct ios_tty {
  type tty_driver (line 40) | struct tty_driver
  type ios_tty (line 41) | struct ios_tty
  function ios_tty_port_activate (line 43) | static int ios_tty_port_activate(struct tty_port *port, struct tty_struc...
  function ios_tty_port_destruct (line 49) | static void ios_tty_port_destruct(struct tty_port *port) {
  type tty_port_operations (line 57) | struct tty_port_operations
  function ios_tty_cb_can_output (line 62) | static void ios_tty_cb_can_output(struct linux_tty *linux_tty) {
  function ios_tty_cb_send_input (line 67) | static void ios_tty_cb_send_input(struct linux_tty *linux_tty, const cha...
  function ios_tty_cb_resize (line 73) | static void ios_tty_cb_resize(struct linux_tty *linux_tty, int cols, int...
  function ios_tty_cb_hangup (line 82) | static void ios_tty_cb_hangup(struct linux_tty *linux_tty) {
  type linux_tty_callbacks (line 86) | struct linux_tty_callbacks
  function ios_tty_open (line 93) | static int ios_tty_open(struct tty_struct *tty, struct file *filp) {
  function ios_tty_write (line 97) | static int ios_tty_write(struct tty_struct *tty, const unsigned char *da...
  function ios_tty_write_room (line 101) | static unsigned int ios_tty_write_room(struct tty_struct *tty) {
  type tty_operations (line 105) | struct tty_operations
  function ios_tty_console_setup (line 111) | static int ios_tty_console_setup(struct console *console, char *what) {
  function ios_tty_console_write (line 116) | static void ios_tty_console_write(struct console *console, const char *d...
  type tty_driver (line 132) | struct tty_driver
  type console (line 132) | struct console
  type console (line 137) | struct console
  function __init (line 146) | static __init int ios_tty_init(void) {

FILE: app/LocationDevice.h
  type dev_ops (line 8) | struct dev_ops

FILE: app/PasteboardDevice.h
  type dev_ops (line 2) | struct dev_ops

FILE: app/PasteboardDeviceLinux.c
  type pasteboard_file (line 20) | struct pasteboard_file {
  function realloc_buffer_to_fit (line 27) | static int realloc_buffer_to_fit(struct file *file, size_t fit_len) {
  function read_pasteboard_to_buffer (line 49) | static int read_pasteboard_to_buffer(struct file *file) {
  function pasteboard_open (line 63) | static int pasteboard_open(struct inode *ino, struct file *file) {
  function loff_t (line 87) | static loff_t pasteboard_llseek(struct file *file, loff_t off, int whenc...
  function pasteboard_read (line 92) | static ssize_t pasteboard_read(struct file *file, char __user *buf, size...
  function pasteboard_write (line 97) | static ssize_t pasteboard_write(struct file *file, const char __user *bu...
  function pasteboard_fsync (line 112) | static int pasteboard_fsync(struct file *file, loff_t start, loff_t end,...
  function pasteboard_release (line 118) | static int pasteboard_release(struct inode *inode, struct file *file) {
  type file_operations (line 127) | struct file_operations
  type miscdevice (line 137) | struct miscdevice
  function pasteboard_init (line 143) | int __init pasteboard_init(void) {

FILE: app/Terminal.h
  type tty (line 11) | struct tty
  type tty (line 18) | struct tty

FILE: app/TerminalView.h
  type OverrideAppearance (line 11) | enum OverrideAppearance {

FILE: app/UserPreferences.h
  type OptionMapping (line 19) | typedef enum : NSUInteger {

FILE: app/gen_apk_repositories.py
  function trim (line 3) | def trim(x, start, end):

FILE: app/hook.c
  function kern_return_t (line 25) | kern_return_t catch_mach_exception_raise(
  function kern_return_t (line 35) | kern_return_t catch_mach_exception_raise_state_identity(
  type hook (line 52) | struct hook {
  type hook (line 56) | struct hook
  function kern_return_t (line 62) | kern_return_t catch_mach_exception_raise_state(
  function initialize_if_needed (line 92) | static bool initialize_if_needed(void) {
  type dyld_cache_header (line 130) | struct dyld_cache_header {
  type dyld_cache_local_symbols_info (line 137) | struct dyld_cache_local_symbols_info {
  type dyld_all_image_infos (line 161) | struct dyld_all_image_infos
  type dyld_all_image_infos (line 161) | struct dyld_all_image_infos
  type stat (line 184) | struct stat
  type dyld_cache_header (line 195) | struct dyld_cache_header
  type dyld_cache_header (line 195) | struct dyld_cache_header
  type dyld_cache_local_symbols_info (line 201) | struct dyld_cache_local_symbols_info
  type dyld_cache_local_symbols_info (line 201) | struct dyld_cache_local_symbols_info
  type nlist_64 (line 203) | struct nlist_64
  type nlist_64 (line 203) | struct nlist_64
  function hook (line 222) | bool hook(void *old, void *new) {
  function hook (line 278) | bool hook(void *old, void *new) {

FILE: app/iOSFS.h
  type fs_ops (line 8) | struct fs_ops
  type fs_ops (line 9) | struct fs_ops

FILE: app/terminal/term.js
  function onTerminalReady (line 39) | function onTerminalReady() {

FILE: asbestos/asbestos.c
  type asbestos (line 12) | struct asbestos
  type fiber_block (line 12) | struct fiber_block
  type asbestos (line 13) | struct asbestos
  type fiber_block (line 13) | struct fiber_block
  type asbestos (line 14) | struct asbestos
  type asbestos (line 15) | struct asbestos
  type asbestos (line 17) | struct asbestos
  type mmu (line 17) | struct mmu
  type asbestos (line 18) | struct asbestos
  type asbestos (line 18) | struct asbestos
  function asbestos_free (line 28) | void asbestos_free(struct asbestos *asbestos) {
  type list (line 43) | struct list
  type asbestos (line 43) | struct asbestos
  function asbestos_invalidate_range (line 48) | void asbestos_invalidate_range(struct asbestos *absestos, page_t start, ...
  function asbestos_invalidate_page (line 66) | void asbestos_invalidate_page(struct asbestos *asbestos, page_t page) {
  function asbestos_invalidate_all (line 69) | void asbestos_invalidate_all(struct asbestos *asbestos) {
  function fiber_resize_hash (line 73) | static void fiber_resize_hash(struct asbestos *asbestos, size_t new_size) {
  function fiber_insert (line 90) | static void fiber_insert(struct asbestos *asbestos, struct fiber_block *...
  type fiber_block (line 103) | struct fiber_block
  type asbestos (line 103) | struct asbestos
  type list (line 104) | struct list
  type fiber_block (line 107) | struct fiber_block
  type fiber_block (line 115) | struct fiber_block
  type tlb (line 115) | struct tlb
  type gen_state (line 116) | struct gen_state
  function fiber_block_disconnect (line 140) | static void fiber_block_disconnect(struct asbestos *asbestos, struct fib...
  function fiber_block_free (line 159) | static void fiber_block_free(struct asbestos *asbestos, struct fiber_blo...
  function fiber_free_jetsam (line 164) | static void fiber_free_jetsam(struct asbestos *asbestos) {
  type fiber_block (line 172) | struct fiber_block
  type fiber_frame (line 172) | struct fiber_frame
  type tlb (line 172) | struct tlb
  function fiber_cache_hash (line 174) | static inline size_t fiber_cache_hash(addr_t ip) {
  function cpu_step_to_interrupt (line 178) | static int cpu_step_to_interrupt(struct cpu_state *cpu, struct tlb *tlb) {
  function cpu_single_step (line 245) | static int cpu_single_step(struct cpu_state *cpu, struct tlb *tlb) {
  function cpu_run_to_interrupt (line 262) | int cpu_run_to_interrupt(struct cpu_state *cpu, struct tlb *tlb) {
  function cpu_poke (line 286) | void cpu_poke(struct cpu_state *cpu) {

FILE: asbestos/asbestos.h
  type asbestos (line 12) | struct asbestos {
  type fiber_block (line 38) | struct fiber_block {
  type asbestos (line 64) | struct asbestos
  type mmu (line 64) | struct mmu
  type asbestos (line 65) | struct asbestos
  type asbestos (line 70) | struct asbestos
  type asbestos (line 71) | struct asbestos
  type asbestos (line 72) | struct asbestos

FILE: asbestos/frame.h
  type fiber_frame (line 8) | struct fiber_frame {

FILE: asbestos/gadgets-generic.h
  type size (line 71) | enum size

FILE: asbestos/gen.c
  type gen_state (line 10) | struct gen_state
  type tlb (line 10) | struct tlb
  type gen_state (line 11) | struct gen_state
  type tlb (line 11) | struct tlb
  function gen_step (line 13) | int gen_step(struct gen_state *state, struct tlb *tlb) {
  function gen (line 19) | static void gen(struct gen_state *state, unsigned long thing) {
  function gen_start (line 34) | void gen_start(addr_t addr, struct gen_state *state) {
  function gen_end (line 48) | void gen_end(struct gen_state *state) {
  function gen_exit (line 75) | void gen_exit(struct gen_state *state) {
  type arg (line 101) | enum arg {
  type size (line 112) | enum size {
  type cond (line 119) | enum cond {
  type repeat (line 124) | enum repeat {
  function sz (line 151) | static inline int sz(int size) {
  function gen_addr (line 160) | bool gen_addr(struct gen_state *state, struct modrm *modrm, bool seg_gs) {
  function gen_op (line 176) | static inline bool gen_op(struct gen_state *state, gadget_t *gadgets, en...
  type cpu_state (line 359) | struct cpu_state
  function could_be_memory (line 451) | static inline bool could_be_memory(enum arg arg) {
  function cpu_reg_offset (line 455) | static inline uint16_t cpu_reg_offset(enum arg arg, int index) {
  function gen_vec (line 465) | static inline bool gen_vec(enum arg src, enum arg dst, void (*helper)(),...

FILE: asbestos/gen.h
  type gen_state (line 7) | struct gen_state {
  type gen_state (line 18) | struct gen_state
  type gen_state (line 19) | struct gen_state
  type gen_state (line 20) | struct gen_state
  type gen_state (line 22) | struct gen_state
  type tlb (line 22) | struct tlb

FILE: asbestos/helpers.c
  function helper_cpuid (line 5) | void helper_cpuid(dword_t *a, dword_t *b, dword_t *c, dword_t *d) {
  function helper_rdtsc (line 9) | void helper_rdtsc(struct cpu_state *cpu) {
  function helper_expand_flags (line 17) | void helper_expand_flags(struct cpu_state *cpu) {
  function helper_collapse_flags (line 21) | void helper_collapse_flags(struct cpu_state *cpu) {

FILE: asbestos/offsets.c
  function cpu (line 6) | void cpu() {

FILE: emu/cpu.h
  type cpu_state (line 14) | struct cpu_state
  type tlb (line 15) | struct tlb
  type cpu_state (line 16) | struct cpu_state
  type tlb (line 16) | struct tlb
  type cpu_state (line 17) | struct cpu_state
  type cpu_state (line 35) | struct cpu_state {
  type cpu_state (line 186) | struct cpu_state
  function collapse_flags (line 196) | static inline void collapse_flags(struct cpu_state *cpu) {
  function expand_flags (line 210) | static inline void expand_flags(struct cpu_state *cpu) {
  type reg32 (line 216) | enum reg32 {
  type reg32 (line 221) | enum reg32

FILE: emu/cpuid.h
  function do_cpuid (line 6) | static inline void do_cpuid(dword_t *eax, dword_t *ebx, dword_t *ecx, dw...

FILE: emu/decode.h
  function __no_instrument (line 20) | __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) {

FILE: emu/float80-test.c
  function bitwise_eq (line 25) | static bool bitwise_eq(long double a, long double b) {
  function _suite_start (line 38) | void _suite_start(const char *suite) {
  function _suite_end (line 51) | void _suite_end(const char *suite) {
  function assertf (line 55) | void assertf(int cond, const char *msg, ...) {
  function test_int_convert (line 72) | void test_int_convert() {
  function test_double_convert (line 99) | void test_double_convert() {
  function test_round (line 121) | void test_round() {
  function test_math (line 148) | void test_math() {
  function test_compare (line 220) | void test_compare() {
  function fnmulh (line 257) | uint64_t fnmulh(uint64_t a, uint64_t b) {
  function main (line 261) | int main() {

FILE: emu/float80.c
  type uint128_t (line 9) | typedef unsigned __int128 uint128_t;
  function bias (line 21) | static unsigned bias(int exp) {
  function unbias (line 24) | static int unbias(unsigned exp) {
  function unbias_denormal (line 28) | static int unbias_denormal(unsigned exp) {
  type f80_rounding_mode (line 36) | enum f80_rounding_mode
  function round_away_from_zero (line 38) | static bool round_away_from_zero(int sign) {
  function uint128_t (line 46) | static uint128_t u128_shift_right_round(uint128_t i, int shift, int sign) {
  function float80 (line 81) | static float80 f80_shift_left(float80 f, int shift) {
  function float80 (line 88) | static float80 f80_shift_right(float80 f, int shift) {
  function f80_is_supported (line 97) | bool f80_is_supported(float80 f) {
  function f80_isnan (line 103) | bool f80_isnan(float80 f) {
  function f80_isinf (line 106) | bool f80_isinf(float80 f) {
  function f80_iszero (line 109) | bool f80_iszero(float80 f) {
  function f80_isdenormal (line 112) | bool f80_isdenormal(float80 f) {
  function float80 (line 116) | static float80 f80_normalize(float80 f) {
  function u128_clz (line 142) | static int u128_clz(uint128_t x) {
  function float80 (line 154) | static float80 u128_normalize_round(uint128_t signif, int exp, int sign) {
  function float80 (line 194) | float80 f80_from_int(int64_t i) {
  function f80_to_int (line 211) | int64_t f80_to_int(float80 f) {
  type double_bits (line 224) | struct double_bits {
  function float80 (line 235) | float80 f80_from_double(double d) {
  function f80_to_double (line 258) | double f80_to_double(float80 f) {
  function float80 (line 291) | float80 f80_round(float80 f) {
  function float80 (line 309) | float80 f80_neg(float80 f) {
  function float80 (line 313) | float80 f80_abs(float80 f) {
  function float80 (line 332) | float80 f80_add(float80 a, float80 b) {
  function float80 (line 416) | float80 f80_sub(float80 a, float80 b) {
  function float80 (line 420) | float80 f80_mul(float80 a, float80 b) {
  function float80 (line 444) | float80 f80_div(float80 a, float80 b) {
  function float80 (line 483) | float80 f80_mod(float80 x, float80 y) {
  function f80_uncomparable (line 492) | bool f80_uncomparable(float80 a, float80 b) {
  function f80_lt (line 500) | bool f80_lt(float80 a, float80 b) {
  function f80_eq (line 513) | bool f80_eq(float80 a, float80 b) {
  function f80_lte (line 521) | bool f80_lte(float80 a, float80 b) {
  function f80_gt (line 524) | bool f80_gt(float80 a, float80 b) {
  function float80 (line 528) | float80 f80_log2(float80 x) {
  function float80 (line 561) | float80 f80_sqrt(float80 x) {
  function float80 (line 580) | float80 f80_scale(float80 x, int scale) {
  function f80_xtract (line 586) | void f80_xtract(float80 f, int *exp, float80 *signif) {

FILE: emu/float80.h
  type float80 (line 6) | typedef struct {
  type f80_rounding_mode (line 51) | enum f80_rounding_mode {
  type f80_rounding_mode (line 57) | enum f80_rounding_mode

FILE: emu/fpu.c
  function fpu_push (line 10) | static void fpu_push(struct cpu_state *cpu, float80 f) {
  function fpu_pop (line 15) | void fpu_pop(struct cpu_state *cpu) {
  function fpu_xch (line 19) | void fpu_xch(struct cpu_state *cpu, int i) {
  function fpu_incstp (line 25) | void fpu_incstp(struct cpu_state *cpu) {
  function fpu_ld (line 34) | void fpu_ld(struct cpu_state *cpu, int i) {
  function fpu_ldc (line 38) | void fpu_ldc(struct cpu_state *cpu, enum fpu_const c) {
  function fpu_ild16 (line 42) | void fpu_ild16(struct cpu_state *cpu, int16_t *i) {
  function fpu_ild32 (line 45) | void fpu_ild32(struct cpu_state *cpu, int32_t *i) {
  function fpu_ild64 (line 48) | void fpu_ild64(struct cpu_state *cpu, int64_t *i) {
  function fpu_ldm32 (line 52) | void fpu_ldm32(struct cpu_state *cpu, float32 *f) {
  function fpu_ldm64 (line 55) | void fpu_ldm64(struct cpu_state *cpu, float64 *f) {
  function fpu_ldm80 (line 58) | void fpu_ldm80(struct cpu_state *cpu, float80 *f) {
  function fpu_st (line 64) | void fpu_st(struct cpu_state *cpu, int i) {
  function fpu_ist16 (line 67) | void fpu_ist16(struct cpu_state *cpu, int16_t *i) {
  function fpu_ist32 (line 73) | void fpu_ist32(struct cpu_state *cpu, int32_t *i) {
  function fpu_ist64 (line 79) | void fpu_ist64(struct cpu_state *cpu, int64_t *i) {
  function fpu_stm32 (line 83) | void fpu_stm32(struct cpu_state *cpu, float32 *f) {
  function fpu_stm64 (line 86) | void fpu_stm64(struct cpu_state *cpu, float64 *f) {
  function fpu_stm80 (line 89) | void fpu_stm80(struct cpu_state *cpu, float80 *f) {
  function fpu_prem (line 112) | void fpu_prem(struct cpu_state *cpu) {
  function fpu_scale (line 117) | void fpu_scale(struct cpu_state *cpu) {
  function fpu_rndint (line 125) | void fpu_rndint(struct cpu_state *cpu) {
  function fpu_sqrt (line 131) | void fpu_sqrt(struct cpu_state *cpu) {
  function fpu_yl2x (line 135) | void fpu_yl2x(struct cpu_state *cpu) {
  function fpu_2xm1 (line 140) | void fpu_2xm1(struct cpu_state *cpu) {
  function fpu_comparei (line 145) | static void fpu_comparei(struct cpu_state *cpu, float80 x) {
  function fpu_compare (line 153) | static void fpu_compare(struct cpu_state *cpu, float80 x) {
  function fpu_com (line 160) | void fpu_com(struct cpu_state *cpu, int i) {
  function fpu_comi (line 163) | void fpu_comi(struct cpu_state *cpu, int i) {
  function fpu_comm32 (line 166) | void fpu_comm32(struct cpu_state *cpu, float *f) {
  function fpu_comm64 (line 169) | void fpu_comm64(struct cpu_state *cpu, double *f) {
  function fpu_icom16 (line 172) | void fpu_icom16(struct cpu_state *cpu, int16_t *i) {
  function fpu_icom32 (line 175) | void fpu_icom32(struct cpu_state *cpu, int32_t *i) {
  function fpu_tst (line 178) | void fpu_tst(struct cpu_state *cpu) {
  function fpu_abs (line 182) | void fpu_abs(struct cpu_state *cpu) {
  function fpu_chs (line 186) | void fpu_chs(struct cpu_state *cpu) {
  function fpu_add (line 190) | void fpu_add(struct cpu_state *cpu, int srci, int dsti) {
  function fpu_sub (line 193) | void fpu_sub(struct cpu_state *cpu, int srci, int dsti) {
  function fpu_subr (line 196) | void fpu_subr(struct cpu_state *cpu, int srci, int dsti) {
  function fpu_mul (line 199) | void fpu_mul(struct cpu_state *cpu, int srci, int dsti) {
  function fpu_div (line 202) | void fpu_div(struct cpu_state *cpu, int srci, int dsti) {
  function fpu_divr (line 205) | void fpu_divr(struct cpu_state *cpu, int srci, int dsti) {
  function fpu_iadd16 (line 209) | void fpu_iadd16(struct cpu_state *cpu, int16_t *i) {
  function fpu_isub16 (line 212) | void fpu_isub16(struct cpu_state *cpu, int16_t *i) {
  function fpu_isubr16 (line 215) | void fpu_isubr16(struct cpu_state *cpu, int16_t *i) {
  function fpu_imul16 (line 218) | void fpu_imul16(struct cpu_state *cpu, int16_t *i) {
  function fpu_idiv16 (line 221) | void fpu_idiv16(struct cpu_state *cpu, int16_t *i) {
  function fpu_idivr16 (line 224) | void fpu_idivr16(struct cpu_state *cpu, int16_t *i) {
  function fpu_iadd32 (line 228) | void fpu_iadd32(struct cpu_state *cpu, int32_t *i) {
  function fpu_isub32 (line 231) | void fpu_isub32(struct cpu_state *cpu, int32_t *i) {
  function fpu_isubr32 (line 234) | void fpu_isubr32(struct cpu_state *cpu, int32_t *i) {
  function fpu_imul32 (line 237) | void fpu_imul32(struct cpu_state *cpu, int32_t *i) {
  function fpu_idiv32 (line 240) | void fpu_idiv32(struct cpu_state *cpu, int32_t *i) {
  function fpu_idivr32 (line 243) | void fpu_idivr32(struct cpu_state *cpu, int32_t *i) {
  function fpu_addm32 (line 247) | void fpu_addm32(struct cpu_state *cpu, float32 *f) {
  function fpu_subm32 (line 250) | void fpu_subm32(struct cpu_state *cpu, float32 *f) {
  function fpu_subrm32 (line 253) | void fpu_subrm32(struct cpu_state *cpu, float32 *f) {
  function fpu_mulm32 (line 256) | void fpu_mulm32(struct cpu_state *cpu, float32 *f) {
  function fpu_divm32 (line 259) | void fpu_divm32(struct cpu_state *cpu, float32 *f) {
  function fpu_divrm32 (line 262) | void fpu_divrm32(struct cpu_state *cpu, float32 *f) {
  function fpu_addm64 (line 266) | void fpu_addm64(struct cpu_state *cpu, float64 *f) {
  function fpu_subm64 (line 269) | void fpu_subm64(struct cpu_state *cpu, float64 *f) {
  function fpu_subrm64 (line 272) | void fpu_subrm64(struct cpu_state *cpu, float64 *f) {
  function fpu_mulm64 (line 275) | void fpu_mulm64(struct cpu_state *cpu, float64 *f) {
  function fpu_divm64 (line 278) | void fpu_divm64(struct cpu_state *cpu, float64 *f) {
  function fpu_divrm64 (line 281) | void fpu_divrm64(struct cpu_state *cpu, float64 *f) {
  function fpu_patan (line 285) | void fpu_patan(struct cpu_state *cpu) {
  function fpu_sin (line 291) | void fpu_sin(struct cpu_state *cpu) {
  function fpu_cos (line 294) | void fpu_cos(struct cpu_state *cpu) {
  function fpu_xtract (line 298) | void fpu_xtract(struct cpu_state *cpu) {
  function fpu_xam (line 306) | void fpu_xam(struct cpu_state *cpu) {
  function fpu_stcw16 (line 332) | void fpu_stcw16(struct cpu_state *cpu, uint16_t *i) {
  function fpu_ldcw16 (line 335) | void fpu_ldcw16(struct cpu_state *cpu, uint16_t *i) {
  type fpu_env32 (line 340) | struct fpu_env32 {
  function fpu_stenv32 (line 350) | void fpu_stenv32(struct cpu_state *cpu, struct fpu_env32 *env) {
  function fpu_ldenv32 (line 358) | void fpu_ldenv32(struct cpu_state *cpu, struct fpu_env32 *env) {
  type fpu_state32 (line 363) | struct fpu_state32 {
  function fpu_save32 (line 368) | void fpu_save32(struct cpu_state *cpu, struct fpu_state32 *state) {
  function fpu_restore32 (line 374) | void fpu_restore32(struct cpu_state *cpu, struct fpu_state32 *state) {
  function fpu_clex (line 380) | void fpu_clex(struct cpu_state *cpu) {

FILE: emu/fpu.h
  type cpu_state (line 4) | struct cpu_state
  type fpu_env32 (line 5) | struct fpu_env32
  type fpu_state32 (line 6) | struct fpu_state32
  type float32 (line 8) | typedef float float32;
  type float64 (line 9) | typedef double float64;
  type fpu_const (line 11) | enum fpu_const {
  type cpu_state (line 30) | struct cpu_state
  type cpu_state (line 31) | struct cpu_state
  type cpu_state (line 32) | struct cpu_state
  type cpu_state (line 34) | struct cpu_state
  type cpu_state (line 35) | struct cpu_state
  type cpu_state (line 36) | struct cpu_state
  type cpu_state (line 37) | struct cpu_state
  type cpu_state (line 38) | struct cpu_state
  type cpu_state (line 39) | struct cpu_state
  type cpu_state (line 40) | struct cpu_state
  type cpu_state (line 42) | struct cpu_state
  type cpu_state (line 43) | struct cpu_state
  type cpu_state (line 44) | struct cpu_state
  type cpu_state (line 45) | struct cpu_state
  type cpu_state (line 46) | struct cpu_state
  type cpu_state (line 47) | struct cpu_state
  type cpu_state (line 48) | struct cpu_state
  type cpu_state (line 49) | struct cpu_state
  type cpu_state (line 51) | struct cpu_state
  type cpu_state (line 52) | struct cpu_state
  type fpu_const (line 52) | enum fpu_const
  type cpu_state (line 53) | struct cpu_state
  type cpu_state (line 54) | struct cpu_state
  type cpu_state (line 55) | struct cpu_state
  type cpu_state (line 56) | struct cpu_state
  type cpu_state (line 57) | struct cpu_state
  type cpu_state (line 58) | struct cpu_state
  type cpu_state (line 60) | struct cpu_state
  type cpu_state (line 61) | struct cpu_state
  type cpu_state (line 62) | struct cpu_state
  type cpu_state (line 63) | struct cpu_state
  type cpu_state (line 64) | struct cpu_state
  type cpu_state (line 65) | struct cpu_state
  type cpu_state (line 66) | struct cpu_state
  type cpu_state (line 67) | struct cpu_state
  type cpu_state (line 69) | struct cpu_state
  type cpu_state (line 70) | struct cpu_state
  type cpu_state (line 71) | struct cpu_state
  type cpu_state (line 72) | struct cpu_state
  type cpu_state (line 73) | struct cpu_state
  type cpu_state (line 74) | struct cpu_state
  type cpu_state (line 75) | struct cpu_state
  type cpu_state (line 79) | struct cpu_state
  type cpu_state (line 80) | struct cpu_state
  type cpu_state (line 81) | struct cpu_state
  type cpu_state (line 82) | struct cpu_state
  type cpu_state (line 83) | struct cpu_state
  type cpu_state (line 84) | struct cpu_state
  type cpu_state (line 85) | struct cpu_state
  type cpu_state (line 86) | struct cpu_state
  type cpu_state (line 87) | struct cpu_state
  type cpu_state (line 88) | struct cpu_state
  type cpu_state (line 89) | struct cpu_state
  type cpu_state (line 90) | struct cpu_state
  type cpu_state (line 91) | struct cpu_state
  type cpu_state (line 92) | struct cpu_state
  type cpu_state (line 93) | struct cpu_state
  type cpu_state (line 94) | struct cpu_state
  type cpu_state (line 95) | struct cpu_state
  type cpu_state (line 96) | struct cpu_state
  type cpu_state (line 97) | struct cpu_state
  type cpu_state (line 98) | struct cpu_state
  type cpu_state (line 99) | struct cpu_state
  type cpu_state (line 100) | struct cpu_state
  type cpu_state (line 101) | struct cpu_state
  type cpu_state (line 102) | struct cpu_state
  type cpu_state (line 103) | struct cpu_state
  type cpu_state (line 104) | struct cpu_state
  type cpu_state (line 105) | struct cpu_state
  type cpu_state (line 106) | struct cpu_state
  type cpu_state (line 107) | struct cpu_state
  type cpu_state (line 108) | struct cpu_state
  type cpu_state (line 110) | struct cpu_state
  type cpu_state (line 111) | struct cpu_state
  type cpu_state (line 112) | struct cpu_state
  type cpu_state (line 113) | struct cpu_state
  type cpu_state (line 114) | struct cpu_state
  type cpu_state (line 116) | struct cpu_state
  type cpu_state (line 117) | struct cpu_state
  type cpu_state (line 118) | struct cpu_state
  type fpu_env32 (line 118) | struct fpu_env32
  type cpu_state (line 119) | struct cpu_state
  type fpu_env32 (line 119) | struct fpu_env32
  type cpu_state (line 120) | struct cpu_state
  type fpu_state32 (line 120) | struct fpu_state32
  type cpu_state (line 121) | struct cpu_state
  type fpu_state32 (line 121) | struct fpu_state32
  type cpu_state (line 122) | struct cpu_state

FILE: emu/mmu.h
  type dword_t (line 7) | typedef dword_t page_t;
  type dword_t (line 16) | typedef dword_t pages_t;
  type mmu (line 22) | struct mmu {
  type mmu_ops (line 32) | struct mmu_ops {
  type mmu (line 37) | struct mmu

FILE: emu/mmx.c
  function vec_shiftrs_w64 (line 94) | void vec_shiftrs_w64(NO_CPU, const union mm_reg *src, union mm_reg *dst) {
  function vec_shiftrs_d64 (line 105) | void vec_shiftrs_d64(NO_CPU, const union mm_reg *src, union mm_reg *dst) {
  function vec_imm_shiftrs_w64 (line 116) | void vec_imm_shiftrs_w64(NO_CPU, const uint8_t amount, union mm_reg *dst) {
  function vec_imm_shiftrs_d64 (line 126) | void vec_imm_shiftrs_d64(NO_CPU, const uint8_t amount, union mm_reg *dst) {
  function vec_mulu64 (line 137) | void vec_mulu64(NO_CPU, const union mm_reg *src, union mm_reg *dst) {
  function vec_mull64 (line 145) | void vec_mull64(NO_CPU, const union mm_reg *src, union mm_reg *dst) {
  function vec_mulu_dq64 (line 152) | void vec_mulu_dq64(NO_CPU, union mm_reg *src, union mm_reg *dst) {
  function vec_unpackl_dq64 (line 156) | void vec_unpackl_dq64(NO_CPU, const union mm_reg *src, union mm_reg *dst) {
  function vec_shuffle_w64 (line 160) | void vec_shuffle_w64(NO_CPU, const union mm_reg *src, union mm_reg *dst,...
  function vec_movmask_b64 (line 167) | void vec_movmask_b64(NO_CPU, const union mm_reg *src, uint32_t *dst) {
  function vec_insert_w64 (line 176) | void vec_insert_w64(NO_CPU, const uint32_t *src, union mm_reg *dst, uint...

FILE: emu/modrm.h
  type modrm (line 12) | struct modrm {
  function modrm_decode32 (line 41) | static inline bool modrm_decode32(addr_t *ip, struct tlb *tlb, struct mo...

FILE: emu/tlb.c
  function tlb_refresh (line 4) | void tlb_refresh(struct tlb *tlb, struct mmu *mmu) {
  function tlb_flush (line 13) | void tlb_flush(struct tlb *tlb) {
  function tlb_free (line 19) | void tlb_free(struct tlb *tlb) {
  function __tlb_read_cross_page (line 23) | bool __tlb_read_cross_page(struct tlb *tlb, addr_t addr, char *value, un...
  function __tlb_write_cross_page (line 37) | bool __tlb_write_cross_page(struct tlb *tlb, addr_t addr, const char *va...
  function __no_instrument (line 51) | __no_instrument void *tlb_handle_miss(struct tlb *tlb, addr_t addr, int ...

FILE: emu/tlb.h
  type tlb_entry (line 8) | struct tlb_entry {
  type tlb (line 15) | struct tlb {
  type tlb (line 28) | struct tlb
  type mmu (line 28) | struct mmu
  type tlb (line 29) | struct tlb
  type tlb (line 30) | struct tlb
  type tlb (line 31) | struct tlb
  type tlb (line 33) | struct tlb
  type tlb_entry (line 34) | struct tlb_entry
  type tlb (line 42) | struct tlb
  function tlb_read (line 43) | bool tlb_read(struct tlb *tlb, addr_t addr, void *out, unsigned size) {
  type tlb (line 53) | struct tlb
  type tlb_entry (line 54) | struct tlb_entry
  type tlb (line 63) | struct tlb
  function tlb_write (line 64) | bool tlb_write(struct tlb *tlb, addr_t addr, const void *value, unsigned...

FILE: emu/vec.c
  function zero_xmm (line 16) | static inline void zero_xmm(union xmm_reg *xmm) {
  function satsw (line 21) | static inline int32_t satsw(int32_t dw) {
  function satud (line 30) | static inline uint32_t satud(uint32_t dw) {
  function satub (line 39) | static inline uint32_t satub(uint32_t dw) {
  function satsb (line 46) | static inline uint32_t satsb(uint32_t dw) {
  function vec_merge32 (line 68) | void vec_merge32(NO_CPU, const void *src, void *dst) {
  function vec_merge64 (line 71) | void vec_merge64(NO_CPU, const void *src, void *dst) {
  function vec_merge128 (line 74) | void vec_merge128(NO_CPU, const void *src, void *dst) {
  function vec_imm_shiftl_dq128 (line 150) | void vec_imm_shiftl_dq128(NO_CPU, uint8_t amount, union xmm_reg *dst) {
  function vec_imm_shiftr_dq128 (line 156) | void vec_imm_shiftr_dq128(NO_CPU, uint8_t amount, union xmm_reg *dst) {
  function vec_shiftrs_w128 (line 162) | void vec_shiftrs_w128(NO_CPU, const union xmm_reg *src, union xmm_reg *d...
  function vec_shiftrs_d128 (line 171) | void vec_shiftrs_d128(NO_CPU, const union xmm_reg *src, union xmm_reg *d...
  function vec_imm_shiftrs_w128 (line 180) | void vec_imm_shiftrs_w128(NO_CPU, const uint8_t amount, union xmm_reg *d...
  function vec_imm_shiftrs_d128 (line 188) | void vec_imm_shiftrs_d128(NO_CPU, const uint8_t amount, union xmm_reg *d...
  function vec_addus_b128 (line 197) | void vec_addus_b128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_addus_w128 (line 203) | void vec_addus_w128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_addss_b128 (line 209) | void vec_addss_b128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_addss_w128 (line 213) | void vec_addss_w128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_subus_b128 (line 218) | void vec_subus_b128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_subus_w128 (line 224) | void vec_subus_w128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_subss_b128 (line 230) | void vec_subss_b128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_subss_w128 (line 234) | void vec_subss_w128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_madd_d128 (line 239) | void vec_madd_d128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_sumabs_w128 (line 250) | void vec_sumabs_w128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_mulu_dq128 (line 263) | void vec_mulu_dq128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_andn128 (line 268) | void vec_andn128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_min_ub128 (line 273) | void vec_min_ub128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_max_ub128 (line 278) | void vec_max_ub128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_mins_w128 (line 283) | void vec_mins_w128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function vec_maxs_w128 (line 288) | void vec_maxs_w128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
  function cmpd (line 293) | static bool cmpd(double a, double b, int type) {
  function cmps (line 304) | static bool cmps(float a, float b, int type) {
  function vec_single_fcmp64 (line 316) | void vec_single_fcmp64(NO_CPU, const double *src, union xmm_reg *dst, ui...
  function vec_single_fcmp32 (line 319) | void vec_single_fcmp32(NO_CPU, const float *src, union xmm_reg *dst, uin...
  function vec_single_fadd64 (line 323) | void vec_single_fadd64(NO_CPU, const double *src, double *dst) { *dst +=...
  function vec_single_fadd32 (line 324) | void vec_single_fadd32(NO_CPU, const float *src, float *dst) { *dst += *...
  function vec_single_fmul64 (line 325) | void vec_single_fmul64(NO_CPU, const double *src, double *dst) { *dst *=...
  function vec_single_fmul32 (line 326) | void vec_single_fmul32(NO_CPU, const float *src, float *dst) { *dst *= *...
  function vec_single_fsub64 (line 327) | void vec_single_fsub64(NO_CPU, const double *src, double *dst) { *dst -=...
  function vec_single_fsub32 (line 328) | void vec_single_fsub32(NO_CPU, const float *src, float *dst) { *dst -= *...
  function vec_single_fdiv64 (line 329) | void vec_single_fdiv64(NO_CPU, const double *src, double *dst) { *dst /=...
  function vec_single_fdiv32 (line 330) | void vec_single_fdiv32(NO_CPU, const float *src, float *dst) { *dst /= *...
  function vec_single_fsqrt64 (line 332) | void vec_single_fsqrt64(NO_CPU, const double *src, double *dst) { *dst =...
  function vec_single_fsqrt32 (line 333) | void vec_single_fsqrt32(NO_CPU, const float *src, float *dst) { *dst = s...
  function vec_single_fmax64 (line 335) | void vec_single_fmax64(NO_CPU, const double *src, double *dst) {
  function vec_single_fmin64 (line 338) | void vec_single_fmin64(NO_CPU, const double *src, double *dst) {
  function vec_single_fmax32 (line 341) | void vec_single_fmax32(NO_CPU, const float *src, float *dst) {
  function vec_single_fmin32 (line 344) | void vec_single_fmin32(NO_CPU, const float *src, float *dst) {
  function vec_single_ucomi32 (line 348) | void vec_single_ucomi32(struct cpu_state *cpu, const float *src, const f...
  function vec_single_ucomi64 (line 359) | void vec_single_ucomi64(struct cpu_state *cpu, const double *src, const ...
  function vec_fcmp_p64 (line 384) | void vec_fcmp_p64(NO_CPU, const union xmm_reg *src, union xmm_reg *dst, ...
  function vec_unpackl_bw128 (line 427) | void vec_unpackl_bw128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_unpackl_w128 (line 433) | void vec_unpackl_w128(NO_CPU, const union xmm_reg *src, union xmm_reg *d...
  function vec_unpackl_dq128 (line 439) | void vec_unpackl_dq128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_unpackl_qdq128 (line 444) | void vec_unpackl_qdq128(NO_CPU, const union xmm_reg *src, union xmm_reg ...
  function vec_unpackl_ps128 (line 447) | void vec_unpackl_ps128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_unpackl_pd128 (line 452) | void vec_unpackl_pd128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_unpackh_bw128 (line 455) | void vec_unpackh_bw128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_unpackh_w128 (line 461) | void vec_unpackh_w128(NO_CPU, const union xmm_reg *src, union xmm_reg *d...
  function vec_unpackh_d128 (line 467) | void vec_unpackh_d128(NO_CPU, const union xmm_reg *src, union xmm_reg *d...
  function vec_unpackh_dq128 (line 473) | void vec_unpackh_dq128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_unpackh_ps128 (line 477) | void vec_unpackh_ps128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_unpackh_pd128 (line 483) | void vec_unpackh_pd128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_packss_w128 (line 488) | void vec_packss_w128(NO_CPU, const union xmm_reg *src, union xmm_reg *ds...
  function vec_packss_d128 (line 498) | void vec_packss_d128(NO_CPU, const union xmm_reg *src, union xmm_reg *ds...
  function vec_packsu_w128 (line 504) | void vec_packsu_w128(NO_CPU, const union xmm_reg *src, union xmm_reg *ds...
  function vec_shuffle_lw128 (line 515) | void vec_shuffle_lw128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_shuffle_hw128 (line 521) | void vec_shuffle_hw128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_shuffle_d128 (line 528) | void vec_shuffle_d128(NO_CPU, const union xmm_reg *src, union xmm_reg *d...
  function vec_shuffle_ps128 (line 533) | void vec_shuffle_ps128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_shuffle_pd128 (line 539) | void vec_shuffle_pd128(NO_CPU, const union xmm_reg *src, union xmm_reg *...
  function vec_movmask_b128 (line 544) | void vec_movmask_b128(NO_CPU, const union xmm_reg *src, uint32_t *dst) {
  function vec_fmovmask_d128 (line 551) | void vec_fmovmask_d128(NO_CPU, const union xmm_reg *src, uint32_t *dst) {
  function vec_movl_p64 (line 559) | void vec_movl_p64(NO_CPU, const uint64_t *src, union xmm_reg *dst) {
  function vec_movl_pm64 (line 562) | void vec_movl_pm64(NO_CPU, const union xmm_reg *src, uint64_t *dst) {
  function vec_movh_p64 (line 565) | void vec_movh_p64(NO_CPU, const uint64_t *src, union xmm_reg *dst) {
  function vec_movh_pm64 (line 568) | void vec_movh_pm64(NO_CPU, const union xmm_reg *src, uint64_t *dst) {
  function vec_insert_w128 (line 572) | void vec_insert_w128(NO_CPU, const uint32_t *src, union xmm_reg *dst, ui...
  function vec_extract_w128 (line 575) | void vec_extract_w128(NO_CPU, const union xmm_reg *src, uint32_t *dst, u...
  function vec_avg_b128 (line 579) | void vec_avg_b128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst) {
  function vec_avg_w128 (line 583) | void vec_avg_w128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst) {
  function vec_mull128 (line 588) | void vec_mull128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst) {
  function vec_mulu128 (line 594) | void vec_mulu128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst) {
  function vec_muluu128 (line 600) | void vec_muluu128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst) {

FILE: emu/vec.h
  type cpu_state (line 136) | struct cpu_state
  type cpu_state (line 137) | struct cpu_state

FILE: fs/adhoc.c
  type mount (line 8) | struct mount
  type fd (line 10) | struct fd
  type fd_ops (line 10) | struct fd_ops
  type fd (line 11) | struct fd
  type statbuf (line 16) | struct statbuf
  function adhoc_fstat (line 20) | static int adhoc_fstat(struct fd *fd, struct statbuf *stat) {
  function adhoc_fsetattr (line 25) | static int adhoc_fsetattr(struct fd *fd, struct attr attr) {
  function adhoc_getpath (line 42) | static int adhoc_getpath(struct fd *fd, char *buf) {
  function is_adhoc_fd (line 51) | bool is_adhoc_fd(struct fd *fd) {
  type fs_ops (line 55) | struct fs_ops
  type mount (line 62) | struct mount

FILE: fs/dev.c
  type dev_ops (line 9) | struct dev_ops
  type dev_ops (line 12) | struct dev_ops
  function dev_open (line 21) | int dev_open(int major, int minor, int type, struct fd *fd) {

FILE: fs/dev.h
  type dev_t_ (line 14) | typedef uint32_t dev_t_;
  function dev_t_ (line 16) | static inline dev_t_ dev_make(int major, int minor) {
  function dev_major (line 19) | static inline int dev_major(dev_t_ dev) {
  function dev_minor (line 22) | static inline int dev_minor(dev_t_ dev) {
  function dev_t (line 26) | static inline dev_t dev_real_from_fake(dev_t_ dev) {
  function dev_t_ (line 29) | static inline dev_t_ dev_fake_from_real(dev_t dev) {
  type dev_ops (line 36) | struct dev_ops {
  type dev_ops (line 41) | struct dev_ops
  type dev_ops (line 42) | struct dev_ops
  type fd (line 44) | struct fd
  type dev_ops (line 46) | struct dev_ops

FILE: fs/dir.c
  function fd_telldir (line 9) | static unsigned long fd_telldir(struct fd *fd) {
  function fd_seekdir (line 16) | static void fd_seekdir(struct fd *fd, unsigned long off) {
  type linux_dirent_ (line 22) | struct linux_dirent_ {
  type linux_dirent64_ (line 29) | struct linux_dirent64_ {
  function fill_dirent_32 (line 37) | size_t fill_dirent_32(void *dirent_data, ino_t inode, off_t_ offset, con...
  function fill_dirent_64 (line 48) | size_t fill_dirent_64(void *dirent_data, ino_t inode, off_t_ offset, con...
  function int_t (line 59) | int_t sys_getdents_common(fd_t f, addr_t dirents, dword_t count,
  function int_t (line 107) | int_t sys_getdents(fd_t f, addr_t dirents, uint_t count) {
  function int_t (line 111) | int_t sys_getdents64(fd_t f, addr_t dirents, uint_t count) {

FILE: fs/dyndev.c
  type dyn_dev_info (line 10) | struct dyn_dev_info {
  type dyn_dev_info (line 17) | struct dyn_dev_info
  function dyn_dev_register (line 22) | int dyn_dev_register(struct dev_ops *ops, int type, int major, int minor) {
  function dyn_open (line 51) | static int dyn_open(int type, int major, int minor, struct fd *fd) {
  function dyn_open_char (line 67) | static int dyn_open_char(int major, int minor, struct fd *fd) {
  type dev_ops (line 70) | struct dev_ops

FILE: fs/dyndev.h
  type dev_ops (line 10) | struct dev_ops
  type dev_ops (line 29) | struct dev_ops

FILE: fs/fake-db.c
  function db_check_error (line 8) | static void db_check_error(struct fakefs_db *fs) {
  function sqlite3_stmt (line 21) | static sqlite3_stmt *db_prepare(struct fakefs_db *fs, const char *stmt) {
  function db_exec (line 28) | bool db_exec(struct fakefs_db *fs, sqlite3_stmt *stmt) {
  function db_reset (line 33) | void db_reset(struct fakefs_db *fs, sqlite3_stmt *stmt) {
  function db_exec_reset (line 37) | void db_exec_reset(struct fakefs_db *fs, sqlite3_stmt *stmt) {
  function db_begin_read (line 42) | void db_begin_read(struct fakefs_db *fs) {
  function db_begin_write (line 46) | void db_begin_write(struct fakefs_db *fs) {
  function db_commit (line 50) | void db_commit(struct fakefs_db *fs) {
  function db_rollback (line 54) | void db_rollback(struct fakefs_db *fs) {
  function bind_path (line 59) | static void bind_path(sqlite3_stmt *stmt, int i, const char *path) {
  function inode_t (line 63) | inode_t path_get_inode(struct fakefs_db *fs, const char *path) {
  function path_read_stat (line 72) | bool path_read_stat(struct fakefs_db *fs, const char *path, struct ish_s...
  function inode_t (line 85) | inode_t path_create(struct fakefs_db *fs, const char *path, struct ish_s...
  function inode_read_stat_or_die (line 96) | void inode_read_stat_or_die(struct fakefs_db *fs, inode_t inode, struct ...
  function inode_read_stat_if_exist (line 100) | bool inode_read_stat_if_exist(struct fakefs_db *fs, inode_t inode, struc...
  function inode_write_stat (line 109) | void inode_write_stat(struct fakefs_db *fs, inode_t inode, struct ish_st...
  function path_link (line 116) | void path_link(struct fakefs_db *fs, const char *src, const char *dst) {
  function inode_t (line 125) | inode_t path_unlink(struct fakefs_db *fs, const char *path) {
  function path_rename (line 134) | void path_rename(struct fakefs_db *fs, const char *src, const char *dst) {
  function trace_callback (line 157) | static int trace_callback(unsigned UNUSED(why), void *UNUSED(fuck), void...
  function sqlite_func_change_prefix (line 164) | static void sqlite_func_change_prefix(sqlite3_context *context, int argc...
  type fakefs_db (line 178) | struct fakefs_db
  type fakefs_db (line 179) | struct fakefs_db
  function fake_db_init (line 181) | int fake_db_init(struct fakefs_db *fs, const char *db_path, int root_fd) {
  function fake_db_deinit (line 269) | int fake_db_deinit(struct fakefs_db *fs) {

FILE: fs/fake-db.h
  type fakefs_db (line 8) | struct fakefs_db {
  type fakefs_db (line 30) | struct fakefs_db
  type fakefs_db (line 31) | struct fakefs_db
  type fakefs_db (line 33) | struct fakefs_db
  type fakefs_db (line 34) | struct fakefs_db
  type fakefs_db (line 35) | struct fakefs_db
  type fakefs_db (line 36) | struct fakefs_db
  type fakefs_db (line 38) | struct fakefs_db
  type fakefs_db (line 39) | struct fakefs_db
  type fakefs_db (line 40) | struct fakefs_db
  type ish_stat (line 42) | struct ish_stat {
  type inode_t (line 49) | typedef uint64_t inode_t;
  type fakefs_db (line 51) | struct fakefs_db
  type fakefs_db (line 52) | struct fakefs_db
  type ish_stat (line 52) | struct ish_stat
  type fakefs_db (line 53) | struct fakefs_db
  type ish_stat (line 53) | struct ish_stat
  type fakefs_db (line 55) | struct fakefs_db
  type ish_stat (line 55) | struct ish_stat
  type fakefs_db (line 56) | struct fakefs_db
  type ish_stat (line 56) | struct ish_stat
  type fakefs_db (line 57) | struct fakefs_db
  type ish_stat (line 57) | struct ish_stat
  type fakefs_db (line 59) | struct fakefs_db
  type fakefs_db (line 60) | struct fakefs_db
  type fakefs_db (line 61) | struct fakefs_db

FILE: fs/fake-migrate.c
  type migration (line 10) | struct migration {
  function fakefs_migrate (line 37) | int fakefs_migrate(struct fakefs_db *fs, int UNUSED(root_fd)) {

FILE: fs/fake-rebuild.c
  type entry (line 26) | struct entry {
  function fakefs_rebuild (line 32) | int fakefs_rebuild(struct fakefs_db *fs, int root_fd) {

FILE: fs/fake.c
  type fd_ops (line 22) | struct fd_ops
  type fd (line 24) | struct fd
  type mount (line 24) | struct mount
  type fakefs_db (line 25) | struct fakefs_db
  type fd (line 26) | struct fd
  type ish_stat (line 32) | struct ish_stat
  type fd (line 54) | struct fd
  type mount (line 54) | struct mount
  type fakefs_db (line 55) | struct fakefs_db
  type fd (line 66) | struct fd
  function fakefs_link (line 78) | static int fakefs_link(struct mount *mount, const char *src, const char ...
  function fakefs_unlink (line 91) | static int fakefs_unlink(struct mount *mount, const char *path) {
  function fakefs_rmdir (line 105) | static int fakefs_rmdir(struct mount *mount, const char *path) {
  function fakefs_rename (line 119) | static int fakefs_rename(struct mount *mount, const char *src, const cha...
  function fakefs_symlink (line 132) | static int fakefs_symlink(struct mount *mount, const char *target, const...
  function fakefs_mknod (line 162) | static int fakefs_mknod(struct mount *mount, const char *path, mode_t_ m...
  function fakefs_stat (line 187) | static int fakefs_stat(struct mount *mount, const char *path, struct sta...
  function fakefs_fstat (line 208) | static int fakefs_fstat(struct fd *fd, struct statbuf *fake_stat) {
  function fake_stat_setattr (line 228) | static void fake_stat_setattr(struct ish_stat *ishstat, struct attr attr) {
  function fakefs_setattr (line 244) | static int fakefs_setattr(struct mount *mount, const char *path, struct ...
  function fakefs_fsetattr (line 261) | static int fakefs_fsetattr(struct fd *fd, struct attr attr) {
  function fakefs_mkdir (line 274) | static int fakefs_mkdir(struct mount *mount, const char *path, mode_t_ m...
  function file_readlink (line 292) | static ssize_t file_readlink(struct mount *mount, const char *path, char...
  function fakefs_readlink (line 304) | static ssize_t fakefs_readlink(struct mount *mount, const char *path, ch...
  function fakefs_readdir (line 324) | static int fakefs_readdir(struct fd *fd, struct dir_entry *entry) {
  type fd_ops (line 356) | struct fd_ops
  function init_fake_fdops (line 357) | static void __attribute__((constructor)) init_fake_fdops() {
  function fakefs_mount (line 362) | static int fakefs_mount(struct mount *mount) {
  function fakefs_umount (line 381) | static int fakefs_umount(struct mount *mount) {
  function fakefs_inode_orphaned (line 390) | static void fakefs_inode_orphaned(struct mount *mount, ino_t inode) {
  type fs_ops (line 398) | struct fs_ops

FILE: fs/fake.h
  type fd (line 12) | struct fd
  type mount (line 12) | struct mount

FILE: fs/fd.c
  type fd (line 11) | struct fd
  type fd_ops (line 11) | struct fd_ops
  type fd (line 12) | struct fd
  type fd (line 12) | struct fd
  type fd (line 15) | struct fd
  type fd (line 28) | struct fd
  type fd (line 28) | struct fd
  function fd_close (line 33) | int fd_close(struct fd *fd) {
  type fdtable (line 55) | struct fdtable
  type fdtable (line 57) | struct fdtable
  type fdtable (line 58) | struct fdtable
  type fdtable (line 58) | struct fdtable
  type fdtable (line 74) | struct fdtable
  function fdtable_release (line 77) | void fdtable_release(struct fdtable *table) {
  function fdtable_resize (line 91) | static int fdtable_resize(struct fdtable *table, unsigned size) {
  type fdtable (line 119) | struct fdtable
  type fdtable (line 119) | struct fdtable
  type fdtable (line 122) | struct fdtable
  type fd (line 127) | struct fd
  function fdtable_expand (line 136) | static int fdtable_expand(struct fdtable *table, fd_t max) {
  type fd (line 145) | struct fd
  type fdtable (line 145) | struct fdtable
  type fd (line 151) | struct fd
  type fd (line 153) | struct fd
  function fd_t (line 158) | static fd_t f_install_start(struct fd *fd, fd_t start) {
  function fd_t (line 184) | fd_t f_install(struct fd *fd, int flags) {
  function fdtable_close (line 197) | static int fdtable_close(struct fdtable *table, fd_t f) {
  function f_close (line 209) | int f_close(fd_t f) {
  function dword_t (line 216) | dword_t sys_close(fd_t f) {
  function fdtable_do_cloexec (line 221) | void fdtable_do_cloexec(struct fdtable *table) {
  function dword_t (line 244) | dword_t sys_dup(fd_t f) {
  function dword_t (line 253) | dword_t sys_dup3(fd_t f, fd_t new_f, int_t flags) {
  function dword_t (line 270) | dword_t sys_dup2(fd_t f, fd_t new_f) {
  function fd_getflags (line 274) | int fd_getflags(struct fd *fd) {
  function fd_setflags (line 281) | int fd_setflags(struct fd *fd, int flags) {
  function dword_t (line 288) | dword_t sys_fcntl(fd_t f, dword_t cmd, dword_t arg) {
  function dword_t (line 384) | dword_t sys_fcntl32(fd_t fd, dword_t cmd, dword_t arg) {

FILE: fs/fd.h
  type fd (line 14) | struct fd {
  type sdword_t (line 111) | typedef sdword_t fd_t;
  type fd (line 114) | struct fd
  type fd_ops (line 114) | struct fd_ops
  type fd (line 115) | struct fd
  type fd (line 115) | struct fd
  type fd (line 116) | struct fd
  type fd (line 118) | struct fd
  type fd (line 119) | struct fd
  type dir_entry (line 122) | struct dir_entry {
  type fd_ops (line 131) | struct fd_ops {
  type fdtable (line 171) | struct fdtable {
  type fdtable (line 179) | struct fdtable
  type fdtable (line 180) | struct fdtable
  type fdtable (line 181) | struct fdtable
  type fdtable (line 181) | struct fdtable
  type fdtable (line 182) | struct fdtable
  type fdtable (line 183) | struct fdtable
  type fd (line 184) | struct fd
  type fdtable (line 184) | struct fdtable
  type fd (line 186) | struct fd
  type fd (line 189) | struct fd

FILE: fs/generic.c
  type mount (line 13) | struct mount
  type mount (line 14) | struct mount
  function contains_mount_point (line 23) | bool contains_mount_point(const char *path) {
  type fd (line 34) | struct fd
  type fd (line 34) | struct fd
  type mount (line 44) | struct mount
  type fd (line 45) | struct fd
  type statbuf (line 55) | struct statbuf
  type fd (line 101) | struct fd
  function generic_getpath (line 105) | int generic_getpath(struct fd *fd, char *buf) {
  function generic_accessat (line 118) | int generic_accessat(struct fd *dirfd, const char *path_raw, int mode) {
  function generic_linkat (line 133) | int generic_linkat(struct fd *src_at, const char *src_raw, struct fd *ds...
  function generic_unlinkat (line 155) | int generic_unlinkat(struct fd *at, const char *path_raw) {
  function generic_renameat (line 168) | int generic_renameat(struct fd *src_at, const char *src_raw, struct fd *...
  function generic_symlinkat (line 192) | int generic_symlinkat(const char *target, struct fd *at, const char *lin...
  function generic_mknodat (line 205) | int generic_mknodat(struct fd *at, const char *path_raw, mode_t_ mode, d...
  function generic_setattrat (line 223) | int generic_setattrat(struct fd *at, const char *path_raw, struct attr a...
  function generic_utime (line 236) | int generic_utime(struct fd *at, const char *path_raw, struct timespec a...
  function generic_readlinkat (line 249) | ssize_t generic_readlinkat(struct fd *at, const char *path_raw, char *bu...
  function generic_mkdirat (line 262) | int generic_mkdirat(struct fd *at, const char *path_raw, mode_t_ mode) {
  function generic_rmdirat (line 275) | int generic_rmdirat(struct fd *at, const char *path_raw) {
  function generic_seek (line 290) | int generic_seek(struct fd *fd, off_t_ off, int whence, size_t size) {

FILE: fs/inode.c
  type list (line 9) | struct list
  type inode_data (line 13) | struct inode_data
  type mount (line 13) | struct mount
  type inode_data (line 17) | struct inode_data
  type inode_data (line 25) | struct inode_data
  type mount (line 25) | struct mount
  type inode_data (line 26) | struct inode_data
  type inode_data (line 28) | struct inode_data
  type inode_data (line 45) | struct inode_data
  type mount (line 45) | struct mount
  type inode_data (line 47) | struct inode_data
  function inode_check_orphaned (line 52) | void inode_check_orphaned(struct mount *mount, ino_t ino) {
  function inode_retain (line 60) | void inode_retain(struct inode_data *inode) {
  function inode_release (line 66) | void inode_release(struct inode_data *inode) {

FILE: fs/inode.h
  type mount (line 7) | struct mount
  type fd (line 8) | struct fd
  type inode_data (line 10) | struct inode_data {
  type inode_data (line 24) | struct inode_data
  type mount (line 24) | struct mount
  type inode_data (line 25) | struct inode_data
  type inode_data (line 26) | struct inode_data
  type inode_data (line 36) | struct inode_data
  type mount (line 36) | struct mount
  type mount (line 39) | struct mount
  type file_lock (line 47) | struct file_lock {
  type flock_ (line 56) | struct flock_ {
  type flock32_ (line 63) | struct flock32_ {
  type fd (line 71) | struct fd
  type flock_ (line 71) | struct flock_
  type fd (line 73) | struct fd
  type flock_ (line 73) | struct flock_
  type fd (line 76) | struct fd

FILE: fs/lock.c
  function file_locks_overlap (line 6) | static bool file_locks_overlap(struct file_lock *a, struct file_lock *b) {
  function file_locks_conflict (line 10) | static bool file_locks_conflict(struct file_lock *a, struct file_lock *b) {
  function file_locks_adjacent (line 21) | static bool file_locks_adjacent(struct file_lock *a, struct file_lock *b) {
  type file_lock (line 25) | struct file_lock
  type inode_data (line 25) | struct inode_data
  type file_lock (line 25) | struct file_lock
  type file_lock (line 26) | struct file_lock
  type file_lock (line 34) | struct file_lock
  type file_lock (line 34) | struct file_lock
  type file_lock (line 35) | struct file_lock
  type file_lock (line 35) | struct file_lock
  function file_lock_delete (line 45) | static void file_lock_delete(struct file_lock *lock) {
  function file_lock_acquire (line 50) | static int file_lock_acquire(struct inode_data *inode, struct file_lock ...
  function file_lock_from_flock (line 140) | static int file_lock_from_flock(struct fd *fd, struct flock_ *flock, str...
  function flock_from_file_lock (line 184) | static int flock_from_file_lock(struct file_lock *lock, struct flock_ *f...
  function fcntl_getlk (line 196) | int fcntl_getlk(struct fd *fd, struct flock_ *flock) {
  function fcntl_setlk (line 217) | int fcntl_setlk(struct fd *fd, struct flock_ *flock, bool blocking) {
  function file_lock_remove_owned_by (line 245) | void file_lock_remove_owned_by(struct fd *fd, void *owner) {

FILE: fs/mem.c
  type dev_ops (line 9) | struct dev_ops
  type dev_ops (line 16) | struct dev_ops
  function mem_open (line 31) | static int mem_open(int major, int minor, struct fd *fd) {
  type dev_ops (line 42) | struct dev_ops
  function ready_poll (line 46) | static int ready_poll(struct fd *UNUSED(fd)) {
  function null_open (line 51) | static int null_open(int UNUSED(major), int UNUSED(minor), struct fd *UN...
  function null_read (line 54) | static ssize_t null_read(struct fd *UNUSED(fd), void *UNUSED(buf), size_...
  function null_write (line 57) | static ssize_t null_write(struct fd *UNUSED(fd), const void *UNUSED(buf)...
  function off_t_ (line 60) | static off_t_ null_lseek(struct fd *UNUSED(fd), off_t_ UNUSED(off), int ...
  type dev_ops (line 63) | struct dev_ops
  function zero_read (line 71) | static ssize_t zero_read(struct fd *UNUSED(fd), void *buf, size_t bufsiz...
  function zero_write (line 75) | static ssize_t zero_write(struct fd *UNUSED(fd), const void *UNUSED(buf)...
  type dev_ops (line 78) | struct dev_ops
  function full_write (line 86) | static ssize_t full_write(struct fd *UNUSED(fd), const void *UNUSED(buf)...
  type dev_ops (line 89) | struct dev_ops
  function random_read (line 97) | static ssize_t random_read(struct fd *UNUSED(fd), void *buf, size_t bufs...
  type dev_ops (line 101) | struct dev_ops

FILE: fs/mem.h
  type dev_ops (line 7) | struct dev_ops

FILE: fs/mount.c
  type fs_ops (line 9) | struct fs_ops
  function fs_register (line 16) | void fs_register(const struct fs_ops *fs) {
  type mount (line 26) | struct mount
  type mount (line 29) | struct mount
  function mount_retain (line 41) | void mount_retain(struct mount *mount) {
  function mount_release (line 47) | void mount_release(struct mount *mount) {
  function do_mount (line 53) | int do_mount(const struct fs_ops *fs, const char *source, const char *po...
  function mount_remove (line 84) | int mount_remove(struct mount *mount) {
  function do_umount (line 98) | int do_umount(const char *point) {
  function mount_param_flag (line 113) | bool mount_param_flag(const char *info, const char *flag) {
  function dword_t (line 125) | dword_t sys_mount(addr_t source_addr, addr_t point_addr, addr_t type_add...
  function dword_t (line 177) | dword_t sys_umount2(addr_t target_addr, dword_t flags) {
  type list (line 193) | struct list

FILE: fs/path.c
  function __path_normalize (line 6) | static int __path_normalize(const char *at_path, const char *path, char ...
  function path_normalize (line 121) | int path_normalize(struct fd *at, const char *path, char *out, int flags) {
  function path_is_normalized (line 145) | bool path_is_normalized(const char *path) {
  function path_next_component (line 158) | bool path_next_component(const char **path, char *component, int *err) {

FILE: fs/path.h
  type fd (line 26) | struct fd

FILE: fs/pipe.c
  function fd_t (line 8) | static fd_t pipe_f_create(int pipe_fd, int flags) {
  function int_t (line 19) | int_t sys_pipe2(addr_t pipe_addr, int_t flags) {
  function int_t (line 55) | int_t sys_pipe(addr_t pipe_addr) {

FILE: fs/poll.c
  type real_poll (line 24) | struct real_poll
  type real_poll (line 25) | struct real_poll
  type real_poll_event (line 26) | struct real_poll_event {
  type real_poll_event (line 33) | struct real_poll_event
  type real_poll_event (line 34) | struct real_poll_event
  type real_poll (line 35) | struct real_poll
  type real_poll_event (line 35) | struct real_poll_event
  type timespec (line 35) | struct timespec
  type real_poll (line 36) | struct real_poll
  type poll (line 40) | struct poll
  type poll (line 41) | struct poll
  type poll (line 41) | struct poll
  function poll_fd_is_real (line 56) | static inline bool poll_fd_is_real(struct poll_fd *pollfd) {
  type poll_fd (line 61) | struct poll_fd
  type poll (line 61) | struct poll
  type fd (line 61) | struct fd
  type poll_fd (line 62) | struct poll_fd
  function poll_fd_free (line 71) | static void poll_fd_free(struct poll_fd *poll_fd) {
  function poll_has_fd (line 78) | bool poll_has_fd(struct poll *poll, struct fd *fd) {
  function poll_add_fd (line 82) | int poll_add_fd(struct poll *poll, struct fd *fd, int types, union poll_...
  function poll_del_fd (line 123) | int poll_del_fd(struct poll *poll, struct fd *fd) {
  function poll_mod_fd (line 152) | int poll_mod_fd(struct poll *poll, struct fd *fd, int types, union poll_...
  function poll_cleanup_fd (line 181) | void poll_cleanup_fd(struct fd *fd) {
  function poll_wakeup (line 196) | void poll_wakeup(struct fd *fd, int events) {
  function poll_wait (line 212) | int poll_wait(struct poll *poll_, poll_callback_t callback, void *contex...
  function poll_destroy (line 327) | void poll_destroy(struct poll *poll) {
  function real_poll_init (line 351) | static int real_poll_init(struct real_poll *real) {
  function real_poll_wait (line 358) | static int real_poll_wait(struct real_poll *real, struct real_poll_event...
  function real_poll_update (line 365) | static int real_poll_update(struct real_poll *real, int fd, int types, v...
  type real_poll_event (line 376) | struct real_poll_event
  function rpe_events (line 379) | static int rpe_events(struct real_poll_event *rpe) {
  function real_poll_init (line 385) | static int real_poll_init(struct real_poll *real) {
  function real_poll_update (line 392) | static int real_poll_update(struct real_poll *real, int fd, int types, v...
  function real_poll_wait (line 414) | static int real_poll_wait(struct real_poll *real, struct real_poll_event...
  type real_poll_event (line 418) | struct real_poll_event
  function rpe_events (line 421) | static int rpe_events(struct real_poll_event *rpe) {
  function real_poll_close (line 437) | static void real_poll_close(struct real_poll *real) {

FILE: fs/poll.h
  type real_poll (line 5) | struct real_poll {
  type poll (line 9) | struct poll {
  type poll_fd (line 33) | struct poll_fd {
  type poll_event (line 69) | struct poll_event {
  type poll (line 73) | struct poll
  type poll (line 74) | struct poll
  type fd (line 74) | struct fd
  type poll (line 75) | struct poll
  type fd (line 75) | struct fd
  type poll (line 76) | struct poll
  type fd (line 76) | struct fd
  type poll (line 77) | struct poll
  type fd (line 77) | struct fd
  type fd (line 81) | struct fd
  type poll (line 85) | struct poll
  type timespec (line 85) | struct timespec
  type poll (line 88) | struct poll
  type fd (line 91) | struct fd

FILE: fs/proc.c
  function proc_lookup (line 8) | static int proc_lookup(const char *path, struct proc_entry *entry) {
  type fd_ops (line 47) | struct fd_ops
  type fd (line 49) | struct fd
  type mount (line 49) | struct mount
  type proc_entry (line 50) | struct proc_entry
  type fd (line 54) | struct fd
  function proc_getpath (line 60) | static int proc_getpath(struct fd *fd, char *buf) {
  function proc_stat (line 79) | static int proc_stat(struct mount *UNUSED(mount), const char *path, stru...
  function proc_fstat (line 89) | static int proc_fstat(struct fd *fd, struct statbuf *stat) {
  function proc_refresh_data (line 93) | static int proc_refresh_data(struct fd *fd) {
  function off_t_ (line 111) | static off_t_ proc_seek(struct fd *fd, off_t_ off, int whence) {
  function proc_pread (line 123) | static ssize_t proc_pread(struct fd *fd, void *buf, size_t bufsize, off_...
  function proc_buf_write (line 147) | static void proc_buf_write(struct proc_data *buf, const void *data, size...
  function proc_pwrite (line 169) | static ssize_t proc_pwrite(struct fd *fd, const void *buf, size_t bufsiz...
  function proc_readdir (line 190) | static int proc_readdir(struct fd *fd, struct dir_entry *entry) {
  function proc_close (line 201) | static int proc_close(struct fd *fd) {
  type fd_ops (line 208) | struct fd_ops
  function proc_readlink (line 216) | static ssize_t proc_readlink(struct mount *UNUSED(mount), const char *pa...
  function proc_unlink (line 237) | static int proc_unlink(struct mount *UNUSED(mount), const char *path) {
  function proc_buf_append (line 249) | void proc_buf_append(struct proc_data *buf, const void *data, size_t siz...
  function proc_printf (line 253) | void proc_printf(struct proc_data *buf, const char *format, ...) {
  type fs_ops (line 262) | struct fs_ops

FILE: fs/proc.h
  type proc_entry (line 7) | struct proc_entry {
  type proc_data (line 16) | struct proc_data {
  type proc_dir_entry (line 22) | struct proc_dir_entry {
  type proc_children (line 57) | struct proc_children {
  type proc_dir_entry (line 64) | struct proc_dir_entry
  type proc_dir_entry (line 65) | struct proc_dir_entry
  type proc_children (line 66) | struct proc_children
  type proc_entry (line 68) | struct proc_entry
  type proc_entry (line 69) | struct proc_entry
  type proc_entry (line 70) | struct proc_entry
  type statbuf (line 70) | struct statbuf
  type proc_entry (line 71) | struct proc_entry
  type proc_entry (line 75) | struct proc_entry
  type proc_entry (line 75) | struct proc_entry
  type proc_data (line 77) | struct proc_data
  type proc_data (line 78) | struct proc_data

FILE: fs/proc/entry.c
  function mode_t_ (line 7) | mode_t_ proc_entry_mode(struct proc_entry *entry) {
  function proc_entry_stat (line 22) | int proc_entry_stat(struct proc_entry *entry, struct statbuf *stat) {
  function proc_entry_getname (line 40) | void proc_entry_getname(struct proc_entry *entry, char *buf) {
  function proc_dir_read (line 49) | bool proc_dir_read(struct proc_entry *entry, unsigned long *index, struc...
  function free_string_array (line 64) | void free_string_array(char **array) {
  function proc_entry_cleanup (line 70) | void proc_entry_cleanup(struct proc_entry *entry) {

FILE: fs/proc/ish.c
  function proc_ish_show_colors (line 19) | static int proc_ish_show_colors(struct proc_entry *UNUSED(entry), struct...
  function proc_ish_show_documents (line 57) | static int proc_ish_show_documents(struct proc_entry *UNUSED(entry), str...
  function proc_ish_defaults_getname (line 68) | static void proc_ish_defaults_getname(struct proc_entry *entry, char *bu...
  function proc_ish_defaults_readlink (line 72) | static int proc_ish_defaults_readlink(struct proc_entry *entry, char *bu...
  function proc_ish_underlying_defaults_show (line 79) | static int proc_ish_underlying_defaults_show(struct proc_entry *entry, s...
  function proc_ish_underlying_defaults_update (line 89) | static int proc_ish_underlying_defaults_update(struct proc_entry *entry,...
  function proc_ish_underlying_defaults_unlink (line 95) | static int proc_ish_underlying_defaults_unlink(struct proc_entry *entry) {
  function proc_ish_defaults_unlink (line 99) | static int proc_ish_defaults_unlink(struct proc_entry *entry) {
  type proc_dir_entry (line 106) | struct proc_dir_entry
  type proc_dir_entry (line 112) | struct proc_dir_entry
  function get_child_names (line 118) | static void get_child_names(struct proc_entry *entry, unsigned long inde...
  function proc_ish_underlying_defaults_readdir (line 130) | static bool proc_ish_underlying_defaults_readdir(struct proc_entry *entr...
  function proc_ish_defaults_readdir (line 140) | static bool proc_ish_defaults_readdir(struct proc_entry *entry, unsigned...
  function proc_ish_show_version (line 158) | static int proc_ish_show_version(struct proc_entry *UNUSED(entry), struc...
  type proc_children (line 163) | struct proc_children

FILE: fs/proc/ish.h
  type user_default_key (line 4) | struct user_default_key {

FILE: fs/proc/pid.c
  function proc_pid_getname (line 12) | static void proc_pid_getname(struct proc_entry *entry, char *buf) {
  type task (line 16) | struct task
  type proc_entry (line 16) | struct proc_entry
  type task (line 18) | struct task
  function proc_put_task (line 23) | static void proc_put_task(struct task *UNUSED(task)) {
  function proc_pid_stat_show (line 27) | static int proc_pid_stat_show(struct proc_entry *entry, struct proc_data...
  function proc_pid_statm_show (line 107) | static int proc_pid_statm_show(struct proc_entry *entry, struct proc_dat...
  function proc_pid_auxv_show (line 125) | static int proc_pid_auxv_show(struct proc_entry *entry, struct proc_data...
  function proc_pid_cmdline_show (line 150) | static int proc_pid_cmdline_show(struct proc_entry *entry, struct proc_d...
  function proc_maps_dump (line 175) | void proc_maps_dump(struct task *task, struct proc_data *buf) {
  function proc_pid_maps_show (line 229) | static int proc_pid_maps_show(struct proc_entry *entry, struct proc_data...
  function proc_pid_mem_pread (line 238) | static ssize_t proc_pid_mem_pread(struct proc_entry *entry, struct proc_...
  function proc_pid_mem_pwrite (line 247) | static ssize_t proc_pid_mem_pwrite(struct proc_entry *entry, struct proc...
  type proc_dir_entry (line 257) | struct proc_dir_entry
  function proc_pid_fd_readdir (line 259) | static bool proc_pid_fd_readdir(struct proc_entry *entry, unsigned long ...
  function proc_pid_fd_getname (line 274) | static void proc_pid_fd_getname(struct proc_entry *entry, char *buf) {
  function proc_pid_fd_readlink (line 278) | static int proc_pid_fd_readlink(struct proc_entry *entry, char *buf) {
  function proc_pid_exe_readlink (line 290) | static int proc_pid_exe_readlink(struct proc_entry *entry, char *buf) {
  function proc_pid_task_getname (line 301) | static void proc_pid_task_getname(struct proc_entry *entry, char *buf) {
  function proc_pid_task_readlink (line 305) | static int proc_pid_task_readlink(struct proc_entry *entry, char *buf) {
  type proc_dir_entry (line 310) | struct proc_dir_entry
  function proc_pid_task_readdir (line 312) | static bool proc_pid_task_readdir(struct proc_entry *entry, unsigned lon...
  function proc_pid_cwd_readlink (line 318) | static int proc_pid_cwd_readlink(struct proc_entry *entry, char *buf) {
  type proc_children (line 330) | struct proc_children
  type proc_dir_entry (line 343) | struct proc_dir_entry
  type proc_dir_entry (line 346) | struct proc_dir_entry
  type proc_dir_entry (line 349) | struct proc_dir_entry

FILE: fs/proc/root.c
  function proc_show_version (line 8) | static int proc_show_version(struct proc_entry *UNUSED(entry), struct pr...
  function proc_show_stat (line 15) | static int proc_show_stat(struct proc_entry *UNUSED(entry), struct proc_...
  function proc_show_cpuinfo (line 28) | static int proc_show_cpuinfo(struct proc_entry *UNUSED(entry), struct pr...
  function show_kb (line 38) | static void show_kb(struct proc_data *buf, const char *name, uint64_t va...
  function proc_show_meminfo (line 42) | static int proc_show_meminfo(struct proc_entry *UNUSED(entry), struct pr...
  function proc_show_uptime (line 61) | static int proc_show_uptime(struct proc_entry *UNUSED(entry), struct pro...
  function proc_readlink_self (line 68) | static int proc_readlink_self(struct proc_entry *UNUSED(entry), char *bu...
  function proc_print_escaped (line 73) | static void proc_print_escaped(struct proc_data *buf, const char *str) {
  function proc_show_mounts (line 90) | static int proc_show_mounts(struct proc_entry *UNUSED(entry), struct pro...
  type proc_dir_entry (line 117) | struct proc_dir_entry
  function proc_root_readdir (line 129) | static bool proc_root_readdir(struct proc_entry *UNUSED(entry), unsigned...
  type proc_dir_entry (line 153) | struct proc_dir_entry

FILE: fs/pty.c
  type tty_driver (line 10) | struct tty_driver
  function pty_slave_init_inode (line 15) | static void pty_slave_init_inode(struct tty *tty) {
  function pty_master_init (line 22) | static int pty_master_init(struct tty *tty) {
  function pty_hangup (line 38) | static void pty_hangup(struct tty *tty) {
  type tty (line 46) | struct tty
  type tty (line 46) | struct tty
  type tty (line 47) | struct tty
  function pty_slave_cleanup (line 54) | static void pty_slave_cleanup(struct tty *tty) {
  function pty_master_cleanup (line 58) | static void pty_master_cleanup(struct tty *tty) {
  function pty_slave_open (line 64) | static int pty_slave_open(struct tty *tty) {
  function pty_slave_close (line 72) | static int pty_slave_close(struct tty *tty) {
  function pty_master_ioctl (line 82) | static int pty_master_ioctl(struct tty *tty, int cmd, void *arg) {
  function pty_write (line 103) | static int pty_write(struct tty *tty, const void *buf, size_t len, bool ...
  function pty_return_eio (line 107) | static int pty_return_eio(struct tty *UNUSED(tty)) {
  type tty_driver_ops (line 113) | struct tty_driver_ops
  type tty_driver_ops (line 122) | struct tty_driver_ops
  function pty_reserve_next (line 131) | static int pty_reserve_next() {
  function ptmx_open (line 143) | int ptmx_open(struct fd *fd) {
  type tty (line 153) | struct tty
  type tty_driver (line 153) | struct tty_driver
  type tty (line 161) | struct tty
  function isdigits (line 168) | static bool isdigits(const char *str) {
  type fd_ops (line 175) | struct fd_ops
  function devpts_pty_exists (line 177) | static bool devpts_pty_exists(int pty_num) {
  function devpts_get_pty_num (line 188) | static int devpts_get_pty_num(const char *path) {
  type fd (line 208) | struct fd
  type mount (line 208) | struct mount
  type fd (line 212) | struct fd
  function devpts_getpath (line 217) | static int devpts_getpath(struct fd *fd, char *buf) {
  function devpts_stat_num (line 225) | static void devpts_stat_num(int pty_num, struct statbuf *stat) {
  function devpts_setattr_num (line 247) | static int devpts_setattr_num(int pty_num, struct attr attr) {
  function devpts_fstat (line 275) | static int devpts_fstat(struct fd *fd, struct statbuf *stat) {
  function devpts_stat (line 280) | static int devpts_stat(struct mount *UNUSED(mount), const char *path, st...
  function devpts_setattr (line 288) | static int devpts_setattr(struct mount *UNUSED(mount), const char *path,...
  function devpts_fsetattr (line 296) | static int devpts_fsetattr(struct fd *fd, struct attr attr) {
  function devpts_readdir (line 301) | static int devpts_readdir(struct fd *fd, struct dir_entry *entry) {
  type fs_ops (line 315) | struct fs_ops
  type fd_ops (line 325) | struct fd_ops

FILE: fs/real.c
  function getpath (line 23) | static int getpath(int fd, char *buf) {
  function open_flags_real_from_fake (line 36) | static int open_flags_real_from_fake(int flags) {
  function open_flags_fake_from_real (line 49) | static int open_flags_fake_from_real(int flags) {
  type fd (line 62) | struct fd
  type mount (line 62) | struct mount
  type fd (line 67) | struct fd
  function realfs_close (line 73) | int realfs_close(struct fd *fd) {
  function copy_stat (line 82) | static void copy_stat(struct statbuf *fake_stat, struct stat *real_stat) {
  function realfs_stat (line 107) | int realfs_stat(struct mount *mount, const char *path, struct statbuf *f...
  function realfs_fstat (line 115) | int realfs_fstat(struct fd *fd, struct statbuf *fake_stat) {
  function realfs_read (line 123) | ssize_t realfs_read(struct fd *fd, void *buf, size_t bufsize) {
  function realfs_write (line 130) | ssize_t realfs_write(struct fd *fd, const void *buf, size_t bufsize) {
  function realfs_pread (line 137) | ssize_t realfs_pread(struct fd *fd, void *buf, size_t bufsize, off_t off) {
  function realfs_pwrite (line 144) | ssize_t realfs_pwrite(struct fd *fd, const void *buf, size_t bufsize, of...
  function realfs_opendir (line 151) | void realfs_opendir(struct fd *fd) {
  function realfs_readdir (line 160) | int realfs_readdir(struct fd *fd, struct dir_entry *entry) {
  function realfs_telldir (line 175) | unsigned long realfs_telldir(struct fd *fd) {
  function realfs_seekdir (line 180) | void realfs_seekdir(struct fd *fd, unsigned long ptr) {
  function off_t (line 185) | off_t realfs_lseek(struct fd *fd, off_t offset, int whence) {
  function realfs_poll (line 205) | int realfs_poll(struct fd *fd) {
  function realfs_mmap (line 249) | int realfs_mmap(struct fd *fd, struct mem *mem, page_t start, pages_t pa...
  function realfs_readlink (line 263) | ssize_t realfs_readlink(struct mount *mount, const char *path, char *buf...
  function realfs_getpath (line 270) | int realfs_getpath(struct fd *fd, char *buf) {
  function realfs_link (line 281) | int realfs_link(struct mount *mount, const char *src, const char *dst) {
  function realfs_unlink (line 288) | int realfs_unlink(struct mount *mount, const char *path) {
  function realfs_rmdir (line 295) | int realfs_rmdir(struct mount *mount, const char *path) {
  function realfs_rename (line 302) | int realfs_rename(struct mount *mount, const char *src, const char *dst) {
  function realfs_symlink (line 309) | int realfs_symlink(struct mount *mount, const char *target, const char *...
  function realfs_mknod (line 316) | int realfs_mknod(struct mount *mount, const char *path, mode_t_ mode, de...
  function realfs_truncate (line 334) | int realfs_truncate(struct mount *mount, const char *path, off_t_ size) {
  function realfs_setattr (line 345) | int realfs_setattr(struct mount *mount, const char *path, struct attr at...
  function realfs_fsetattr (line 369) | int realfs_fsetattr(struct fd *fd, struct attr attr) {
  function realfs_utime (line 392) | int realfs_utime(struct mount *mount, const char *path, struct timespec ...
  function realfs_mkdir (line 400) | int realfs_mkdir(struct mount *mount, const char *path, mode_t_ mode) {
  function realfs_flock (line 407) | int realfs_flock(struct fd *fd, int operation) {
  function realfs_statfs (line 416) | int realfs_statfs(struct mount *mount, struct statfsbuf *stat) {
  function realfs_mount (line 430) | int realfs_mount(struct mount *mount) {
  function realfs_fsync (line 443) | int realfs_fsync(struct fd *fd) {
  function realfs_getflags (line 450) | int realfs_getflags(struct fd *fd) {
  function realfs_setflags (line 457) | int realfs_setflags(struct fd *fd, dword_t flags) {
  function realfs_ioctl_size (line 464) | ssize_t realfs_ioctl_size(int cmd) {
  function realfs_ioctl (line 470) | int realfs_ioctl(struct fd *fd, int cmd, void *arg) {
  type fs_ops (line 484) | struct fs_ops
  type fd_ops (line 510) | struct fd_ops

FILE: fs/real.h
  type fd_ops (line 6) | struct fd_ops
  type fs_ops (line 7) | struct fs_ops
  type fd (line 9) | struct fd
  type mount (line 9) | struct mount
  type mount (line 11) | struct mount
  type mount (line 12) | struct mount
  type mount (line 13) | struct mount
  type mount (line 14) | struct mount
  type mount (line 15) | struct mount
  type mount (line 16) | struct mount
  type mount (line 17) | struct mount
  type mount (line 19) | struct mount
  type statbuf (line 19) | struct statbuf
  type mount (line 20) | struct mount
  type statfsbuf (line 20) | struct statfsbuf
  type fd (line 21) | struct fd
  type statbuf (line 21) | struct statbuf
  type mount (line 22) | struct mount
  type attr (line 22) | struct attr
  type fd (line 23) | struct fd
  type attr (line 23) | struct attr
  type mount (line 25) | struct mount
  type mount (line 27) | struct mount
  type mount (line 28) | struct mount
  type timespec (line 28) | struct timespec
  type timespec (line 28) | struct timespec
  type mount (line 30) | struct mount
  type statfsbuf (line 30) | struct statfsbuf
  type fd (line 31) | struct fd
  type fd (line 32) | struct fd
  type fd (line 33) | struct fd
  type fd (line 34) | struct fd
  type fd (line 36) | struct fd
  type dir_entry (line 36) | struct dir_entry
  type fd (line 37) | struct fd
  type fd (line 38) | struct fd
  type fd (line 40) | struct fd
  type fd (line 42) | struct fd
  type fd (line 43) | struct fd
  type mem (line 43) | struct mem
  type fd (line 44) | struct fd
  type fd (line 45) | struct fd
  type fd (line 46) | struct fd
  type fd (line 48) | struct fd
  type fd (line 49) | struct fd

FILE: fs/sock.c
  type fd_ops (line 17) | struct fd_ops
  function fd_t (line 21) | static fd_t sock_fd_create(int sock_fd, int domain, int type, int protoc...
  function int_t (line 37) | int_t sys_socket(dword_t domain, dword_t type, dword_t protocol) {
  function inode_release_if_exist (line 69) | static void inode_release_if_exist(struct inode_data *inode) {
  type fd (line 74) | struct fd
  type fd (line 75) | struct fd
  function unix_socket_next_id (line 81) | static uint32_t unix_socket_next_id() {
  function unix_socket_get (line 90) | static int unix_socket_get(const char *path_raw, struct fd *bind_fd, uin...
  function str_hash (line 153) | static uint32_t str_hash(const char *str) {
  type unix_abstract (line 165) | struct unix_abstract {
  type list (line 172) | struct list
  function unix_abstract_get (line 175) | static int unix_abstract_get(const char *name, struct fd *bind_fd, uint3...
  function unix_abstract_release (line 215) | static void unix_abstract_release(struct unix_abstract *name) {
  function sockaddr_read_bind (line 226) | static int sockaddr_read_bind(addr_t sockaddr_addr, void *sockaddr, uint...
  function sockaddr_read (line 291) | static int sockaddr_read(addr_t sockaddr_addr, void *sockaddr, uint_t *s...
  function sockaddr_write (line 298) | static int sockaddr_write(addr_t sockaddr_addr, void *sockaddr, uint_t b...
  function int_t (line 328) | int_t sys_bind(fd_t sock_fd, addr_t sockaddr_addr, uint_t sockaddr_len) {
  function fill_cred (line 350) | static void fill_cred(struct ucred_ *cred) {
  function int_t (line 356) | int_t sys_connect(fd_t sock_fd, addr_t sockaddr_addr, uint_t sockaddr_le...
  function int_t (line 387) | int_t sys_listen(fd_t sock_fd, int_t backlog) {
  function int_t (line 399) | int_t sys_accept(fd_t sock_fd, addr_t sockaddr_addr, addr_t sockaddr_len...
  function copy_unix_name (line 453) | static void copy_unix_name(char *sockaddr, dword_t *sockaddr_len, struct...
  function int_t (line 466) | int_t sys_getsockname(fd_t sock_fd, addr_t sockaddr_addr, addr_t sockadd...
  function int_t (line 498) | int_t sys_getpeername(fd_t sock_fd, addr_t sockaddr_addr, addr_t sockadd...
  function int_t (line 523) | int_t sys_socketpair(dword_t domain, dword_t type, dword_t protocol, add...
  function int_t (line 572) | int_t sys_sendto(fd_t sock_fd, addr_t buffer_addr, dword_t len, dword_t ...
  function int_t (line 604) | int_t sys_recvfrom(fd_t sock_fd, addr_t buffer_addr, dword_t len, dword_...
  function int_t (line 643) | int_t sys_send(fd_t sock_fd, addr_t buf, dword_t len, int_t flags) {
  function int_t (line 647) | int_t sys_recv(fd_t sock_fd, addr_t buf, dword_t len, int_t flags) {
  function int_t (line 651) | int_t sys_shutdown(fd_t sock_fd, dword_t how) {
  function int_t (line 664) | int_t sys_setsockopt(fd_t sock_fd, dword_t level, dword_t option, addr_t...
  function int_t (line 706) | int_t sys_getsockopt(fd_t sock_fd, dword_t level, dword_t option, addr_t...
  function scm_free (line 819) | static void scm_free(struct scm *scm) {
  function int_t (line 825) | int_t sys_sendmsg(fd_t sock_fd, addr_t msghdr_addr, int_t flags) {
  function int_t (line 974) | int_t sys_recvmsg(fd_t sock_fd, addr_t msghdr_addr, int_t flags) {
  type mmsghdr_ (line 1097) | struct mmsghdr_ {
  function int_t (line 1102) | int_t sys_sendmmsg(fd_t sock_fd, addr_t msg_vec, uint_t vec_len, int_t f...
  function sock_translate_err (line 1130) | static void sock_translate_err(struct fd *fd, int *err) {
  function sock_read (line 1143) | static ssize_t sock_read(struct fd *fd, void *buf, size_t size) {
  function sock_write (line 1149) | static ssize_t sock_write(struct fd *fd, const void *buf, size_t size) {
  function sock_close (line 1155) | static int sock_close(struct fd *fd) {
  type fd_ops (line 1178) | struct fd_ops
  type socket_call (line 1195) | struct socket_call {
  function int_t (line 1222) | int_t sys_socketcall(dword_t call_num, addr_t args_addr) {

FILE: fs/sock.h
  type sockaddr_ (line 33) | struct sockaddr_ {
  type sockaddr_max_ (line 37) | struct sockaddr_max_ {
  type sockaddr (line 44) | struct sockaddr
  type msghdr_ (line 46) | struct msghdr_ {
  type cmsghdr_ (line 56) | struct cmsghdr_ {
  type scm (line 70) | struct scm {
  function sock_family_to_real (line 82) | static inline int sock_family_to_real(int fake) {
  function sock_family_from_real (line 90) | static inline int sock_family_from_real(int fake) {
  function sock_type_to_real (line 105) | static inline int sock_type_to_real(int type, int protocol) {
  function sock_flags_to_real (line 145) | static inline int sock_flags_to_real(int fake) {
  function sock_flags_from_real (line 158) | static inline int sock_flags_from_real(int real) {
  function sock_opt_to_real (line 204) | static inline int sock_opt_to_real(int fake, int level) {
  function sock_level_to_real (line 244) | static inline int sock_level_to_real(int fake) {
  type tcp_info_ (line 252) | struct tcp_info_ {

FILE: fs/sockrestart.c
  type fd_ops (line 9) | struct fd_ops
  type list (line 12) | struct list
  function sockrestart_begin_listen (line 14) | void sockrestart_begin_listen(struct fd *sock) {
  function sockrestart_end_listen (line 22) | void sockrestart_end_listen(struct fd *sock) {
  type list (line 30) | struct list
  function sockrestart_begin_listen_wait (line 32) | void sockrestart_begin_listen_wait(struct fd *sock) {
  function sockrestart_end_listen_wait (line 42) | void sockrestart_end_listen_wait(struct fd *sock) {
  function sockrestart_should_restart_listen_wait (line 52) | bool sockrestart_should_restart_listen_wait() {
  type saved_socket (line 60) | struct saved_socket {
  type list (line 72) | struct list
  function sockrestart_on_suspend (line 76) | void sockrestart_on_suspend() {
  function sockrestart_on_resume (line 96) | void sockrestart_on_resume() {

FILE: fs/sockrestart.h
  type fd (line 17) | struct fd
  type fd (line 19) | struct fd
  type fd (line 20) | struct fd
  type fd (line 21) | struct fd
  type fd (line 22) | struct fd
  type fd_sockrestart (line 27) | struct fd_sockrestart {
  type task_sockrestart (line 31) | struct task_sockrestart {

FILE: fs/stat.c
  function stat_convert_newstat64 (line 11) | struct newstat64 stat_convert_newstat64(struct statbuf stat) {
  function generic_statat (line 33) | int generic_statat(struct fd *at, const char *path_raw, struct statbuf *...
  type fd (line 46) | struct fd
  function dword_t (line 52) | static dword_t sys_stat_path(fd_t at_f, addr_t path_addr, addr_t statbuf...
  function dword_t (line 70) | dword_t sys_stat64(addr_t path_addr, addr_t statbuf_addr) {
  function dword_t (line 74) | dword_t sys_lstat64(addr_t path_addr, addr_t statbuf_addr) {
  function dword_t (line 78) | dword_t sys_fstatat64(fd_t at, addr_t path_addr, addr_t statbuf_addr, dw...
  function dword_t (line 82) | dword_t sys_fstat64(fd_t fd_no, addr_t statbuf_addr) {
  function dword_t (line 97) | dword_t sys_statx(fd_t at_f, addr_t path_addr, int_t flags, uint_t mask,...

FILE: fs/stat.h
  type statbuf (line 6) | struct statbuf {
  type oldstat (line 25) | struct oldstat {
  type newstat (line 39) | struct newstat {
  type newstat64 (line 59) | struct newstat64 {
  type statfsbuf (line 81) | struct statfsbuf {
  type statfs_ (line 96) | struct statfs_ {
  type statfs64_ (line 111) | struct statfs64_ {
  type statx_timestamp_ (line 126) | struct statx_timestamp_ {
  type statx_ (line 132) | struct statx_ {

FILE: fs/tmp.c
  type tmp_inode (line 14) | struct tmp_inode {
  type tmp_inode (line 25) | struct tmp_inode
  type tmp_inode (line 26) | struct tmp_inode
  type tmp_inode (line 26) | struct tmp_inode
  type statbuf (line 32) | struct statbuf
  function tmp_inode_cleanup (line 49) | DEFINE_REFCOUNT_STATIC(tmp_inode)
  type tmp_dirent (line 62) | struct tmp_dirent {
  function tmp_dirent_cleanup (line 76) | DEFINE_REFCOUNT_STATIC(tmp_dirent)
  function tmp_dirent_init (line 84) | static void tmp_dirent_init(struct tmp_dirent *dirent) {
  function tmpfs_dir_link (line 93) | static int tmpfs_dir_link(struct tmp_dirent *dir, const char *name, stru...
  function tmpfs_fd_seekdir (line 116) | static void tmpfs_fd_seekdir(struct fd *fd, struct tmp_dirent *dirent) {
  type tmp_dirent (line 124) | struct tmp_dirent
  type tmp_dirent (line 124) | struct tmp_dirent
  type tmp_dirent (line 127) | struct tmp_dirent
  type tmp_dirent (line 128) | struct tmp_dirent
  function tmpfs_dir_lookup_existence (line 143) | static int tmpfs_dir_lookup_existence(struct tmp_dirent *dir, const char...
  type tmp_dirent (line 153) | struct tmp_dirent
  type mount (line 153) | struct mount
  type tmp_dirent (line 154) | struct tmp_dirent
  type tmp_dirent (line 155) | struct tmp_dirent
  type tmp_dirent (line 164) | struct tmp_dirent
  type tmp_dirent (line 180) | struct tmp_dirent
  type mount (line 180) | struct mount
  type tmp_dirent (line 183) | struct tmp_dirent
  type mount (line 183) | struct mount
  function tmpfs_file_resize (line 189) | static int tmpfs_file_resize(struct tmp_inode *file, size_t size) {
  type fd_ops (line 205) | struct fd_ops
  function tmpfs_mount (line 207) | static int tmpfs_mount(struct mount *mount) {
  function tmpfs_unmount_tree (line 229) | static void tmpfs_unmount_tree(struct tmp_inode *tree) {
  function tmpfs_umount (line 243) | static int tmpfs_umount(struct mount *UNUSED(mount)) {
  type fd (line 251) | struct fd
  type mount (line 251) | struct mount
  type tmp_dirent (line 252) | struct tmp_dirent
  type tmp_dirent (line 256) | struct tmp_dirent
  type tmp_inode (line 269) | struct tmp_inode
  type fd (line 294) | struct fd
  function tmpfs_stat (line 310) | static int tmpfs_stat(struct mount *mount, const char *path, struct stat...
  function tmpfs_close (line 322) | static int tmpfs_close(struct fd *fd) {
  function tmpfs_mkdir (line 329) | static int tmpfs_mkdir(struct mount *mount, const char *path, mode_t_ mo...
  type tmp_inode (line 356) | struct tmp_inode
  type fd (line 356) | struct fd
  function tmpfs_getpath (line 360) | static int tmpfs_getpath(struct fd *fd, char *buf) {
  function tmpfs_fstat (line 377) | static int tmpfs_fstat(struct fd *fd, struct statbuf *stat) {
  function tmpfs_read (line 385) | static ssize_t tmpfs_read(struct fd *fd, void *buf, size_t bufsize) {
  function tmpfs_write (line 408) | static ssize_t tmpfs_write(struct fd *fd, const void *buf, size_t bufsiz...
  function off_t_ (line 431) | static off_t_ tmpfs_lseek(struct fd *fd, off_t_ off, int whence) {
  function tmpfs_readdir (line 447) | static int tmpfs_readdir(struct fd *fd, struct dir_entry *entry) {
  function tmpfs_telldir (line 475) | static unsigned long tmpfs_telldir(struct fd *fd) {
  function tmpfs_seekdir (line 481) | static void tmpfs_seekdir(struct fd *fd, unsigned long ptr) {
  type fs_ops (line 496) | struct fs_ops
  type fd_ops (line 508) | struct fd_ops

FILE: fs/tty-real.c
  type tty (line 19) | struct tty
  function termios_from_real (line 39) | static struct termios_ termios_from_real(struct termios real) {
  type termios (line 83) | struct termios
  function real_tty_init (line 85) | static int real_tty_init(struct tty *tty) {
  function real_tty_write (line 122) | static int real_tty_write(struct tty *tty, const void *buf, size_t len, ...
  function real_tty_reset_term (line 128) | void real_tty_reset_term() {
  function real_tty_cleanup (line 136) | static void real_tty_cleanup(struct tty *tty) {
  type tty_driver_ops (line 143) | struct tty_driver_ops

FILE: fs/tty.c
  type tty_driver (line 9) | struct tty_driver
  type tty_driver (line 10) | struct tty_driver
  type tty_driver (line 12) | struct tty_driver
  type tty (line 21) | struct tty
  type tty_driver (line 21) | struct tty_driver
  type tty (line 22) | struct tty
  type tty (line 22) | struct tty
  type tty (line 55) | struct tty
  type tty_driver (line 55) | struct tty_driver
  type tty (line 57) | struct tty
  type tty (line 83) | struct tty
  type tty (line 83) | struct tty
  function tty_poll_wakeup (line 91) | static void tty_poll_wakeup(struct tty *tty, int events) {
  function tty_release (line 102) | void tty_release(struct tty *tty) {
  function tty_set_controlling (line 118) | static void tty_set_controlling(struct tgroup *group, struct tty *tty) {
  function tty_open (line 133) | int tty_open(struct tty *tty, struct fd *fd) {
  function tty_device_open (line 155) | static int tty_device_open(int major, int minor, struct fd *fd) {
  function tty_close (line 199) | static int tty_close(struct fd *fd) {
  function tty_input_wakeup (line 214) | static void tty_input_wakeup(struct tty *tty) {
  function tty_push_char (line 219) | static int tty_push_char(struct tty *tty, char ch, bool flag, int blocki...
  function tty_echo (line 231) | static void tty_echo(struct tty *tty, const char *data, size_t size) {
  function tty_send_input_signal (line 235) | static bool tty_send_input_signal(struct tty *tty, char ch, sigset_t_ *q...
  function tty_input (line 259) | ssize_t tty_input(struct tty *tty, const char *input, size_t size, bool ...
  function tty_read_into_buf (line 388) | static void tty_read_into_buf(struct tty *tty, void *buf, size_t bufsize) {
  function tty_canon_size (line 397) | static size_t tty_canon_size(struct tty *tty) {
  function pty_is_half_closed_master (line 404) | static bool pty_is_half_closed_master(struct tty *tty) {
  function tty_is_current (line 416) | static bool tty_is_current(struct tty *tty) {
  function tty_signal_if_background (line 423) | static int tty_signal_if_background(struct tty *tty, pid_t_ current_pgid...
  function tty_read (line 438) | static ssize_t tty_read(struct fd *fd, void *buf, size_t bufsize) {
  function tty_write (line 540) | static ssize_t tty_write(struct fd *fd, const void *buf, size_t bufsize) {
  function tty_poll (line 582) | static int tty_poll(struct fd *fd) {
  function tty_ioctl_size (line 604) | static ssize_t tty_ioctl_size(int cmd) {
  function tiocsctty (line 621) | static int tiocsctty(struct tty *tty, int force) {
  function tiocgpgrp (line 662) | static int tiocgpgrp(struct tty *tty, pid_t_ *fg_group) {
  function tty_mode_ioctl (line 684) | static int tty_mode_ioctl(struct tty *in_tty, int cmd, void *arg) {
  function tty_ioctl (line 723) | static int tty_ioctl(struct fd *fd, int cmd, void *arg) {
  function tty_set_winsize (line 789) | void tty_set_winsize(struct tty *tty, struct winsize_ winsize) {
  function tty_hangup (line 795) | void tty_hangup(struct tty *tty) {
  type dev_ops (line 800) | struct dev_ops

FILE: fs/tty.h
  type winsize_ (line 7) | struct winsize_ {
  type termios_ (line 15) | struct termios_ {
  type tty_driver (line 82) | struct tty_driver {
  type tty_driver_ops (line 93) | struct tty_driver_ops {
  type tty_driver (line 103) | struct tty_driver
  type tty_driver (line 104) | struct tty_driver
  type tty (line 106) | struct tty {
  type tty (line 152) | struct tty
  type tty (line 153) | struct tty
  type winsize_ (line 153) | struct winsize_
  type tty (line 154) | struct tty
  type tty (line 157) | struct tty
  type tty_driver (line 157) | struct tty_driver
  type tty (line 158) | struct tty
  type tty_driver (line 158) | struct tty_driver
  type tty (line 159) | struct tty
  type fd (line 159) | struct fd
  type tty (line 161) | struct tty
  type dev_ops (line 163) | struct dev_ops
  type dev_ops (line 164) | struct dev_ops
  type fd (line 166) | struct fd
  type tty (line 168) | struct tty
  type tty_driver (line 168) | struct tty_driver

FILE: kernel/calls.c
  function dword_t (line 9) | dword_t syscall_stub(void) {
  function dword_t (line 15) | dword_t syscall_silent_stub(void) {
  function dword_t (line 18) | dword_t syscall_success_stub(void) {
  function handle_interrupt (line 259) | void handle_interrupt(int interrupt) {
  function dump_maps (line 331) | void dump_maps(void) {
  function dump_mem (line 348) | void dump_mem(addr_t start, uint_t len) {
  function dump_stack (line 363) | void dump_stack(int lines) {

FILE: kernel/calls.h
  type task (line 21) | struct task
  type task (line 22) | struct task
  type task (line 23) | struct task
  type iovec_ (line 67) | struct iovec_ {
  type pollfd_ (line 90) | struct pollfd_ {
  type task (line 206) | struct task
  type uname (line 219) | struct uname {
  type uname (line 227) | struct uname
  type sys_info (line 231) | struct sys_info {

FILE: kernel/elf.h
  type elf_header (line 16) | struct elf_header {
  type prg_header (line 49) | struct prg_header {
  type aux_ent (line 64) | struct aux_ent {
  type dyn_ent (line 90) | struct dyn_ent {
  type elf_sym (line 100) | struct elf_sym {

FILE: kernel/epoll.c
  type fd_ops (line 4) | struct fd_ops
  function fd_t (line 6) | fd_t sys_epoll_create(int_t flags) {
  function fd_t (line 20) | fd_t sys_epoll_create0() {
  type epoll_event_ (line 24) | struct epoll_event_ {
  function int_t (line 35) | int_t sys_epoll_ctl(fd_t epoll_f, int_t op, fd_t f, addr_t event_addr) {
  type epoll_context (line 63) | struct epoll_context {
  function epoll_callback (line 69) | static int epoll_callback(void *context, int types, union poll_fd_info i...
  function int_t (line 77) | int_t sys_epoll_wait(fd_t epoll_f, addr_t events_addr, int_t max_events,...
  function int_t (line 108) | int_t sys_epoll_pwait(fd_t epoll_f, addr_t events_addr, int_t max_events...
  function epoll_close (line 121) | static int epoll_close(struct fd *fd) {
  type fd_ops (line 126) | struct fd_ops

FILE: kernel/errno.c
  function err_map (line 6) | int err_map(int err) {

FILE: kernel/eventfd.c
  type fd_ops (line 5) | struct fd_ops
  function int_t (line 7) | int_t sys_eventfd2(uint_t initval, int_t flags) {
  function int_t (line 18) | int_t sys_eventfd(uint_t initval) {
  function eventfd_read (line 22) | static ssize_t eventfd_read(struct fd *fd, void *buf, size_t bufsize) {
  function eventfd_write (line 46) | static ssize_t eventfd_write(struct fd *fd, const void *buf, size_t bufs...
  function eventfd_poll (line 72) | static int eventfd_poll(struct fd *fd) {
  type fd_ops (line 83) | struct fd_ops

FILE: kernel/exec.c
  type exec_args (line 23) | struct exec_args {
  type exec_args (line 34) | struct exec_args
  type exec_args (line 35) | struct exec_args
  function read_header (line 37) | static int read_header(struct fd *fd, struct elf_header *header) {
  function read_prg_headers (line 56) | static int read_prg_headers(struct fd *fd, struct elf_header header, str...
  function load_entry (line 77) | static int load_entry(struct prg_header ph, addr_t bias, struct fd *fd) {
  function addr_t (line 127) | static addr_t find_hole_for_elf(struct elf_header *header, struct prg_he...
  function elf_exec (line 145) | static int elf_exec(struct fd *fd, const char *file, struct exec_args ar...
  function args_size (line 427) | static size_t args_size(struct exec_args args) {
  function dword_t (line 438) | static inline dword_t align_stack(addr_t sp) {
  function dword_t (line 442) | static inline dword_t copy_string(addr_t sp, const char *string) {
  function dword_t (line 449) | static inline dword_t args_copy(addr_t sp, struct exec_args args) {
  function user_strlen (line 457) | static inline ssize_t user_strlen(addr_t p) {
  function user_memset (line 468) | static inline int user_memset(addr_t start, byte_t val, dword_t len) {
  function format_exec (line 475) | static int format_exec(struct fd *fd, const char *file, struct exec_args...
  function shebang_exec (line 483) | static int shebang_exec(struct fd *fd, const char *file, struct exec_arg...
  function __do_execve (line 562) | int __do_execve(const char *file, struct exec_args argv, struct exec_arg...
  function do_execve (line 639) | int do_execve(const char *file, size_t argc, const char *argv_p, const c...
  function user_read_string_array (line 649) | static ssize_t user_read_string_array(addr_t addr, char *buf, size_t max) {
  function dword_t (line 677) | dword_t sys_execve(addr_t filename_addr, addr_t argv_addr, addr_t envp_a...

FILE: kernel/exit.c
  function exit_tgroup (line 13) | static bool exit_tgroup(struct task *task) {
  type task (line 32) | struct task
  type task (line 34) | struct task
  type task (line 34) | struct task
  type task (line 35) | struct task
  function do_exit (line 43) | noreturn void do_exit(int status) {
  function do_exit_group (line 125) | noreturn void do_exit_group(int status) {
  function halt_system (line 150) | static void halt_system(void) {
  function dword_t (line 184) | dword_t sys_exit(dword_t status) {
  function dword_t (line 189) | dword_t sys_exit_group(dword_t status) {
  function reap_if_zombie (line 206) | static bool reap_if_zombie(struct task *task, struct siginfo_ *info_out,...
  function notify_if_stopped (line 241) | static bool notify_if_stopped(struct task *task, struct siginfo_ *info_o...
  function reap_if_needed (line 253) | static bool reap_if_needed(struct task *task, struct siginfo_ *info_out,...
  function do_wait (line 274) | int do_wait(int idtype, pid_t_ id, struct siginfo_ *info, struct rusage_...
  function dword_t (line 348) | dword_t sys_waitid(int_t idtype, pid_t_ id, addr_t info_addr, int_t opti...
  function dword_t (line 359) | dword_t sys_wait4(pid_t_ id, addr_t status_addr, dword_t options, addr_t...
  function dword_t (line 389) | dword_t sys_waitpid(pid_t_ pid, addr_t status_addr, dword_t options) {

FILE: kernel/fork.c
  type tgroup (line 36) | struct tgroup
  type tgroup (line 36) | struct tgroup
  type tgroup (line 37) | struct tgroup
  type tgroup (line 37) | struct tgroup
  type rusage_ (line 49) | struct rusage_
  function copy_task (line 56) | static int copy_task(struct task *task, dword_t flags, addr_t stack, add...
  function dword_t (line 139) | dword_t sys_clone(dword_t flags, addr_t stack, addr_t ptid, addr_t tls, ...
  function dword_t (line 199) | dword_t sys_fork() {
  function dword_t (line 203) | dword_t sys_vfork() {
  function vfork_notify (line 207) | void vfork_notify(struct task *task) {

FILE: kernel/fs.c
  type fd (line 12) | struct fd
  function apply_umask (line 18) | static void apply_umask(mode_t_ *mode) {
  function access_check (line 25) | int access_check(struct statbuf *stat, int check) {
  function dword_t (line 42) | dword_t sys_access(addr_t path_addr, dword_t mode) {
  function dword_t (line 45) | dword_t sys_faccessat(fd_t at_f, addr_t path_addr, mode_t_ mode, dword_t...
  function fd_t (line 67) | fd_t sys_openat(fd_t at_f, addr_t path_addr, dword_t flags, mode_t_ mode) {
  function fd_t (line 85) | fd_t sys_open(addr_t path_addr, dword_t flags, mode_t_ mode) {
  function dword_t (line 89) | dword_t sys_readlinkat(fd_t at_f, addr_t path_addr, addr_t buf_addr, dwo...
  function dword_t (line 107) | dword_t sys_readlink(addr_t path_addr, addr_t buf_addr, dword_t bufsize) {
  function dword_t (line 111) | dword_t sys_linkat(fd_t src_at_f, addr_t src_addr, fd_t dst_at_f, addr_t...
  function dword_t (line 128) | dword_t sys_link(addr_t src_addr, addr_t dst_addr) {
  function dword_t (line 133) | dword_t sys_unlinkat(fd_t at_f, addr_t path_addr, int_t flags) {
  function dword_t (line 147) | dword_t sys_unlink(addr_t path_addr) {
  function dword_t (line 151) | dword_t sys_renameat2(fd_t src_at_f, addr_t src_addr, fd_t dst_at_f, add...
  function dword_t (line 170) | dword_t sys_renameat(fd_t src_at_f, addr_t src_addr, fd_t dst_at_f, addr...
  function dword_t (line 174) | dword_t sys_rename(addr_t src_addr, addr_t dst_addr) {
  function dword_t (line 178) | dword_t sys_symlinkat(addr_t target_addr, fd_t at_f, addr_t link_addr) {
  function dword_t (line 192) | dword_t sys_symlink(addr_t target_addr, addr_t link_addr) {
  function dword_t (line 196) | dword_t sys_mknodat(fd_t at_f, addr_t path_addr, mode_t_ mode, dev_t_ de...
  function dword_t (line 208) | dword_t sys_mknod(addr_t path_addr, mode_t_ mode, dev_t_ dev) {
  function sys_read_buf (line 212) | static ssize_t sys_read_buf(fd_t fd_no, void *buf, size_t size) {
  function dword_t (line 239) | dword_t sys_read(fd_t fd_no, addr_t buf_addr, dword_t size) {
  function sys_write_buf (line 253) | static ssize_t sys_write_buf(fd_t fd_no, void *buf, size_t size) {
  function dword_t (line 272) | dword_t sys_write(fd_t fd_no, addr_t buf_addr, dword_t size) {
  type iovec_ (line 298) | struct iovec_
  type iovec_ (line 299) | struct iovec_
  type iovec_ (line 300) | struct iovec_
  function iovec_size (line 310) | static ssize_t iovec_size(struct iovec_ *iovec, unsigned iovec_count) {
  function dword_t (line 317) | dword_t sys_readv(fd_t fd_no, addr_t iovec_addr, dword_t iovec_count) {
  function dword_t (line 351) | dword_t sys_writev(fd_t fd_no, addr_t iovec_addr, dword_t iovec_count) {
  function dword_t (line 384) | dword_t sys__llseek(fd_t f, dword_t off_high, dword_t off_low, addr_t re...
  function dword_t (line 403) | dword_t sys_lseek(fd_t f, dword_t off, dword_t whence) {
  function dword_t (line 417) | dword_t sys_pread(fd_t f, addr_t buf_addr, dword_t size, off_t_ off) {
  function dword_t (line 454) | dword_t sys_pwrite(fd_t f, addr_t buf_addr, dword_t size, off_t_ off) {
  function fd_ioctl (line 485) | static int fd_ioctl(struct fd *fd, dword_t cmd, dword_t arg) {
  function set_nonblock (line 506) | static int set_nonblock(struct fd *fd, addr_t nb_addr) {
  function dword_t (line 518) | dword_t sys_ioctl(fd_t f, dword_t cmd, dword_t arg) {
  function dword_t (line 537) | dword_t sys_getcwd(addr_t buf_addr, dword_t size) {
  type fd (line 562) | struct fd
  type statbuf (line 563) | struct statbuf
  function fs_chdir (line 573) | void fs_chdir(struct fs_info *fs, struct fd *fd) {
  function dword_t (line 580) | dword_t sys_chdir(addr_t path_addr) {
  function dword_t (line 593) | dword_t sys_fchdir(fd_t f) {
  function dword_t (line 603) | dword_t sys_chroot(addr_t path_addr) {
  function dword_t (line 619) | dword_t sys_umask(dword_t mask) {
  function mount_statfs (line 629) | static int mount_statfs(struct mount *mount, struct statfsbuf *stat) {
  function int_t (line 638) | static int_t statfs_mount(struct mount *mount, addr_t buf_addr) {
  function int_t (line 661) | static int_t statfs64_mount(struct mount *mount, addr_t buf_addr) {
  function dword_t (line 684) | dword_t sys_statfs(addr_t path_addr, addr_t buf_addr) {
  function dword_t (line 699) | dword_t sys_statfs64(addr_t path_addr, dword_t buf_size, addr_t buf_addr) {
  function dword_t (line 716) | dword_t sys_fstatfs(fd_t f, addr_t buf_addr) {
  function dword_t (line 720) | dword_t sys_fstatfs64(fd_t f, addr_t buf_addr) {
  function dword_t (line 724) | dword_t sys_flock(fd_t f, dword_t operation) {
  function dword_t (line 735) | static dword_t sys_utime_common(fd_t at_f, addr_t path_addr, struct time...
  function dword_t (line 750) | dword_t sys_utimensat(fd_t at_f, addr_t path_addr, addr_t times_addr, dw...
  function dword_t (line 765) | dword_t sys_utimes(addr_t path_addr, addr_t times_addr) {
  function dword_t (line 780) | dword_t sys_utime(addr_t path_addr, addr_t times_addr) {
  function generic_fsetattr (line 800) | static int generic_fsetattr(struct fd *fd, struct attr attr) {
  function dword_t (line 806) | dword_t sys_fchmod(fd_t f, dword_t mode) {
  function dword_t (line 815) | dword_t sys_fchmodat(fd_t at_f, addr_t path_addr, dword_t mode) {
  function dword_t (line 827) | dword_t sys_chmod(addr_t path_addr, dword_t mode) {
  function dword_t (line 831) | dword_t sys_fchown32(fd_t f, uid_t_ owner, uid_t_ group) {
  function dword_t (line 850) | dword_t sys_fchownat(fd_t at_f, addr_t path_addr, dword_t owner, dword_t...
  function dword_t (line 873) | dword_t sys_chown32(addr_t path_addr, uid_t_ owner, uid_t_ group) {
  function dword_t (line 877) | dword_t sys_lchown(addr_t path_addr, uid_t_ owner, uid_t_ group) {
  function dword_t (line 881) | dword_t sys_truncate64(addr_t path_addr, dword_t size_low, dword_t size_...
  function dword_t (line 889) | dword_t sys_ftruncate64(fd_t f, dword_t size_low, dword_t size_high) {
  function dword_t (line 897) | dword_t sys_fallocate(fd_t f, dword_t UNUSED(mode), dword_t offset_low, ...
  function dword_t (line 912) | dword_t sys_mkdirat(fd_t at_f, addr_t path_addr, mode_t_ mode) {
  function dword_t (line 925) | dword_t sys_mkdir(addr_t path_addr, mode_t_ mode) {
  function dword_t (line 929) | dword_t sys_rmdir(addr_t path_addr) {
  function dword_t (line 937) | dword_t sys_fsync(fd_t f) {
  function dword_t (line 948) | dword_t sys_sendfile(fd_t UNUSED(out_fd), fd_t UNUSED(in_fd), addr_t UNU...
  function dword_t (line 951) | dword_t sys_sendfile64(fd_t UNUSED(out_fd), fd_t UNUSED(in_fd), addr_t U...
  function dword_t (line 954) | dword_t sys_splice(fd_t UNUSED(in_fd), addr_t UNUSED(in_off_addr), fd_t ...
  function dword_t (line 957) | dword_t sys_copy_file_range(fd_t UNUSED(in_fd), addr_t UNUSED(in_off), f...
  function dword_t (line 962) | dword_t sys_xattr_stub(addr_t UNUSED(path_addr), addr_t UNUSED(name_addr),

FILE: kernel/fs.h
  type fs_info (line 14) | struct fs_info {
  type fs_info (line 21) | struct fs_info
  type fs_info (line 22) | struct fs_info
  type fs_info (line 22) | struct fs_info
  type fs_info (line 23) | struct fs_info
  type fs_info (line 25) | struct fs_info
  type fd (line 25) | struct fd
  type attr (line 30) | struct attr {
  type fd (line 50) | struct fd
  type fd (line 51) | struct fd
  type fd (line 51) | struct fd
  type fd (line 52) | struct fd
  type fd (line 53) | struct fd
  type fd (line 53) | struct fd
  type fd (line 54) | struct fd
  type fd (line 55) | struct fd
  type fd (line 56) | struct fd
  type fd (line 56) | struct fd
  type fd (line 57) | struct fd
  type fd (line 58) | struct fd
  type fd (line 59) | struct fd
  type fd (line 64) | struct fd
  type fd (line 65) | struct fd
  type statbuf (line 65) | struct statbuf
  type fd (line 66) | struct fd
  type attr (line 66) | struct attr
  type fd (line 67) | struct fd
  type timespec (line 67) | struct timespec
  type timespec (line 67) | struct timespec
  type fd (line 68) | struct fd
  type fd (line 69) | struct fd
  type statbuf (line 71) | struct statbuf
  type mount (line 73) | struct mount {
  type mount (line 91) | struct mount
  type mount (line 92) | struct mount
  type mount (line 93) | struct mount
  type fs_ops (line 96) | struct fs_ops
  type mount (line 98) | struct mount
  type list (line 99) | struct list
  type fs_ops (line 124) | struct fs_ops {
  type mount (line 165) | struct mount
  type fd (line 168) | struct fd
  type fd_ops (line 168) | struct fd_ops
  type fd (line 170) | struct fd
  type fs_ops (line 173) | struct fs_ops
  type fs_ops (line 174) | struct fs_ops
  type fs_ops (line 175) | struct fs_ops
  type fs_ops (line 176) | struct fs_ops
  type fs_ops (line 177) | struct fs_ops

FILE: kernel/fs_info.c
  type fs_info (line 4) | struct fs_info
  type fs_info (line 5) | struct fs_info
  type fs_info (line 5) | struct fs_info
  type fs_info (line 15) | struct fs_info
  type fs_info (line 15) | struct fs_info
  type fs_info (line 16) | struct fs_info
  function fs_info_release (line 23) | void fs_info_release(struct fs_info *fs) {

FILE: kernel/futex.c
  type futex (line 9) | struct futex {
  type futex_wait (line 17) | struct futex_wait {
  type list (line 26) | struct list
  function init_futex_hash (line 28) | static void __attribute__((constructor)) init_futex_hash() {
  type futex (line 33) | struct futex
  type list (line 35) | struct list
  type futex (line 36) | struct futex
  type futex (line 44) | struct futex
  type futex (line 59) | struct futex
  type futex (line 61) | struct futex
  function futex_put_unlocked (line 67) | static void futex_put_unlocked(struct futex *futex) {
  function futex_put (line 77) | static void futex_put(struct futex *futex) {
  function futex_load (line 82) | static int futex_load(struct futex *futex, dword_t *out) {
  function futex_wait (line 93) | static int futex_wait(addr_t uaddr, dword_t val, struct timespec *timeou...
  function futex_wakelike (line 115) | static int futex_wakelike(int op, addr_t uaddr, dword_t wake_max, dword_...
  function futex_wake (line 151) | int futex_wake(addr_t uaddr, dword_t wake_max) {
  function dword_t (line 155) | dword_t sys_futex(addr_t uaddr, dword_t op, dword_t val, addr_t timeout_...
  type robust_list_head_ (line 183) | struct robust_list_head_ {
  function int_t (line 189) | int_t sys_set_robust_list(addr_t robust_list, dword_t len) {
  function int_t (line 197) | int_t sys_get_robust_list(pid_t_ pid, addr_t robust_list_ptr, addr_t len...

FILE: kernel/getset.c
  function pid_t_ (line 5) | pid_t_ sys_getpid() {
  function pid_t_ (line 9) | pid_t_ sys_gettid() {
  function pid_t_ (line 13) | pid_t_ sys_getppid() {
  function dword_t (line 25) | dword_t sys_getuid32() {
  function dword_t (line 29) | dword_t sys_getuid() {
  function dword_t (line 34) | dword_t sys_geteuid32() {
  function dword_t (line 38) | dword_t sys_geteuid() {
  function int_t (line 43) | int_t sys_setuid(uid_t_ uid) {
  function dword_t (line 55) | dword_t sys_setresuid(uid_t_ ruid, uid_t_ euid, uid_t_ suid) {
  function int_t (line 75) | int_t sys_getresuid(addr_t ruid_addr, addr_t euid_addr, addr_t suid_addr) {
  function int_t (line 86) | int_t sys_setreuid(uid_t_ ruid, uid_t_ euid) {
  function dword_t (line 90) | dword_t sys_getgid32() {
  function dword_t (line 94) | dword_t sys_getgid() {
  function dword_t (line 99) | dword_t sys_getegid32() {
  function dword_t (line 103) | dword_t sys_getegid() {
  function int_t (line 108) | int_t sys_setgid(uid_t_ gid) {
  function dword_t (line 120) | dword_t sys_setresgid(uid_t_ rgid, uid_t_ egid, uid_t_ sgid) {
  function int_t (line 140) | int_t sys_getresgid(addr_t rgid_addr, addr_t egid_addr, addr_t sgid_addr) {
  function int_t (line 151) | int_t sys_setregid(uid_t_ rgid, uid_t_ egid) {
  function int_t (line 155) | int_t sys_getgroups(dword_t size, addr_t list) {
  function int_t (line 168) | int_t sys_setgroups(dword_t size, addr_t list) {
  function int_t (line 181) | int_t sys_capget(addr_t header_addr, addr_t data_addr) {
  function int_t (line 185) | int_t sys_capset(addr_t header_addr, addr_t data_addr) {
  function int_t (line 191) | int_t sys_personality(dword_t persona) {

FILE: kernel/group.c
  function dword_t (line 6) | dword_t sys_setpgid(pid_t_ id, pid_t_ pgid) {
  function dword_t (line 58) | dword_t sys_setpgrp() {
  function pid_t_ (line 62) | pid_t_ sys_getpgid(pid_t_ pid) {
  function pid_t_ (line 76) | pid_t_ sys_getpgrp() {
  function task_leave_session (line 81) | void task_leave_session(struct task *task) {
  function pid_t_ (line 97) | pid_t_ task_setsid(struct task *task) {
  function dword_t (line 119) | dword_t sys_setsid() {
  function dword_t (line 124) | dword_t sys_getsid() {

FILE: kernel/init.c
  function mount_root (line 12) | int mount_root(const struct fs_ops *fs, const char *source) {
  function establish_signal_handlers (line 22) | static void establish_signal_handlers() {
  type rlimit_ (line 34) | struct rlimit_
  type task (line 54) | struct task
  type task (line 54) | struct task
  type task (line 55) | struct task
  type tgroup (line 57) | struct tgroup
  type tgroup (line 57) | struct tgroup
  type tgroup (line 58) | struct tgroup
  type task (line 78) | struct task
  function become_first_process (line 89) | int become_first_process() {
  function become_new_init_child (line 101) | int become_new_init_child() {
  function set_console_device (line 123) | void set_console_device(int major, int minor) {
  function create_stdio (line 128) | int create_stdio(const char *file, int major, int minor) {
  type fd (line 148) | struct fd
  type fd (line 149) | struct fd
  function create_piped_stdio (line 158) | int create_piped_stdio() {

FILE: kernel/init.h
  type fs_ops (line 7) | struct fs_ops

FILE: kernel/ipc.c
  function int_t (line 3) | int_t sys_ipc(uint_t call, int_t first, int_t second, int_t third, addr_...

FILE: kernel/log.c
  type fifo (line 21) | struct fifo
  function syslog_read (line 37) | static int syslog_read(addr_t buf_addr, int_t len, int flags) {
  function do_syslog (line 56) | static int do_syslog(int type, addr_t buf_addr, int_t len) {
  function int_t (line 88) | int_t sys_syslog(int_t type, addr_t buf_addr, int_t len) {
  function log_buf_append (line 95) | static void log_buf_append(const char *msg) {
  function output_line (line 102) | static void output_line(const char *line) {
  function ish_vprintk (line 110) | void ish_vprintk(const char *msg, va_list args) {
  function ish_printk (line 131) | void ish_printk(const char *msg, ...) {
  function log_line (line 140) | static void log_line(const char *line) {
  function log_line (line 145) | static void log_line(const char *line) {
  function log_line (line 150) | static void log_line(const char *line) {
  function log_line (line 154) | static void log_line(const char *line) {
  function log_line (line 158) | static void log_line(const char *line) {
  function default_die_handler (line 163) | static void default_die_handler(const char *msg) {
  function die (line 168) | void die(const char *msg, ...) {
  function current_pid (line 179) | int current_pid() {

FILE: kernel/memory.c
  type mem (line 20) | struct mem
  type mmu_ops (line 21) | struct mmu_ops
  function mem_init (line 23) | void mem_init(struct mem *mem) {
  function mem_destroy (line 32) | void mem_destroy(struct mem *mem) {
  type pt_entry (line 48) | struct pt_entry
  type mem (line 48) | struct mem
  type pt_entry (line 49) | struct pt_entry
  type pt_entry (line 51) | struct pt_entry
  type pt_entry (line 57) | struct pt_entry
  type mem (line 57) | struct mem
  type pt_entry (line 58) | struct pt_entry
  type pt_entry (line 61) | struct pt_entry
  function mem_pt_del (line 67) | static void mem_pt_del(struct mem *mem, page_t page) {
  function mem_next_page (line 73) | void mem_next_page(struct mem *mem, page_t *page) {
  function page_t (line 81) | page_t pt_find_hole(struct mem *mem, pages_t size) {
  function pt_is_hole (line 98) | bool pt_is_hole(struct mem *mem, page_t start, pages_t pages) {
  function pt_map (line 106) | int pt_map(struct mem *mem, page_t start, pages_t pages, void *memory, s...
  function pt_unmap (line 138) | int pt_unmap(struct mem *mem, page_t start, pages_t pages) {
  function pt_unmap_always (line 145) | int pt_unmap_always(struct mem *mem, page_t start, pages_t pages) {
  function pt_map_nothing (line 170) | int pt_map_nothing(struct mem *mem, page_t start, pages_t pages, unsigne...
  function pt_set_flags (line 177) | int pt_set_flags(struct mem *mem, page_t start, pages_t pages, int flags) {
  function pt_copy_on_write (line 200) | int pt_copy_on_write(struct mem *src, struct mem *dst, page_t start, pag...
  function mem_changed (line 220) | static void mem_changed(struct mem *mem) {
  type mem (line 226) | struct mem
  type pt_entry (line 227) | struct pt_entry
  type mem (line 235) | struct mem
  type pt_entry (line 239) | struct pt_entry
  type mmu (line 298) | struct mmu
  type mmu_ops (line 302) | struct mmu_ops
  function mem_segv_reason (line 306) | int mem_segv_reason(struct mem *mem, addr_t addr) {
  function get_real_page_size (line 314) | __attribute__((constructor)) static void get_real_page_size() {
  function mem_coredump (line 318) | void mem_coredump(struct mem *mem, const char *file) {

FILE: kernel/memory.h
  type mem (line 12) | struct mem {
  type mem (line 23) | struct mem
  type mem (line 25) | struct mem
  type pt_entry (line 27) | struct pt_entry
  type mem (line 27) | struct mem
  type mem (line 30) | struct mem
  type data (line 37) | struct data {
  type pt_entry (line 51) | struct pt_entry {
  type mem (line 73) | struct mem
  type mem (line 74) | struct mem
  type mem (line 79) | struct mem
  type mem (line 81) | struct mem
  type mem (line 83) | struct mem
  type mem (line 85) | struct mem
  type mem (line 87) | struct mem
  type mem (line 89) | struct mem
  type mem (line 89) | struct mem
  type mem (line 92) | struct mem
  type mem (line 93) | struct mem

FILE: kernel/misc.c
  function int_t (line 7) | int_t sys_prctl(dword_t option, uint_t arg2, uint_t UNUSED(arg3), uint_t...
  function int_t (line 27) | int_t sys_arch_prctl(int_t code, addr_t addr) {
  function int_t (line 41) | int_t sys_reboot(int_t magic, int_t magic2, int_t cmd) {

FILE: kernel/mm.h
  type mm (line 8) | struct mm {
  type mm (line 28) | struct mm
  type mm (line 30) | struct mm
  type mm (line 30) | struct mm
  type mm (line 32) | struct mm
  type mm (line 34) | struct mm

FILE: kernel/mmap.c
  type mm (line 10) | struct mm
  type mm (line 11) | struct mm
  type mm (line 11) | struct mm
  type mm (line 21) | struct mm
  type mm (line 21) | struct mm
  type mm (line 22) | struct mm
  type mm (line 22) | struct mm
  function mm_retain (line 37) | void mm_retain(struct mm *mm) {
  function mm_release (line 41) | void mm_release(struct mm *mm) {
  function addr_t (line 50) | static addr_t do_mmap(addr_t addr, dword_t len, dword_t prot, dword_t fl...
  function addr_t (line 90) | static addr_t mmap_common(addr_t addr, dword_t len, dword_t prot, dword_...
  function addr_t (line 105) | addr_t sys_mmap2(addr_t addr, dword_t len, dword_t prot, dword_t flags, ...
  type mmap_arg_struct (line 109) | struct mmap_arg_struct {
  function addr_t (line 113) | addr_t sys_mmap(addr_t args_addr) {
  function int_t (line 120) | int_t sys_munmap(addr_t addr, uint_t len) {
  function int_t (line 137) | int_t sys_mremap(addr_t addr, dword_t old_len, dword_t new_len, dword_t ...
  function int_t (line 181) | int_t sys_mprotect(addr_t addr, uint_t len, int_t prot) {
  function dword_t (line 194) | dword_t sys_madvise(addr_t UNUSED(addr), dword_t UNUSED(len), dword_t UN...
  function dword_t (line 199) | dword_t sys_mbind(addr_t UNUSED(addr), dword_t UNUSED(len), int_t UNUSED...
  function int_t (line 204) | int_t sys_mlock(addr_t UNUSED(addr), dword_t UNUSED(len)) {
  function int_t (line 208) | int_t sys_msync(addr_t UNUSED(addr), dword_t UNUSED(len), int_t UNUSED(f...
  function addr_t (line 212) | addr_t sys_brk(addr_t new_brk) {

FILE: kernel/poll.c
  function user_read_or_zero (line 8) | static int user_read_or_zero(addr_t addr, void *data, size_t size) {
  type select_context (line 19) | struct select_context {
  function select_event_callback (line 24) | static int select_event_callback(void *context, int types, union poll_fd...
  function dword_t (line 37) | static dword_t select_common(fd_t nfds, addr_t readfds_addr, addr_t writ...
  function dword_t (line 108) | dword_t sys_select(fd_t nfds, addr_t readfds_addr, addr_t writefds_addr,...
  type poll_context (line 122) | struct poll_context {
  function poll_event_callback (line 128) | static int poll_event_callback(void *context, int types, union poll_fd_i...
  function dword_t (line 141) | dword_t sys_poll(addr_t fds, dword_t nfds, int_t timeout) {
  function dword_t (line 217) | dword_t sys_pselect(fd_t nfds, addr_t readfds_addr, addr_t writefds_addr...
  function dword_t (line 246) | dword_t sys_ppoll(addr_t fds, dword_t nfds, addr_t timeout_addr, addr_t ...

FILE: kernel/ptrace.c
  type task (line 9) | struct task
  type task (line 10) | struct task
  function get_user_regs (line 27) | static void get_user_regs(struct cpu_state *cpu, struct user_regs_struct...
  function set_user_regs (line 48) | static void set_user_regs(struct cpu_state *cpu, struct user_regs_struct...
  function dword_t (line 68) | dword_t sys_ptrace(dword_t request, dword_t pid, addr_t addr, dword_t da...

FILE: kernel/ptrace.h
  type user_regs_struct_ (line 24) | struct user_regs_struct_ {
  type user_fpregs_struct_ (line 44) | struct user_fpregs_struct_ {
  type user_ (line 55) | struct user_ {

FILE: kernel/random.c
  function get_random (line 13) | int get_random(char *buf, size_t len) {
  function dword_t (line 21) | dword_t sys_getrandom(addr_t buf_addr, dword_t len, dword_t UNUSED(flags...

FILE: kernel/resource.c
  function resource_valid (line 16) | static bool resource_valid(int resource) {
  function rlimit_get (line 20) | static int rlimit_get(struct task *task, int resource, struct rlimit_ *l...
  function rlimit_set (line 30) | static int rlimit_set(struct task *task, int resource, struct rlimit_ li...
  function rlim_t_ (line 40) | rlim_t_ rlimit(int resource) {
  function do_getrlimit32 (line 47) | static int do_getrlimit32(int resource, struct rlimit32_ *rlimit32) {
  function dword_t (line 60) | dword_t sys_getrlimit32(dword_t resource, addr_t rlim_addr) {
  function dword_t (line 70) | dword_t sys_old_getrlimit32(dword_t resource, addr_t rlim_addr) {
  function check_setrlimit (line 88) | static int check_setrlimit(int resource, struct rlimit_ new_limit) {
  function dword_t (line 100) | dword_t sys_setrlimit32(dword_t resource, addr_t rlim_addr) {
  function dword_t (line 111) | dword_t sys_prlimit64(pid_t_ pid, dword_t resource, addr_t new_limit_add...
  function rusage_get_current (line 139) | struct rusage_ rusage_get_current() {
  function timeval_add (line 162) | static void timeval_add(struct timeval_ *dst, struct timeval_ *src) {
  function rusage_add (line 171) | void rusage_add(struct rusage_ *dst, struct rusage_ *src) {
  function dword_t (line 176) | dword_t sys_getrusage(dword_t who, addr_t rusage_addr) {
  function int_t (line 195) | int_t sys_sched_getaffinity(pid_t_ pid, dword_t cpusetsize, addr_t cpuse...
  function int_t (line 217) | int_t sys_sched_setaffinity(pid_t_ UNUSED(pid), dword_t UNUSED(cpusetsiz...
  function int_t (line 222) | int_t sys_getpriority(int_t which, pid_t_ who) {
  function int_t (line 226) | int_t sys_setpriority(int_t which, pid_t_ who, int_t prio) {
  function int_t (line 232) | int_t sys_sched_getparam(pid_t_ UNUSED(pid), addr_t param_addr) {
  function int_t (line 239) | int_t sys_sched_getscheduler(pid_t_ UNUSED(pid)) {
  function int_t (line 242) | int_t sys_sched_setscheduler(pid_t_ UNUSED(pid), int_t policy, addr_t pa...
  function int_t (line 253) | int_t sys_sched_get_priority_max(int_t policy) {
  function int_t (line 260) | int_t sys_ioprio_get(int_t UNUSED(which), int_t UNUSED(who), int_t UNUSE...
  function int_t (line 263) | int_t sys_ioprio_set(int_t UNUSED(which), int_t UNUSED(who), int_t UNUSE...

FILE: kernel/resource.h
  type qword_t (line 5) | typedef qword_t rlim_t_;
  type dword_t (line 6) | typedef dword_t rlim32_t_;
  type rlimit_ (line 9) | struct rlimit_ {
  type rlimit32_ (line 14) | struct rlimit32_ {
  type rusage_ (line 44) | struct rusage_ {
  type rusage_ (line 63) | struct rusage_
  type rusage_ (line 64) | struct rusage_
  type rusage_ (line 64) | struct rusage_

FILE: kernel/signal.c
  type sighand (line 17) | struct sighand
  type stack_t_ (line 17) | struct stack_t_
  type sighand (line 18) | struct sighand
  function signal_is_blockable (line 20) | static int signal_is_blockable(int sig) {
  function signal_action (line 31) | static int signal_action(struct sighand *sighand, int sig) {
  function deliver_signal_unlocked (line 53) | static void deliver_signal_unlocked(struct task *task, int sig, struct s...
  function deliver_signal (line 94) | void deliver_signal(struct task *task, int sig, struct siginfo_ info) {
  function send_signal (line 100) | void send_signal(struct task *task, int sig, struct siginfo_ info) {
  function try_self_signal (line 122) | bool try_self_signal(int sig) {
  function send_group_signal (line 135) | int send_group_signal(dword_t pgid, int sig, struct siginfo_ info) {
  function addr_t (line 150) | static addr_t sigreturn_trampoline(const char *name) {
  function setup_sigcontext (line 158) | static void setup_sigcontext(struct sigcontext_ *sc, struct cpu_state *c...
  function setup_sigframe (line 177) | static void setup_sigframe(struct siginfo_ *info, struct sigframe_ *fram...
  function setup_rt_sigframe (line 195) | static void setup_rt_sigframe(struct siginfo_ *info, struct rt_sigframe_...
  function receive_signal (line 218) | static void receive_signal(struct sighand *sighand, struct siginfo_ *inf...
  function signal_delivery_stop (line 300) | void signal_delivery_stop(int sig, struct siginfo_ *info) {
  function receive_signals (line 327) | void receive_signals() {
  function restore_sigcontext (line 383) | static void restore_sigcontext(struct sigcontext_ *context, struct cpu_s...
  function dword_t (line 400) | dword_t sys_rt_sigreturn() {
  function dword_t (line 422) | dword_t sys_sigreturn() {
  type sighand (line 439) | struct sighand
  type sighand (line 440) | struct sighand
  type sighand (line 440) | struct sighand
  type sighand (line 443) | struct sighand
  type sighand (line 449) | struct sighand
  type sighand (line 449) | struct sighand
  type sighand (line 450) | struct sighand
  function sighand_release (line 457) | void sighand_release(struct sighand *sighand) {
  function do_sigaction (line 463) | static int do_sigaction(int sig, const struct sigaction_ *action, struct...
  function dword_t (line 479) | dword_t sys_rt_sigaction(dword_t signum, addr_t action_addr, addr_t olda...
  function dword_t (line 502) | dword_t sys_sigaction(dword_t signum, addr_t action_addr, addr_t oldacti...
  function sigmask_set (line 506) | static void sigmask_set(sigset_t_ set) {
  function sigmask_set_temp_unlocked (line 510) | static void sigmask_set_temp_unlocked(sigset_t_ mask) {
  function sigmask_set_temp (line 516) | void sigmask_set_temp(sigset_t_ mask) {
  function do_sigprocmask (line 522) | static int do_sigprocmask(dword_t how, sigset_t_ set) {
  function dword_t (line 534) | dword_t sys_rt_sigprocmask(dword_t how, addr_t set_addr, addr_t oldset_a...
  function int_t (line 562) | int_t sys_rt_sigpending(addr_t set_addr) {
  function is_on_altstack (line 571) | static bool is_on_altstack(dword_t sp, struct sighand *sighand) {
  function altstack_to_user (line 575) | static void altstack_to_user(struct sighand *sighand, struct stack_t_ *u...
  function dword_t (line 585) | dword_t sys_sigaltstack(addr_t ss_addr, addr_t old_ss_addr) {
  function int_t (line 620) | int_t sys_rt_sigsuspend(addr_t mask_addr, uint_t size) {
  function int_t (line 637) | int_t sys_pause() {
  function int_t (line 645) | int_t sys_rt_sigtimedwait(addr_t set_addr, addr_t info_addr, addr_t time...
  function kill_task (line 696) | static int kill_task(struct task *task, dword_t sig) {
  function kill_group (line 712) | static int kill_group(pid_t_ pgid, dword_t sig) {
  function kill_everything (line 729) | static int kill_everything(dword_t sig) {
  function do_kill (line 742) | static int do_kill(pid_t_ pid, dword_t sig, pid_t_ tgid) {
  function dword_t (line 776) | dword_t sys_kill(pid_t_ pid, dword_t sig) {
  function dword_t (line 779) | dword_t sys_tgkill(pid_t_ tgid, pid_t_ tid, dword_t sig) {
  function dword_t (line 784) | dword_t sys_tkill(pid_t_ tid, dword_t sig) {

FILE: kernel/signal.h
  type task (line 7) | struct task
  type qword_t (line 9) | typedef qword_t sigset_t_;
  type sigaction_ (line 19) | struct sigaction_ {
  type siginfo_ (line 74) | struct siginfo_ {
  type siginfo_ (line 107) | struct siginfo_
  type sigqueue (line 111) | struct sigqueue {
  type sigevent_ (line 116) | struct sigevent_ {
  type task (line 125) | struct task
  type siginfo_ (line 125) | struct siginfo_
  type task (line 127) | struct task
  type siginfo_ (line 127) | struct siginfo_
  type siginfo_ (line 132) | struct siginfo_
  type sighand (line 139) | struct sighand {
  type sighand (line 146) | struct sighand
  type sighand (line 147) | struct sighand
  type sighand (line 147) | struct sighand
  type sighand (line 148) | struct sighand
  type sigset_t_ (line 158) | typedef uint64_t sigset_t_;
  function sigset_t_ (line 162) | static inline sigset_t_ sig_mask(int sig) {
  function sigset_has (line 167) | static inline bool sigset_has(sigset_t_ set, int sig) {
  function sigset_add (line 170) | static inline void sigset_add(sigset_t_ *set, int sig) {
  function sigset_del (line 173) | static inline void sigset_del(sigset_t_ *set, int sig) {
  type stack_t_ (line 177) | struct stack_t_ {
  type sigcontext_ (line 198) | struct sigcontext_ {
  type ucontext_ (line 224) | struct ucontext_ {
  type fpreg_ (line 232) | struct fpreg_ {
  type fpxreg_ (line 237) | struct fpxreg_ {
  type xmmreg_ (line 243) | struct xmmreg_ {
  type fpstate_ (line 247) | struct fpstate_ {
  type sigframe_ (line 269) | struct sigframe_ {
  type rt_sigframe_ (line 278) | struct rt_sigframe_ {

FILE: kernel/task.c
  type task (line 10) | struct task
  type pid (line 12) | struct pid
  function pid_empty (line 15) | static bool pid_empty(struct pid *pid) {
  type pid (line 19) | struct pid
  type pid (line 22) | struct pid
  type task (line 28) | struct task
  type pid (line 29) | struct pid
  type task (line 32) | struct task
  type task (line 36) | struct task
  type task (line 37) | struct task
  type task (line 43) | struct task
  type task (line 43) | struct task
  type pid (line 50) | struct pid
  type task (line 55) | struct task
  type task (line 55) | struct task
  type task (line 58) | struct task
  type task_sockrestart (line 79) | struct task_sockrestart
  function task_destroy (line 92) | void task_destroy(struct task *task) {
  function task_run_current (line 98) | void task_run_current() {
  function create_attr (line 118) | __attribute__((constructor)) static void create_attr() {
  function task_start (line 123) | void task_start(struct task *task) {
  function int_t (line 128) | int_t sys_sched_yield() {
  function update_thread_name (line 134) | void update_thread_name() {

FILE: kernel/task.h
  type task (line 17) | struct task {
  type task (line 97) | struct task
  function task_set_mm (line 99) | static inline void task_set_mm(struct task *task, struct mm *mm) {
  type task (line 108) | struct task
  type task (line 108) | struct task
  type task (line 110) | struct task
  type task (line 113) | struct task
  type task (line 114) | struct task
  type task (line 115) | struct task
  type posix_timer (line 117) | struct posix_timer {
  type tgroup (line 127) | struct tgroup {
  function task_is_leader (line 169) | static inline bool task_is_leader(struct task *task) {
  type pid (line 173) | struct pid {
  type pid (line 183) | struct pid
  type task (line 184) | struct task
  type task (line 185) | struct task
  type task (line 190) | struct task
  type task (line 193) | struct task

FILE: kernel/time.c
  function clockid_to_real (line 15) | static int clockid_to_real(uint_t clock, clockid_t *real) {
  function timer_spec_to_real (line 26) | static struct timer_spec timer_spec_to_real(struct itimerspec_ itspec) {
  function timer_spec_from_real (line 36) | static struct itimerspec_ timer_spec_from_real(struct timer_spec spec) {
  function dword_t (line 46) | dword_t sys_time(addr_t time_out) {
  function dword_t (line 54) | dword_t sys_stime(addr_t UNUSED(time)) {
  function dword_t (line 58) | dword_t sys_clock_gettime(dword_t clock, addr_t tp) {
  function dword_t (line 83) | dword_t sys_clock_getres(dword_t clock, addr_t res_addr) {
  function dword_t (line 100) | dword_t sys_clock_settime(dword_t UNUSED(clock), addr_t UNUSED(tp)) {
  function itimer_notify (line 104) | static void itimer_notify(struct task *task) {
  function itimer_set (line 111) | static int itimer_set(struct tgroup *group, int which, struct timer_spec...
  function int_t (line 127) | int_t sys_setitimer(int_t which, addr_t new_val_addr, addr_t old_val_add...
  function uint_t (line 161) | uint_t sys_alarm(uint_t seconds) {
  function dword_t (line 184) | dword_t sys_nanosleep(addr_t req_addr, addr_t rem_addr) {
  function dword_t (line 205) | dword_t sys_times(addr_t tbuf) {
  function dword_t (line 220) | dword_t sys_gettimeofday(addr_t tv, addr_t tz) {
  function dword_t (line 239) | dword_t sys_settimeofday(addr_t UNUSED(tv), addr_t UNUSED(tz)) {
  function posix_timer_callback (line 243) | static void posix_timer_callback(struct posix_timer *timer) {
  function int_t (line 264) | int_t sys_timer_create(dword_t clock, addr_t sigevent_addr, addr_t timer...
  function int_t (line 317) | int_t sys_timer_settime(dword_t timer_id, int_t flags, addr_t new_value_...
  function int_t (line 346) | int_t sys_timer_delete(dword_t timer_id) {
  type fd_ops (line 360) | struct fd_ops
  function timerfd_callback (line 362) | static void timerfd_callback(struct fd *fd) {
  function fd_t (line 370) | fd_t sys_timerfd_create(int_t clockid, int_t flags) {
  function int_t (line 383) | int_t sys_timerfd_settime(fd_t f, int_t flags, addr_t new_value_addr, ad...
  function timerfd_read (line 417) | static ssize_t timerfd_read(struct fd *fd, void *buf, size_t bufsize) {
  function timerfd_poll (line 438) | static int timerfd_poll(struct fd *fd) {
  function timerfd_close (line 446) | static int timerfd_close(struct fd *fd) {
  type fd_ops (line 451) | struct fd_ops

FILE: kernel/time.h
  type timeval_ (line 15) | struct timeval_ {
  type timespec_ (line 19) | struct timespec_ {
  type timezone_ (line 23) | struct timezone_ {
  function clock_t_ (line 28) | static inline clock_t_ clock_from_timeval(struct timeval_ timeval) {
  function convert_timespec (line 32) | static inline struct timespec convert_timespec(struct timespec_ t) {
  function convert_timeval (line 39) | static inline struct timespec convert_timeval(struct timeval_ t) {
  type itimerval_ (line 49) | struct itimerval_ {
  type itimerspec_ (line 54) | struct itimerspec_ {
  type tms_ (line 59) | struct tms_ {

FILE: kernel/tls.c
  type user_desc (line 3) | struct user_desc {
  function task_set_thread_area (line 15) | int task_set_thread_area(struct task *task, addr_t u_info) {
  function sys_set_thread_area (line 34) | int sys_set_thread_area(addr_t u_info) {
  function sys_set_tid_address (line 39) | int sys_set_tid_address(addr_t tid) {

FILE: kernel/uname.c
  function do_uname (line 15) | void do_uname(struct uname *uts) {
  function dword_t (line 31) | dword_t sys_uname(addr_t uts_addr) {
  function dword_t (line 39) | dword_t sys_sethostname(addr_t UNUSED(hostname_addr), dword_t UNUSED(hos...
  function get_total_ram (line 44) | static uint64_t get_total_ram() {
  function sysinfo_specific (line 49) | static void sysinfo_specific(struct sys_info *info) {
  function sysinfo_specific (line 54) | static void sysinfo_specific(struct sys_info *info) {
  function dword_t (line 69) | dword_t sys_sysinfo(addr_t info_addr) {

FILE: kernel/user.c
  function __user_read_task (line 4) | static int __user_read_task(struct task *task, addr_t addr, void *buf, s...
  function __user_write_task (line 20) | static int __user_write_task(struct task *task, addr_t addr, const void ...
  function user_read_task (line 36) | int user_read_task(struct task *task, addr_t addr, void *buf, size_t cou...
  function user_read (line 43) | int user_read(addr_t addr, void *buf, size_t count) {
  function user_write_task (line 47) | int user_write_task(struct task *task, addr_t addr, const void *buf, siz...
  function user_write_task_ptrace (line 54) | int user_write_task_ptrace(struct task *task, addr_t addr, const void *b...
  function user_write (line 61) | int user_write(addr_t addr, const void *buf, size_t count) {
  function user_read_string (line 65) | int user_read_string(addr_t addr, char *buf, size_t max) {
  function user_write_string (line 83) | int user_write_string(addr_t addr, const char *buf) {

FILE: kernel/vdso.c
  function vdso_symbol (line 13) | int vdso_symbol(const char *name) {

FILE: linux/emu_asbestos.c
  type emu_mm_ctx (line 18) | struct emu_mm_ctx {
  type tlb (line 23) | struct tlb
  type mmu (line 25) | struct mmu
  type emu_mm (line 27) | struct emu_mm
  type mmu_ops (line 36) | struct mmu_ops
  function emu_run_to_interrupt (line 42) | static void emu_run_to_interrupt(struct emu *emu, struct cpu_state *cpu)
  function emu_run (line 86) | void emu_run(struct emu *emu)
  function emu_finish_fork (line 102) | void emu_finish_fork(struct emu *emu)
  function emu_destroy (line 110) | void emu_destroy(struct emu *emu)
  function emu_poke_cpu (line 114) | void emu_poke_cpu(int cpu)
  function emu_flush_tlb_local (line 119) | void emu_flush_tlb_local(struct emu_mm *mm, unsigned long start, unsigne...
  function emu_mmu_init (line 129) | void emu_mmu_init(struct emu_mm *mm)
  function emu_mmu_destroy (line 137) | void emu_mmu_destroy(struct emu_mm *mm)
  function emu_switch_mm (line 144) | void emu_switch_mm(struct emu *emu, struct emu_mm *mm)

FILE: linux/emu_unicorn.c
  function __check (line 11) | static void __check(uc_err err, const char *function, int line)
  type gdt_desc (line 23) | struct gdt_desc {
  type gdt_desc (line 40) | struct gdt_desc
  function install_gdt_segment (line 42) | static void install_gdt_segment(uc_engine *uc, int segment, uint32_t bas...
  function load_regs (line 62) | static void load_regs(struct emu *emu)
  function save_regs (line 89) | static void save_regs(struct emu *emu)
  function do_trap (line 107) | static void do_trap(struct emu *emu, int trap_nr)
  function mem_type_is_write (line 117) | static bool mem_type_is_write(uc_mem_type type)
  function hook_tlb_fill (line 135) | static bool hook_tlb_fill(uc_engine *uc, uint64_t vaddr, uc_mem_type typ...
  function hook_intr (line 167) | static void hook_intr(uc_engine *uc, uint32_t intno, void *user_data)
  function hook_trace_code (line 173) | static bool hook_trace_code(uc_engine *uc, uint64_t address, size_t size...
  function create_unicorn (line 186) | static void create_unicorn(struct emu *emu)
  function emu_run (line 212) | void emu_run(struct emu *emu)
  function emu_finish_fork (line 226) | void emu_finish_fork(struct emu *emu)
  function emu_destroy (line 239) | void emu_destroy(struct emu *emu)
  function emu_poke_cpu (line 247) | void emu_poke_cpu(int cpu) {}
  function emu_mmu_init (line 249) | void emu_mmu_init(struct emu_mm *mm)
  function emu_mmu_destroy (line 252) | void emu_mmu_destroy(struct emu_mm *mm)
  function emu_switch_mm (line 255) | void emu_switch_mm(struct emu *emu, struct emu_mm *mm)
  function emu_flush_tlb_local (line 259) | void emu_flush_tlb_local(struct emu_mm *mm, unsigned long start, unsigne...

FILE: linux/emu_unicorn.h
  type emu_uc (line 9) | struct emu_uc {

FILE: linux/fakefs.c
  type fakefs_super (line 17) | struct fakefs_super {
  type dentry (line 23) | struct dentry
  type inode (line 39) | struct inode
  type inode (line 40) | struct inode
  function open_fd_for_dentry (line 44) | static int open_fd_for_dentry(struct inode *dir, struct dentry *dentry) {
  type dentry (line 51) | struct dentry
  type inode (line 51) | struct inode
  type dentry (line 51) | struct dentry
  type fakefs_super (line 52) | struct fakefs_super
  type inode (line 53) | struct inode
  function __finish_make_node (line 100) | static int __finish_make_node(struct user_namespace *mnt_userns, struct ...
  function finish_make_node (line 153) | static int finish_make_node(struct user_namespace *mnt_userns, struct in...
  function fakefs_create (line 157) | static int fakefs_create(struct user_namespace *mnt_userns, struct inode...
  function fakefs_rename (line 164) | static int fakefs_rename(struct user_namespace *mnt_userns, struct inode...
  function fakefs_link (line 194) | static int fakefs_link(struct dentry *from, struct inode *ino, struct de...
  function unlink_common (line 226) | static int unlink_common(struct inode *dir, struct dentry *dentry, int i...
  function fakefs_unlink (line 245) | static int fakefs_unlink(struct inode *dir, struct dentry *dentry) {
  function fakefs_rmdir (line 249) | static int fakefs_rmdir(struct inode *dir, struct dentry *dentry) {
  function fakefs_symlink (line 253) | static int fakefs_symlink(struct user_namespace *mnt_userns, struct inod...
  function fakefs_mkdir (line 266) | static int fakefs_mkdir(struct user_namespace *mnt_userns, struct inode ...
  function fakefs_mknod (line 276) | static int fakefs_mknod(struct user_namespace *mnt_userns, struct inode ...
  function fakefs_setattr (line 283) | static int fakefs_setattr(struct user_namespace *mnt_userns, struct dent...
  type inode_operations (line 343) | struct inode_operations
  type inode_operations (line 347) | struct inode_operations
  type inode_operations (line 360) | struct inode_operations
  function fakefs_file_release (line 368) | static int fakefs_file_release(struct inode *inode, struct file *file) {
  function fakefs_fsync (line 373) | static int fakefs_fsync(struct file *file, loff_t start, loff_t end,
  function fakefs_iterate (line 381) | static int fakefs_iterate(struct file *file, struct dir_context *ctx) {
  function fakefs_dir_release (line 430) | static int fakefs_dir_release(struct inode *ino, struct file *file) {
  type file_operations (line 436) | struct file_operations
  type file_operations (line 446) | struct file_operations
  function fakefs_readpage (line 453) | static int fakefs_readpage(struct file *file, struct page *page) {
  function fakefs_writepage (line 475) | static int fakefs_writepage(struct page *page, struct writeback_control ...
  function fakefs_write_begin (line 502) | static int fakefs_write_begin(struct file *file, struct address_space *m...
  function fakefs_write_end (line 513) | static int fakefs_write_end(struct file *file, struct address_space *map...
  type address_space_operations (line 538) | struct address_space_operations
  function restat_inode (line 546) | static int restat_inode(struct inode *ino) {
  function read_inode (line 563) | static int read_inode(struct inode *ino) {
  type dentry_operations (line 604) | struct dentry_operations
  function fakefs_evict_inode (line 610) | static void fakefs_evict_inode(struct inode *ino) {
  function fakefs_statfs (line 619) | static int fakefs_statfs(struct dentry *dentry, struct kstatfs *kstat) {
  type super_operations (line 637) | struct super_operations
  function fakefs_fill_super (line 643) | static int fakefs_fill_super(struct super_block *sb, struct fs_context *...
  type fakefs_context (line 684) | struct fakefs_context {
  function fakefs_fc_parse_param (line 688) | static int fakefs_fc_parse_param(struct fs_context *fc, struct fs_parame...
  function fakefs_fc_free (line 698) | static void fakefs_fc_free(struct fs_context *fc) {
  function fakefs_get_tree (line 704) | static int fakefs_get_tree(struct fs_context *fc) {
  type fs_context_operations (line 735) | struct fs_context_operations
  function fakefs_init_fs_context (line 741) | static int fakefs_init_fs_context(struct fs_context *fc) {
  function fakefs_kill_sb (line 749) | static void fakefs_kill_sb(struct super_block *sb) {
  type file_system_type (line 757) | struct file_system_type
  function fakefs_init (line 763) | static int fakefs_init(void) {

FILE: linux/main.c
  function main (line 8) | int main(int argc, const char *argv[])

FILE: main.c
  function main (line 7) | int main(int argc, char *const argv[]) {

FILE: misc.h
  function __use (line 83) | static inline void __use(int dummy __attribute__((unused)), ...) {}
  type sqword_t (line 105) | typedef int64_t sqword_t;
  type qword_t (line 106) | typedef uint64_t qword_t;
  type dword_t (line 107) | typedef uint32_t dword_t;
  type sdword_t (line 108) | typedef int32_t sdword_t;
  type word_t (line 109) | typedef uint16_t word_t;
  type byte_t (line 110) | typedef uint8_t byte_t;
  type dword_t (line 112) | typedef dword_t addr_t;
  type dword_t (line 113) | typedef dword_t uint_t;
  type sdword_t (line 114) | typedef sdword_t int_t;
  type sdword_t (line 116) | typedef sdword_t pid_t_;
  type dword_t (line 117) | typedef dword_t uid_t_;
  type word_t (line 118) | typedef word_t mode_t_;
  type sqword_t (line 119) | typedef sqword_t off_t_;
  type dword_t (line 120) | typedef dword_t time_t_;
  type dword_t (line 121) | typedef dword_t clock_t_;

FILE: platform/darwin.c
  function get_cpu_usage (line 6) | struct cpu_usage get_cpu_usage() {
  function get_mem_usage (line 18) | struct mem_usage get_mem_usage() {
  function get_uptime (line 36) | struct uptime_info get_uptime() {

FILE: platform/linux.c
  function read_proc_line (line 8) | static void read_proc_line(const char *file, const char *name, char *buf) {
  function get_cpu_usage (line 19) | struct cpu_usage get_cpu_usage() {
  function get_mem_usage (line 27) | struct mem_usage get_mem_usage() {
  function get_uptime (line 43) | struct uptime_info get_uptime() {

FILE: platform/platform.h
  type cpu_usage (line 6) | struct cpu_usage {
  type cpu_usage (line 12) | struct cpu_usage
  type mem_usage (line 14) | struct mem_usage {
  type mem_usage (line 20) | struct mem_usage
  type uptime_info (line 22) | struct uptime_info {
  type uptime_info (line 26) | struct uptime_info

FILE: tests/e2e/fpu/test_fpu.c
  function main (line 3) | int main(void) {

FILE: tests/e2e/hello/test_c.c
  function main (line 3) | int main(void) {

FILE: tests/e2e/qemu/qemu-test-shift.h
  function exec_opq (line 31) | void exec_opq(long s2, long s0, long s1, long iflags)
  function exec_opl (line 45) | void exec_opl(long s2, long s0, long s1, long iflags)
  function exec_opw (line 58) | void exec_opw(long s2, long s0, long s1, long iflags)
  function exec_opq (line 82) | void exec_opq(long s2, long s0, long s1, long iflags)
  function exec_opl (line 96) | void exec_opl(long s2, long s0, long s1, long iflags)
  function exec_opw (line 110) | void exec_opw(long s2, long s0, long s1, long iflags)
  function exec_opb (line 127) | void exec_opb(long s0, long s1, long iflags)
  function exec_op (line 141) | void exec_op(long s2, long s0, long s1)

FILE: tests/e2e/qemu/qemu-test.c
  function i2l (line 88) | static inline long i2l(long v)
  function i2l (line 93) | static inline long i2l(long v)
  function test_lea (line 227) | void test_lea(void)
  function test_jcc (line 407) | void test_jcc(void)
  function test_loop (line 486) | void test_loop(void)
  function test_imulw2 (line 524) | void test_imulw2(long op0, long op1)
  function test_imull2 (line 542) | void test_imull2(long op0, long op1)
  function test_imulq2 (line 561) | void test_imulq2(long op0, long op1)
  function test_mul (line 607) | void test_mul(void)
  function test_bsx (line 732) | void test_bsx(void)
  function test_fops (line 760) | void test_fops(double a, double b)
  function fpu_clear_exceptions (line 781) | void fpu_clear_exceptions(void)
  function test_fcmp (line 805) | void test_fcmp(double a, double b)
  function test_fcvt (line 853) | void test_fcvt(double a)
  function test_fconst (line 894) | void test_fconst(void)
  function test_fbcd (line 906) | void test_fbcd(double a)
  function test_fenv (line 934) | void test_fenv(void)
  function test_fcmov (line 987) | void test_fcmov(void)
  function test_floats (line 1013) | void test_floats(void)
  function test_bcd (line 1061) | void test_bcd(void)
  function test_xchg (line 1139) | void test_xchg(void)
  function modify_ldt (line 1238) | static inline int modify_ldt(int func, void * ptr, unsigned long bytecount)
  function test_segs (line 1282) | void test_segs(void)
  function test_code16 (line 1384) | void test_code16(void)
  function test_misc (line 1437) | void test_misc(void)
  function test_string (line 1553) | void test_string(void)
  function set_bit (line 1578) | static inline void set_bit(uint8_t *a, unsigned int bit)
  function pushw (line 1588) | static inline void pushw(struct vm86_regs *r, int val)
  function vm86 (line 1594) | static inline int vm86(int func, struct vm86plus_struct *v86)
  function test_vm86 (line 1605) | void test_vm86(void)
  function sig_handler (line 1730) | void sig_handler(int sig, siginfo_t *info, void *puc)
  function test_exceptions (line 1748) | void test_exceptions(void)
  function sig_trap_handler (line 1922) | void sig_trap_handler(int sig, siginfo_t *info, void *puc)
  function test_single_step (line 1931) | void test_single_step(void)
  function test_self_modifying_code (line 2031) | void test_self_modifying_code(void)
  function test_enter (line 2097) | static void test_enter(void)
  type __m64 (line 2119) | typedef int __m64 __attribute__ ((vector_size (8)));
  type __m128 (line 2120) | typedef float __m128 __attribute__ ((vector_size (16)));
  type XMMReg (line 2122) | typedef union {
  function test_sse_comi (line 2382) | void test_sse_comi(double a1, double b1)
  type fpxstate (line 2440) | struct fpxstate {
  type fpxstate (line 2458) | struct fpxstate
  type fpxstate (line 2459) | struct fpxstate
  type fpxstate (line 2463) | struct fpxstate
  type fpxstate (line 2464) | struct fpxstate
  function test_sse (line 2509) | void test_sse(void)
  function test_conv (line 2828) | void test_conv(void)
  function main (line 2858) | int main(int argc, char **argv)

FILE: tests/e2e/qemu/qemu-test.h
  function exec_opq (line 32) | void exec_opq(long s0, long s1, long iflags)
  function exec_opl (line 41) | void exec_opl(long s0, long s1, long iflags)
  function exec_opw (line 49) | void exec_opw(long s0, long s1, long iflags)
  function exec_opb (line 57) | void exec_opb(long s0, long s1, long iflags)
  function exec_opq (line 66) | void exec_opq(long s0, long s1, long iflags)
  function exec_opl (line 75) | void exec_opl(long s0, long s1, long iflags)
  function exec_opw (line 83) | void exec_opw(long s0, long s1, long iflags)
  function exec_opb (line 91) | void exec_opb(long s0, long s1, long iflags)
  function exec_op (line 100) | void exec_op(long s0, long s1)

FILE: tests/e2e/sse2/movaps.c
  function main (line 6) | void main(void) {

FILE: tests/e2e/sse2/movss.c
  function main (line 11) | void main(void) {
  function move5 (line 41) | void NOINLINE move5(__m128 *xmm1, __m128 *xmm2) {
  function move1612 (line 49) | void NOINLINE move1612(__m128 *xmm1, float fa) {
  function store1612 (line 57) | void NOINLINE store1612(__m128 *xmm1, float *fa) {

FILE: tests/e2e/sse2/paddq.c
  function main (line 8) | void main(void) {

FILE: tests/e2e/sse2/psllq.c
  function main (line 8) | void main(void) {

FILE: tests/e2e/sse2/psrlq.c
  function main (line 8) | void main(void) {

FILE: tests/e2e/sse2/xorps.c
  function main (line 6) | void main(void) {

FILE: tests/manual/cat.c
  function main (line 3) | int main(int argc, const char *argv[]) {

FILE: tests/manual/fibbonaci.c
  function fib (line 4) | unsigned long fib(unsigned long n) {
  function main (line 10) | int main(int argc, const char *argv[]) {

FILE: tests/manual/forkexec.c
  function main (line 6) | int main(int argc, char *argv[]) {

FILE: tests/manual/getdents.c
  function main (line 6) | int main() {

FILE: tests/manual/hello-clib.c
  function main (line 3) | int main() {

FILE: tests/manual/hello.c
  function _start (line 4) | void _start() {

FILE: tests/manual/looper.c
  function main (line 6) | int main() {

FILE: tests/manual/modify.c
  function handle_segfault (line 14) | static void handle_segfault(int sig) {
  function test (line 21) | static void test(char *code, const char *name) {
  function main (line 27) | int main() {

FILE: tests/manual/signal.c
  function handler (line 6) | void handler(int signal, siginfo_t *info, void *ucontext) {
  function main (line 10) | int main() {

FILE: tests/manual/stat.c
  function main (line 6) | int main() {

FILE: tests/manual/thread.c
  function main (line 9) | int main() {

FILE: tools/fakefs.c
  function progress_update (line 36) | static bool progress_update(struct progress *p, double progress, const c...
  function path_normalize (line 46) | static bool path_normalize(const char *path, char *out) {
  function fakefs_import (line 80) | bool fakefs_import(const char *archive_path, const char *fs, struct fake...
  function fakefs_export (line 266) | bool fakefs_export(const char *fs, const char *archive_path, struct fake...

FILE: tools/fakefs.h
  type fakefsify_error (line 5) | struct fakefsify_error {
  type progress (line 17) | struct progress {
  type fakefsify_error (line 22) | struct fakefsify_error
  type progress (line 22) | struct progress
  type fakefsify_error (line 23) | struct fakefsify_error
  type progress (line 23) | struct progress

FILE: tools/fakefsify.c
  type cmd (line 9) | enum cmd {
  function main (line 14) | int main(int argc, const char *argv[]) {

FILE: tools/ptraceomatic.c
  function step (line 36) | static inline int step(int pid) {
  function getregs (line 51) | static inline void getregs(int pid, struct user_regs_struct *regs) {
  function setregs (line 55) | static inline void setregs(int pid, struct user_regs_struct *regs) {
  function compare_cpus (line 59) | static int compare_cpus(struct cpu_state *cpu, struct tlb *tlb, int pid,...
  function transmit_fd (line 145) | static int transmit_fd(int pid, int sender, int receiver, int fake_fd) {
  function remote_close_fd (line 214) | static void remote_close_fd(int pid, int fd, long int80_ip) {
  function pt_copy (line 236) | static void pt_copy(int pid, addr_t start, size_t size) {
  function pt_copy_to_real (line 247) | static void pt_copy_to_real(int pid, addr_t start, size_t size) {
  function step_tracing (line 255) | static void step_tracing(struct cpu_state *cpu, struct tlb *tlb, int pid...
  function prepare_tracee (line 431) | static void prepare_tracee(int pid) {
  function main (line 461) | int main(int argc, char *const argv[]) {
  function dump_memory (line 506) | void dump_memory(int pid, const char *file, addr_t start, addr_t end) {

FILE: tools/ptutil.c
  function trycall (line 18) | long trycall(long res, const char *msg) {
  function start_tracee (line 25) | int start_tracee(int at, const char *path, char *const argv[], char *con...
  function open_mem (line 57) | int open_mem(int pid) {
  function pt_readn (line 63) | void pt_readn(int pid, addr_t addr, void *buf, size_t count) {
  function pt_writen (line 70) | void pt_writen(int pid, addr_t addr, void *buf, size_t count) {
  function dword_t (line 77) | dword_t pt_read(int pid, addr_t addr) {
  function pt_write (line 83) | void pt_write(int pid, addr_t addr, dword_t val) {
  function pt_write8 (line 87) | void pt_write8(int pid, addr_t addr, byte_t val) {

FILE: tools/undefined-flags.c
  function undefined_flags_mask (line 12) | int undefined_flags_mask(struct cpu_state *cpu, struct tlb *tlb) {

FILE: tools/undefined-flags.h
  type cpu_state (line 4) | struct cpu_state
  type tlb (line 4) | struct tlb

FILE: tools/unicornomatic.c
  function trycall (line 22) | long trycall(long res, const char *msg) {
  function uc_trycall (line 29) | void uc_trycall(uc_err res, const char *msg) {
  function uc_getreg (line 36) | uint32_t uc_getreg(uc_engine *uc, int reg_id) {
  function uc_setreg (line 42) | void uc_setreg(uc_engine *uc, int reg_id, uint32_t value) {
  function uc_read (line 46) | void uc_read(uc_engine *uc, addr_t addr, void *buf, size_t size) {
  function uc_write (line 50) | void uc_write(uc_engine *uc, addr_t addr, void *buf, size_t size) {
  function uc_unmap (line 54) | static void uc_unmap(uc_engine *uc, addr_t start, dword_t size) {
  function uc_map (line 59) | static void uc_map(uc_engine *uc, addr_t start, dword_t size) {
  function uc_map_ptr (line 65) | static void uc_map_ptr(uc_engine *uc, addr_t start, void *mem, dword_t s...
  type uc_regs (line 72) | struct uc_regs {
  function uc_getregs (line 95) | void uc_getregs(uc_engine *uc, struct uc_regs *regs) {
  function uc_setregs (line 106) | void uc_setregs(uc_engine *uc, struct uc_regs *regs) {
  function compare_cpus (line 118) | int compare_cpus(struct cpu_state *cpu, struct tlb *tlb, uc_engine *uc, ...
  function _mem_sync (line 198) | static void _mem_sync(struct tlb *tlb, uc_engine *uc, addr_t addr, dword...
  function step_tracing (line 204) | void step_tracing(struct cpu_state *cpu, struct tlb *tlb, uc_engine *uc) {
  function uc_interrupt_callback (line 369) | static void uc_interrupt_callback(uc_engine *uc, uint32_t interrupt, voi...
  function uc_unmapped_callback (line 374) | static bool uc_unmapped_callback(uc_engine *uc, uc_mem_type UNUSED(type)...
  type gdt_entry (line 386) | struct gdt_entry {
  function setup_gdt (line 405) | static void setup_gdt(uc_engine *uc) {
  function set_tls_pointer (line 431) | static void set_tls_pointer(uc_engine *uc, dword_t tls_ptr) {
  function uc_engine (line 441) | uc_engine *start_unicorn(struct cpu_state *cpu, struct mem *mem) {
  function main (line 478) | int main(int argc, char *const argv[]) {
  function dump_memory (line 507) | void dump_memory(uc_engine *uc, const char *file, addr_t start, size_t s...

FILE: tools/vdso-dump.c
  function main (line 5) | int main() {

FILE: tools/vdso-transplant-main.c
  function main (line 19) | int main(int UNUSED(argc), char *const argv[]) {

FILE: tools/vdso-transplant.c
  function addr_t (line 11) | static addr_t aux_addr(int pid, unsigned type) {
  function aux_write (line 37) | static void aux_write(int pid, int type, dword_t value) {
  function transplant_vdso (line 41) | void transplant_vdso(int pid, const void *new_vdso, size_t new_vdso_size) {

FILE: util/bits.h
  type bits_t (line 4) | typedef void bits_t;
  function bit_test (line 7) | static inline bool bit_test(size_t i, bits_t *data) {
  function bit_set (line 12) | static inline void bit_set(size_t i, bits_t *data) {
  function bit_clear (line 17) | static inline void bit_clear(size_t i, bits_t *data) {

FILE: util/fchdir.c
  function lock_fchdir (line 6) | void lock_fchdir(int dirfd) {
  function unlock_fchdir (line 11) | void unlock_fchdir() {

FILE: util/fifo.c
  function fifo_init (line 5) | void fifo_init(struct fifo *fifo, size_t capacity) {
  function fifo_destroy (line 11) | void fifo_destroy(struct fifo *fifo) {
  function fifo_capacity (line 15) | size_t fifo_capacity(struct fifo *fifo) {
  function fifo_size (line 18) | size_t fifo_size(struct fifo *fifo) {
  function fifo_remaining (line 21) | size_t fifo_remaining(struct fifo *fifo) {
  function fifo_write (line 25) | int fifo_write(struct fifo *fifo, const void *data, size_t size, int fla...
  function fifo_read (line 44) | int fifo_read(struct fifo *fifo, void *buf, size_t size, int flags) {
  function fifo_flush (line 65) | void fifo_flush(struct fifo *fifo) {

FILE: util/fifo.h
  type fifo (line 5) | struct fifo {
  type fifo (line 13) | struct fifo
  type fifo (line 14) | struct fifo
  type fifo (line 16) | struct fifo
  type fifo (line 17) | struct fifo
  type fifo (line 18) | struct fifo
  type fifo (line 22) | struct fifo
  type fifo (line 27) | struct fifo
  type fifo (line 29) | struct fifo

FILE: util/list.h
  type list (line 7) | struct list {
  function list_init (line 13) | static inline void list_init(struct list *list) {
  function list_null (line 20) | static inline bool list_null(struct list *list) {
  function list_empty (line 24) | static inline bool list_empty(struct list *list) {
  function _list_add_between (line 28) | static inline void _list_add_between(struct list *prev, struct list *nex...
  function list_add_tail (line 35) | static inline void list_add_tail(struct list *list, struct list *item) {
  function list_add (line 39) | static inline void list_add(struct list *list, struct list *item) {
  function list_add_before (line 43) | static inline void list_add_before(struct list *before, struct list *ite...
  function list_add_after (line 46) | static inline void list_add_after(struct list *after, struct list *item) {
  function list_init_add (line 50) | static inline void list_init_add(struct list *list, struct list *item) {
  function list_remove (line 56) | static inline void list_remove(struct list *item) {
  function list_remove_safe (line 62) | static inline void list_remove_safe(struct list *item) {
  function list_size (line 90) | static inline unsigned long list_size(struct list *list) {

FILE: util/refcount.h
  type refcount (line 10) | struct refcount {
  function __refcount_init (line 14) | static inline void __refcount_init(struct refcount *refcount) {
  function __refcount_get (line 19) | static inline int __refcount_get(struct refcount *refcount) {

FILE: util/sync.c
  function cond_init (line 8) | void cond_init(cond_t *cond) {
  function cond_destroy (line 16) | void cond_destroy(cond_t *cond) {
  function is_signal_pending (line 20) | static bool is_signal_pending(lock_t *lock) {
  function wait_for (line 31) | int wait_for(cond_t *cond, lock_t *lock, struct timespec *timeout) {
  function wait_for_ignore_signals (line 42) | int wait_for_ignore_signals(cond_t *cond, lock_t *lock, struct timespec ...
  function notify (line 88) | void notify(cond_t *cond) {
  function notify_once (line 91) | void notify_once(cond_t *cond) {
  function sigusr1_handler (line 98) | void sigusr1_handler() {

FILE: util/sync.h
  type lock_t (line 16) | typedef struct {
  function lock_init (line 29) | static inline void lock_init(lock_t *lock) {
  function __lock (line 43) | static inline void __lock(lock_t *lock, __attribute__((unused)) const ch...
  function unlock (line 56) | static inline void unlock(lock_t *lock) {
  function trylock (line 66) | static inline int trylock(lock_t *lock, __attribute__((unused)) const ch...
  type cond_t (line 83) | typedef struct {
  type timespec (line 96) | struct timespec
  type timespec (line 98) | struct timespec
  type wrlock_t (line 108) | typedef struct {
  function wrlock_init (line 118) | static inline void wrlock_init(wrlock_t *lock) {
  function wrlock_destroy (line 132) | static inline void wrlock_destroy(wrlock_t *lock) {
  function read_wrlock (line 135) | static inline void read_wrlock(wrlock_t *lock) {
  function read_wrunlock (line 140) | static inline void read_wrunlock(wrlock_t *lock) {
  function __write_wrlock (line 145) | static inline void __write_wrlock(wrlock_t *lock, const char *file, int ...
  function write_wrunlock (line 154) | static inline void write_wrunlock(wrlock_t *lock) {
  function sigunwind_start (line 163) | static inline int sigunwind_start(void) {
  function sigunwind_end (line 172) | static inline void sigunwind_end(void) {

FILE: util/timer.c
  type timer (line 7) | struct timer
  type timer (line 9) | struct timer
  type timer (line 9) | struct timer
  function timer_free (line 20) | void timer_free(struct timer *timer) {
  type timer (line 34) | struct timer
  type timespec (line 37) | struct timespec
  function timer_set (line 61) | int timer_set(struct timer *timer, struct timer_spec spec, struct timer_...

FILE: util/timer.h
  function timespec_now (line 10) | static inline struct timespec timespec_now(clockid_t clockid) {
  function timespec_add (line 17) | static inline struct timespec timespec_add(struct timespec x, struct tim...
  function timespec_subtract (line 27) | static inline struct timespec timespec_subtract(struct timespec x, struc...
  function timespec_is_zero (line 38) | static inline bool timespec_is_zero(struct timespec ts) {
  function timespec_positive (line 42) | static inline bool timespec_positive(struct timespec ts) {
  function timespec_normalize (line 46) | static inline struct timespec timespec_normalize(struct timespec ts) {
  type timer (line 53) | struct timer {
  type timer (line 69) | struct timer
  type timer (line 70) | struct timer
  type timer_spec (line 75) | struct timer_spec {
  type timer (line 79) | struct timer
  type timer_spec (line 79) | struct timer_spec
  type timer_spec (line 79) | struct timer_spec

FILE: vdso/vdso.c
  type time_t (line 5) | typedef long time_t;
  type clockid_t (line 6) | typedef int clockid_t;
  function time_t (line 8) | time_t __vdso_time(time_t *t) {
  function __vdso_gettimeofday (line 15) | int __vdso_gettimeofday(void *timeval, void *timezone) {
  function __vdso_clock_gettime (line 22) | int __vdso_clock_gettime(clockid_t clock, void *timespec) {

FILE: xX_main_Xx.h
  function exit_handler (line 18) | static void exit_handler(struct task *task, int code) {
  function xX_main_Xx (line 30) | static inline int xX_main_Xx(int argc, char *const argv[], const char *e...
Condensed preview — 413 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,443K chars).
[
  {
    "path": ".editorconfig",
    "chars": 87,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size = 4\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 65,
    "preview": "patreon: tbodt\ngithub: tbodt\ncustom: https://www.paypal.me/tbodt\n"
  },
  {
    "path": ".github/workflows/autolabel.yml",
    "chars": 638,
    "preview": "name: Auto-Label\non:\n  issues:\n    types: [opened]\njobs:\n  label:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: sa"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1607,
    "preview": "name: CI\n\non:\n  push:\n  pull_request:\n      branches: [master]\n\njobs:\n  build-linux:\n    runs-on: ubuntu-20.04\n    strat"
  },
  {
    "path": ".github/workflows/deploy-site.yml",
    "chars": 233,
    "preview": "name: Deploy Site\non:\n  release:\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Trigger Deploy\n     "
  },
  {
    "path": ".github/workflows/update-alpine-repo.yml",
    "chars": 1529,
    "preview": "name: \"Update Repo\"\non:\n  workflow_dispatch:\n  schedule:\n    - cron: \"0 0 * * 6\"\n\njobs:\n  update:\n    if: github.reposit"
  },
  {
    "path": ".github/workflows/upload-build.yml",
    "chars": 1526,
    "preview": "name: Upload Build\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: \"0 6 * * *\"\n\njobs:\n  upload-build:\n    if: github.r"
  },
  {
    "path": ".gitignore",
    "chars": 235,
    "preview": "build/\nxcuserdata/\n.floo\n\ncross-*.txt\nroot.tar.gz\n\nnode_modules\napp/xtermjs/xterm-dist\napp/xtermjs/.cache\n\nsubprojects/\n"
  },
  {
    "path": ".gitmodules",
    "chars": 302,
    "preview": "[submodule \"libapps\"]\n\tpath = deps/libapps\n\turl = https://github.com/ish-app/libapps\n[submodule \"deps/libarchive\"]\n\tpath"
  },
  {
    "path": "Gemfile",
    "chars": 144,
    "preview": "source \"https://rubygems.org\"\ngem \"fastlane\"\ngem \"dotenv\"\ngem \"pry\"\n\ngem \"abbrev\"\ngem \"irb\"\ngem \"rdoc\"\ngem \"mutex_m\"\ngem"
  },
  {
    "path": "ISSUE_TEMPLATE.md",
    "chars": 368,
    "preview": "<!--\nIf you're reporting a crash, please include a crash dump. You can find them in Settings -> Privacy -> Analytics -> "
  },
  {
    "path": "LICENSE.IOS",
    "chars": 782,
    "preview": "The iSH developers are aware that the terms of service that apply to\napps distributed via Apple's App Store services may"
  },
  {
    "path": "LICENSE.md",
    "chars": 1730,
    "preview": "iSH is licensed under the [GPLv3][]. The additional terms in LICENSE.IOS also apply.\n\nContributions made after commit 0e"
  },
  {
    "path": "README.md",
    "chars": 5478,
    "preview": "# [iSH](https://ish.app)\n\n[![Build Status](https://github.com/ish-app/ish/actions/workflows/ci.yml/badge.svg)](https://g"
  },
  {
    "path": "README_JP.md",
    "chars": 3533,
    "preview": "# [iSH](https://ish.app)\n\n[![Build Status](https://github.com/ish-app/ish/actions/workflows/ci.yml/badge.svg)](https://g"
  },
  {
    "path": "README_KO.md",
    "chars": 3738,
    "preview": "# [iSH](https://ish.app)\n\n[![Build Status](https://github.com/ish-app/ish/actions/workflows/ci.yml/badge.svg)](https://g"
  },
  {
    "path": "README_ZH.md",
    "chars": 3464,
    "preview": "# [iSH](https://ish.app)\n\n[![Build Status](https://github.com/ish-app/ish/actions/workflows/ci.yml/badge.svg)](https://g"
  },
  {
    "path": "SECURITY.md",
    "chars": 1110,
    "preview": "# iSH is not a security boundary!\n\nThe goal of this project is to support a Linux shell on iOS. As such, its security mo"
  },
  {
    "path": "app/AboutAppearanceViewController.h",
    "chars": 268,
    "preview": "//\n//  ThemeViewController.h\n//  iSH\n//\n//  Created by Charlie Melbye on 11/12/18.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUM"
  },
  {
    "path": "app/AboutAppearanceViewController.m",
    "chars": 11680,
    "preview": "//\n//  ThemeViewController.m\n//  iSH\n//\n//  Created by Charlie Melbye on 11/12/18.\n//\n\n#import \"AboutAppearanceViewContr"
  },
  {
    "path": "app/AboutExternalKeyboardViewController.h",
    "chars": 247,
    "preview": "//\n//  CapsLockMappingViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 12/2/18.\n//\n\n#import <UIKit/UIKit.h>"
  },
  {
    "path": "app/AboutExternalKeyboardViewController.m",
    "chars": 3591,
    "preview": "//\n//  CapsLockMappingViewController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 12/2/18.\n//\n\n#import \"AboutExternalK"
  },
  {
    "path": "app/AboutNavigationController.h",
    "chars": 234,
    "preview": "//\n//  AboutNavigationController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 10/6/19.\n//\n\n#import <UIKit/UIKit.h>\n\nNS"
  },
  {
    "path": "app/AboutNavigationController.m",
    "chars": 725,
    "preview": "//\n//  AboutNavigationController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 10/6/19.\n//\n\n#import \"AboutNavigationCon"
  },
  {
    "path": "app/AboutViewController.h",
    "chars": 285,
    "preview": "//\n//  AboutViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 9/23/18.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUM"
  },
  {
    "path": "app/AboutViewController.m",
    "chars": 6955,
    "preview": "//\n//  AboutViewController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 9/23/18.\n//\n\n#import \"AboutViewController.h\"\n#"
  },
  {
    "path": "app/AccessibilityFixes.m",
    "chars": 1554,
    "preview": "//\n//  AccessibilityFixes.m\n//  iSH\n//\n//  Created by Saagar Jha on 12/31/22.\n//\n\n#import \"hook.h\"\n#import <UIKit/UIKit."
  },
  {
    "path": "app/AltIconViewController.h",
    "chars": 309,
    "preview": "//\n//  IconViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 12/13/19.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUM"
  },
  {
    "path": "app/AltIconViewController.m",
    "chars": 5883,
    "preview": "//\n//  IconViewController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 12/13/19.\n//\n\n#import \"AltIconViewController.h\""
  },
  {
    "path": "app/App.xcconfig",
    "chars": 553,
    "preview": "#include \"iOS.xcconfig\"\n\nPRODUCT_NAME = iSH\nPRODUCT_BUNDLE_IDENTIFIER = $(PRODUCT_BUNDLE_IDENTIFIER)\nINFOPLIST_FILE = ap"
  },
  {
    "path": "app/AppDelegate.h",
    "chars": 483,
    "preview": "//\n//  AppDelegate.h\n//  iSH\n//\n//  Created by Theodore Dubois on 10/17/17.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface AppD"
  },
  {
    "path": "app/AppDelegate.m",
    "chars": 14433,
    "preview": "//\n//  AppDelegate.m\n//  iSH\n//\n//  Created by Theodore Dubois on 10/17/17.\n//\n\n#include <resolv.h>\n#include <arpa/inet."
  },
  {
    "path": "app/AppGroup.h",
    "chars": 138,
    "preview": "//\n//  AppGroup.h\n//  iSH\n//\n//  Created by Theodore Dubois on 2/28/20.\n//\n\n#import <Foundation/Foundation.h>\n\nNSURL *Co"
  },
  {
    "path": "app/AppGroup.m",
    "chars": 3929,
    "preview": "//\n//  AppGroup.m\n//  iSH\n//\n//  Created by Theodore Dubois on 2/28/20.\n//\n\n#import \"AppGroup.h\"\n#import <Foundation/Fou"
  },
  {
    "path": "app/AppLib.xcconfig",
    "chars": 114,
    "preview": "#include \"StaticLib.xcconfig\"\nHEADER_SEARCH_PATHS = $(inherited) $(SRCROOT) $(SRCROOT)/deps/libarchive/libarchive\n"
  },
  {
    "path": "app/ArrowBarButton.h",
    "chars": 441,
    "preview": "//\n//  ArrowBarButton.h\n//  iSH\n//\n//  Created by Theodore Dubois on 9/23/18.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NON"
  },
  {
    "path": "app/ArrowBarButton.m",
    "chars": 7261,
    "preview": "//\n//  ArrowBarButton.m\n//  iSH\n//\n//  Created by Theodore Dubois on 9/23/18.\n//\n\n#import \"ArrowBarButton.h\"\n\n\n@interfac"
  },
  {
    "path": "app/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 2299,
    "preview": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon20x20@2x.png\",\n      \"s"
  },
  {
    "path": "app/Assets.xcassets/Checkbox.imageset/Contents.json",
    "chars": 272,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"checkbox.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"versi"
  },
  {
    "path": "app/Assets.xcassets/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "app/Assets.xcassets/Hide Keyboard.imageset/Contents.json",
    "chars": 231,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hide Keyboard.pdf\"\n    }\n  ],\n  \"info\" : {\n    \""
  },
  {
    "path": "app/Assets.xcassets/Paste.imageset/Contents.json",
    "chars": 223,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Paste.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\""
  },
  {
    "path": "app/Assets.xcassets/Saddam Hussein.imageset/Contents.json",
    "chars": 159,
    "preview": "{\n  \"images\" : [\n    {\n      \"filename\" : \"satanusen.png\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"auth"
  },
  {
    "path": "app/Assets.xcassets/X.imageset/Contents.json",
    "chars": 296,
    "preview": "{\n  \"images\" : [\n    {\n      \"filename\" : \"xmark.circle.fill.regular.large.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n"
  },
  {
    "path": "app/BarButton.h",
    "chars": 334,
    "preview": "//\n//  AccessoryButton.h\n//  iSH\n//\n//  Created by Theodore Dubois on 9/22/18.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NO"
  },
  {
    "path": "app/BarButton.m",
    "chars": 2458,
    "preview": "//\n//  AccessoryButton.m\n//  iSH\n//\n//  Created by Theodore Dubois on 9/22/18.\n//\n\n#import \"BarButton.h\"\n\n@interface Bar"
  },
  {
    "path": "app/Base.lproj/About.storyboard",
    "chars": 127380,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "app/Base.lproj/LaunchScreen.storyboard",
    "chars": 2006,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "app/Base.lproj/Terminal.storyboard",
    "chars": 22770,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "app/CLI.xcconfig",
    "chars": 162,
    "preview": "CODE_SIGN_IDENTITY = -\nENABLE_HARDENED_RUNTIME = YES\nHEADER_SEARCH_PATHS = $(SRCROOT)\nPRODUCT_NAME = $(TARGET_NAME)\nSDKR"
  },
  {
    "path": "app/CurrentRoot.h",
    "chars": 1010,
    "preview": "//\n//  CurrentRoot.h\n//  iSH\n//\n//  Created by Theodore Dubois on 11/4/21.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASS"
  },
  {
    "path": "app/CurrentRoot.m",
    "chars": 4150,
    "preview": "//\n//  CurrentRoot.m\n//  iSH\n//\n//  Created by Theodore Dubois on 11/4/21.\n//\n\n#import \"CurrentRoot.h\"\n#include \"kernel/"
  },
  {
    "path": "app/DelayedUITask.h",
    "chars": 239,
    "preview": "//\n//  DelayedUITask.h\n//  iSH\n//\n//  Created by Theodore Dubois on 11/8/17.\n//\n\n#import <Foundation/Foundation.h>\n\n@int"
  },
  {
    "path": "app/DelayedUITask.m",
    "chars": 820,
    "preview": "//\n//  DelayedUITask.m\n//  iSH\n//\n//  Created by Theodore Dubois on 11/8/17.\n//\n\n#import \"DelayedUITask.h\"\n\n@interface D"
  },
  {
    "path": "app/ExceptionExfiltrator.h",
    "chars": 267,
    "preview": "//\n//  ExceptionExfiltrator.h\n//  iSH\n//\n//  Created by Saagar Jha on 5/5/23.\n//\n\n#ifndef ExceptionExfiltrator_h\n#define"
  },
  {
    "path": "app/ExceptionExfiltrator.m",
    "chars": 6118,
    "preview": "//\n//  ExceptionExfiltrator.m\n//  libiSHApp\n//\n//  Created by Saagar Jha on 5/5/23.\n//\n\n#import \"ExceptionExfiltrator.h\""
  },
  {
    "path": "app/FileProvider/FileProviderEnumerator.h",
    "chars": 334,
    "preview": "//\n//  FileProviderEnumerator.h\n//  iSHFiles\n//\n//  Created by Theodore Dubois on 9/20/18.\n//\n\n#import <FileProvider/Fil"
  },
  {
    "path": "app/FileProvider/FileProviderEnumerator.m",
    "chars": 3554,
    "preview": "//\n//  FileProviderEnumerator.m\n//  iSHFiles\n//\n//  Created by Theodore Dubois on 9/20/18.\n//\n\n#import <MobileCoreServic"
  },
  {
    "path": "app/FileProvider/FileProviderExtension.h",
    "chars": 347,
    "preview": "//\n//  FileProviderExtension.h\n//  iSHFiles\n//\n//  Created by Theodore Dubois on 9/20/18.\n//\n\n#import <FileProvider/File"
  },
  {
    "path": "app/FileProvider/FileProviderExtension.m",
    "chars": 19362,
    "preview": "//\n//  FileProviderExtension.m\n//  iSHFiles\n//\n//  Created by Theodore Dubois on 9/20/18.\n//\n\n#import \"FileProviderExten"
  },
  {
    "path": "app/FileProvider/FileProviderItem.h",
    "chars": 617,
    "preview": "//\n//  FileProviderItem.h\n//  iSHFiles\n//\n//  Created by Theodore Dubois on 9/20/18.\n//\n\n#import <FileProvider/FileProvi"
  },
  {
    "path": "app/FileProvider/FileProviderItem.m",
    "chars": 8101,
    "preview": "//\n//  FileProviderItem.m\n//  iSHFiles\n//\n//  Created by Theodore Dubois on 9/20/18.\n//\n\n#import <MobileCoreServices/Mob"
  },
  {
    "path": "app/FileProvider/Info.plist",
    "chars": 1173,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "app/FileProvider/NSError+ISHErrno.h",
    "chars": 343,
    "preview": "//\n//  NSError+ISHErrno.h\n//  iSH\n//\n//  Created by Theodore Dubois on 12/15/18.\n//\n\n#import <Foundation/Foundation.h>\n\n"
  },
  {
    "path": "app/FileProvider/NSError+ISHErrno.m",
    "chars": 731,
    "preview": "//\n//  NSError+ISHErrno.m\n//  iSH\n//\n//  Created by Theodore Dubois on 12/15/18.\n//\n\n#import <FileProvider/FileProvider."
  },
  {
    "path": "app/FileProvider/iSHFileProvider.entitlements",
    "chars": 308,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "app/FontPickerViewController.h",
    "chars": 308,
    "preview": "//\n//  FontPickerViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 10/26/19.\n//\n\n#import <UIKit/UIKit.h>\n\nNS"
  },
  {
    "path": "app/FontPickerViewController.m",
    "chars": 1769,
    "preview": "//\n//  FontPickerViewController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 10/26/19.\n//\n\n#import \"FontPickerViewCont"
  },
  {
    "path": "app/IOSCalls.m",
    "chars": 1704,
    "preview": "//\n//  IOSCalls.m\n//  libiSHApp\n//\n//  Created by Theodore Dubois on 8/15/21.\n//\n\n#if ISH_LINUX\n\n#include <UIKit/UIKit.h"
  },
  {
    "path": "app/Icons/Icons.plist",
    "chars": 5295,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "app/Info.plist",
    "chars": 2912,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "app/Linux.xcconfig",
    "chars": 393,
    "preview": "ISH_KERNEL = linux\nNINJA_TARGETS = deps/liblinux.a libfakefs.a libish_emu.a\nLINUX_HOSTCC = env -u SDKROOT -u IPHONEOS_DE"
  },
  {
    "path": "app/LinuxInterop.c",
    "chars": 5380,
    "preview": "//\n//  LinuxInterop.c\n//  iSH\n//\n//  Created by Theodore Dubois on 7/3/21.\n//\n\n#include \"LinuxInterop.h\"\n#include <Block"
  },
  {
    "path": "app/LinuxInterop.h",
    "chars": 2062,
    "preview": "//\n//  LinuxInterop.h\n//  iSH\n//\n//  Created by Theodore Dubois on 7/3/21.\n//\n\n#ifndef LinuxInterop_h\n#define LinuxInter"
  },
  {
    "path": "app/LinuxPTY.c",
    "chars": 6300,
    "preview": "//\n//  LinuxPTY.c\n//  libiSHLinux\n//\n//  Created by Theodore Dubois on 12/30/21.\n//\n\n#include <linux/init.h>\n#include <l"
  },
  {
    "path": "app/LinuxRoot.c",
    "chars": 991,
    "preview": "//\n//  LinuxRoot.c\n//  libiSHLinux\n//\n//  Created by Theodore Dubois on 12/29/21.\n//\n\n#include <linux/init.h>\n#include <"
  },
  {
    "path": "app/LinuxTTY.c",
    "chars": 5223,
    "preview": "//\n//  LinuxTTY.c\n//  libiSHLinux\n//\n//  Created by Theodore Dubois on 8/15/21.\n//\n\n#include \"LinuxInterop.h\"\n#include <"
  },
  {
    "path": "app/LocationDevice.h",
    "chars": 119,
    "preview": "//\n//  LocationDevice.h\n//  iSH\n//\n//  Created by Theodore Dubois on 10/20/19.\n//\n\nextern struct dev_ops location_dev;\n"
  },
  {
    "path": "app/LocationDevice.m",
    "chars": 4553,
    "preview": "//\n//  LocationDevice.m\n//  iSH\n//\n//  Created by Theodore Dubois on 10/20/19.\n//\n\n#import <Foundation/Foundation.h>\n#im"
  },
  {
    "path": "app/NSObject+SaneKVO.h",
    "chars": 687,
    "preview": "//\n//  NSObject+SaneKVO.h\n//  iSH\n//\n//  Created by Theodore Dubois on 11/10/20.\n//\n\n#import <Foundation/Foundation.h>\n\n"
  },
  {
    "path": "app/NSObject+SaneKVO.m",
    "chars": 2208,
    "preview": "//\n//  NSObject+SaneKVO.m\n//  iSH\n//\n//  Created by Theodore Dubois on 11/10/20.\n//\n\n#import <objc/runtime.h>\n#import \"N"
  },
  {
    "path": "app/NotLinux.xcconfig",
    "chars": 50,
    "preview": "NINJA_TARGETS = libish.a libish_emu.a libfakefs.a\n"
  },
  {
    "path": "app/PassthroughView.h",
    "chars": 199,
    "preview": "//\n//  PassthroughView.h\n//  iSH\n//\n//  Created by Theodore Dubois on 11/24/20.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_N"
  },
  {
    "path": "app/PassthroughView.m",
    "chars": 434,
    "preview": "//\n//  PassthroughView.m\n//  iSH\n//\n//  Created by Theodore Dubois on 11/24/20.\n//\n\n#import \"PassthroughView.h\"\n\n@implem"
  },
  {
    "path": "app/PasteboardDevice.h",
    "chars": 94,
    "preview": "// Pasteboard is implementation of /dev/clipboard device\nextern struct dev_ops clipboard_dev;\n"
  },
  {
    "path": "app/PasteboardDevice.m",
    "chars": 6150,
    "preview": "#include <string.h>\n#import <UIKit/UIKit.h>\n#include \"fs/poll.h\"\n#include \"fs/dyndev.h\"\n#include \"kernel/errno.h\"\n#inclu"
  },
  {
    "path": "app/PasteboardDeviceLinux.c",
    "chars": 3970,
    "preview": "//\n//  PasteboardDeviceLinux.c\n//  iSH+Linux\n//\n//  Created by Theodore Dubois on 2/19/22.\n//\n\n#include <linux/slab.h>\n#"
  },
  {
    "path": "app/ProgressReportViewController.h",
    "chars": 357,
    "preview": "//\n//  ProgressReportViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 6/18/20.\n//\n\n#import <UIKit/UIKit.h>\n"
  },
  {
    "path": "app/ProgressReportViewController.m",
    "chars": 2133,
    "preview": "//\n//  ProgressReportViewController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 6/18/20.\n//\n\n#import \"ProgressReportV"
  },
  {
    "path": "app/Project.xcconfig",
    "chars": 429,
    "preview": "#include \"iSH.xcconfig\"\n\nMARKETING_VERSION = 1.3.3\n\nENABLE_BITCODE = NO // no idea why\nPRODUCT_BUNDLE_IDENTIFIER = $(ROO"
  },
  {
    "path": "app/ProjectDebug.xcconfig",
    "chars": 88,
    "preview": "#include \"XcodeDebug.xcconfig\"\n#include \"Project.xcconfig\"\n#include \"NotLinux.xcconfig\"\n"
  },
  {
    "path": "app/ProjectDebugLinux.xcconfig",
    "chars": 85,
    "preview": "#include \"XcodeDebug.xcconfig\"\n#include \"Project.xcconfig\"\n#include \"Linux.xcconfig\"\n"
  },
  {
    "path": "app/ProjectRelease.xcconfig",
    "chars": 90,
    "preview": "#include \"XcodeRelease.xcconfig\"\n#include \"Project.xcconfig\"\n#include \"NotLinux.xcconfig\"\n"
  },
  {
    "path": "app/ProjectReleaseLinux.xcconfig",
    "chars": 87,
    "preview": "#include \"XcodeRelease.xcconfig\"\n#include \"Project.xcconfig\"\n#include \"Linux.xcconfig\"\n"
  },
  {
    "path": "app/Roots.h",
    "chars": 985,
    "preview": "//\n//  Roots.h\n//  iSH\n//\n//  Created by Theodore Dubois on 6/7/20.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NON"
  },
  {
    "path": "app/Roots.m",
    "chars": 9586,
    "preview": "//\n//  Roots.m\n//  iSH\n//\n//  Created by Theodore Dubois on 6/7/20.\n//\n\n#import <FileProvider/FileProvider.h>\n#import \"R"
  },
  {
    "path": "app/Roots.storyboard",
    "chars": 33561,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "app/RootsTableViewController.h",
    "chars": 257,
    "preview": "//\n//  RootsTableViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 6/7/20.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_A"
  },
  {
    "path": "app/RootsTableViewController.m",
    "chars": 9674,
    "preview": "//\n//  RootsTableViewController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 6/7/20.\n//\n\n#import \"Roots.h\"\n#import \"Ro"
  },
  {
    "path": "app/SceneDelegate.h",
    "chars": 386,
    "preview": "//\n//  SceneDelegate.h\n//  iSH\n//\n//  Created by Theodore Dubois on 10/26/19.\n//\n\n#import <UIKit/UIKit.h>\n#import \"Termi"
  },
  {
    "path": "app/SceneDelegate.m",
    "chars": 2363,
    "preview": "//\n//  SceneDelegate.m\n//  iSH\n//\n//  Created by Theodore Dubois on 10/26/19.\n//\n\n#import \"SceneDelegate.h\"\n#import \"Abo"
  },
  {
    "path": "app/ScrollbarView.h",
    "chars": 253,
    "preview": "//\n//  ScrollbarView.h\n//  iSH\n//\n//  Created by Theodore Dubois on 9/2/19.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNU"
  },
  {
    "path": "app/ScrollbarView.m",
    "chars": 1602,
    "preview": "//\n//  ScrollbarView.m\n//  iSH\n//\n//  Created by Theodore Dubois on 9/2/19.\n//\n\n#import \"ScrollbarView.h\"\n\n@class Scroll"
  },
  {
    "path": "app/Settings.bundle/Root.plist",
    "chars": 721,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "app/StaticLib.xcconfig",
    "chars": 89,
    "preview": "SKIP_INSTALL = YES\nEXECUTABLE_PREFIX =\nPRODUCT_NAME = $(TARGET_NAME)\nVERSIONING_SYSTEM =\n"
  },
  {
    "path": "app/StaticLibLinux.xcconfig",
    "chars": 887,
    "preview": "#include \"StaticLib.xcconfig\"\n\nHEADER_SEARCH_PATHS = $(SRCROOT)/deps/linux/arch/ish/include $(MESON_BUILD_DIR)/deps/linu"
  },
  {
    "path": "app/StaticLibLinuxUser.xcconfig",
    "chars": 227,
    "preview": "#include \"StaticLib.xcconfig\"\n\nHEADER_SEARCH_PATHS = $(SRCROOT)/deps/linux/arch/ish/include $(SRCROOT)/deps/linux/includ"
  },
  {
    "path": "app/Terminal.h",
    "chars": 1103,
    "preview": "//\n//  Terminal.h\n//  iSH\n//\n//  Created by Theodore Dubois on 10/18/17.\n//\n\n#import <UIKit/UIKit.h>\n#import <WebKit/Web"
  },
  {
    "path": "app/Terminal.m",
    "chars": 12819,
    "preview": "//\n//  Terminal.m\n//  iSH\n//\n//  Created by Theodore Dubois on 10/18/17.\n//\n\n#import \"Terminal.h\"\n#import \"DelayedUITask"
  },
  {
    "path": "app/TerminalView.h",
    "chars": 785,
    "preview": "//\n//  TerminalView.h\n//  iSH\n//\n//  Created by Theodore Dubois on 11/3/17.\n//\n\n#import <UIKit/UIKit.h>\n#import \"Termina"
  },
  {
    "path": "app/TerminalView.m",
    "chars": 23811,
    "preview": "//\n//  TerminalView.m\n//  iSH\n//\n//  Created by Theodore Dubois on 11/3/17.\n//\n\n#import \"ScrollbarView.h\"\n#import \"Termi"
  },
  {
    "path": "app/TerminalViewController.h",
    "chars": 490,
    "preview": "//\n//  ViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 10/17/17.\n//\n\n#import <UIKit/UIKit.h>\n#import \"Term"
  },
  {
    "path": "app/TerminalViewController.m",
    "chars": 21340,
    "preview": "//\n//  ViewController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 10/17/17.\n//\n\n#import \"TerminalViewController.h\"\n#i"
  },
  {
    "path": "app/Theme.h",
    "chars": 2141,
    "preview": "//\n//  Theme.h\n//  iSH\n//\n//  Created by Saagar Jha on 2/25/22.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@i"
  },
  {
    "path": "app/Theme.m",
    "chars": 16838,
    "preview": "//\n//  Theme.m\n//  iSH\n//\n//  Created by Saagar Jha on 2/25/22.\n//\n\n#import \"Theme.h\"\n#import \"UserPreferences.h\"\n#impor"
  },
  {
    "path": "app/ThemeViewController.h",
    "chars": 290,
    "preview": "//\n//  ThemeViewController.h\n//  libiSHApp\n//\n//  Created by Saagar Jha on 7/16/22.\n//\n\n#import <UIKit/UIKit.h>\n#import "
  },
  {
    "path": "app/ThemeViewController.m",
    "chars": 15376,
    "preview": "//\n//  ThemeViewController.m\n//  libiSHApp\n//\n//  Created by Saagar Jha on 7/16/22.\n//\n\n#import \"ThemeViewController.h\"\n"
  },
  {
    "path": "app/ThemesViewController.h",
    "chars": 244,
    "preview": "//\n//  ThemesViewController.h\n//  iSH\n//\n//  Created by Saagar Jha on 2/25/22.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NO"
  },
  {
    "path": "app/ThemesViewController.m",
    "chars": 11687,
    "preview": "//\n//  ThemesViewController.m\n//  iSH\n//\n//  Created by Saagar Jha on 2/25/22.\n//\n\n#import \"ThemesViewController.h\"\n\n#im"
  },
  {
    "path": "app/UIApplication+OpenURL.h",
    "chars": 237,
    "preview": "//\n//  UIApplication+OpenURL.h\n//  iSH\n//\n//  Created by Theodore Dubois on 9/23/18.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASS"
  },
  {
    "path": "app/UIApplication+OpenURL.m",
    "chars": 307,
    "preview": "//\n//  UIApplication+OpenURL.m\n//  iSH\n//\n//  Created by Theodore Dubois on 9/23/18.\n//\n\n#import \"UIApplication+OpenURL."
  },
  {
    "path": "app/UITests/Info.plist",
    "chars": 769,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "app/UITests/Screenshots.m",
    "chars": 4217,
    "preview": "//\n//  Screenshots.m\n//  iSHUITests\n//\n//  Created by Theodore Dubois on 12/18/20.\n//\n\n#import <UIKit/UIKit.h>\n#import <"
  },
  {
    "path": "app/UITests/Screenshots.xctestplan",
    "chars": 595,
    "preview": "{\n  \"configurations\" : [\n    {\n      \"id\" : \"963A2374-D06F-45E9-AD7A-628EE51BB5BF\",\n      \"name\" : \"Configuration 1\",\n  "
  },
  {
    "path": "app/UITests/UITests.m",
    "chars": 230,
    "preview": "//\n//  UITests.m\n//  UITests\n//\n//  Created by Theodore Dubois on 11/13/20.\n//\n\n#import <XCTest/XCTest.h>\n\n@interface UI"
  },
  {
    "path": "app/UIViewController+Extras.h",
    "chars": 271,
    "preview": "//\n//  UIViewController+Extras.h\n//  iSH\n//\n//  Created by Theodore Dubois on 9/23/18.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_A"
  },
  {
    "path": "app/UIViewController+Extras.m",
    "chars": 577,
    "preview": "//\n//  UIViewController+Extras.m\n//  iSH\n//\n//  Created by Theodore Dubois on 9/23/18.\n//\n\n#import \"UIViewController+Ext"
  },
  {
    "path": "app/UpgradeRootViewController.h",
    "chars": 229,
    "preview": "//\n//  UpgradeRootViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 11/27/21.\n//\n\n#import <UIKit/UIKit.h>\n\nN"
  },
  {
    "path": "app/UpgradeRootViewController.m",
    "chars": 4425,
    "preview": "//\n//  UpgradeRootViewController.m\n//  iSH\n//\n//  Created by Theodore Dubois on 11/27/21.\n//\n\n#import \"UpgradeRootViewCo"
  },
  {
    "path": "app/UserPreferences.h",
    "chars": 2361,
    "preview": "//\n//  UserPreferences.h\n//  iSH\n//\n//  Created by Charlie Melbye on 11/12/18.\n//\n\n#import <UIKit/UIKit.h>\n#import \"Them"
  },
  {
    "path": "app/UserPreferences.m",
    "chars": 21048,
    "preview": "//\n//  UserPreferences.m\n//  iSH\n//\n//  Created by Charlie Melbye on 11/12/18.\n//\n\n#import \"UserPreferences.h\"\n#import \""
  },
  {
    "path": "app/ViewController.h",
    "chars": 169,
    "preview": "//\n//  ViewController.h\n//  iSH\n//\n//  Created by Theodore Dubois on 10/17/17.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface T"
  },
  {
    "path": "app/XcodeDebug.xcconfig",
    "chars": 263,
    "preview": "#include \"XcodeDefault.xcconfig\"\n\nDEBUG_INFORMATION_FORMAT = dwarf;\nENABLE_TESTABILITY = YES;\nGCC_DYNAMIC_NO_PIC = NO;\nG"
  },
  {
    "path": "app/XcodeDefault.xcconfig",
    "chars": 1617,
    "preview": "ALWAYS_SEARCH_USER_PATHS = NO;\nCLANG_CXX_LANGUAGE_STANDARD = gnu++14;\nCLANG_CXX_LIBRARY = libc++;\nCLANG_ENABLE_MODULES ="
  },
  {
    "path": "app/XcodeRelease.xcconfig",
    "chars": 157,
    "preview": "#include \"XcodeDefault.xcconfig\"\n\nDEBUG_INFORMATION_FORMAT = dwarf-with-dsym;\nENABLE_NS_ASSERTIONS = NO;\nMTL_ENABLE_DEBU"
  },
  {
    "path": "app/gen_apk_repositories.py",
    "chars": 731,
    "preview": "import os\n\ndef trim(x, start, end):\n    assert x.startswith(start)\n    assert x.endswith(end)\n    return x[len(start):-l"
  },
  {
    "path": "app/hook.c",
    "chars": 8868,
    "preview": "//\n//  hook.c\n//  iSH\n//\n//  Created by Saagar Jha on 12/29/22.\n//\n\n#include \"hook.h\"\n#include \"mach_excServer.h\"\n#inclu"
  },
  {
    "path": "app/hook.h",
    "chars": 220,
    "preview": "//\n//  hook.h\n//  iSH\n//\n//  Created by Saagar Jha on 12/29/22.\n//\n\n#ifndef hook_h\n#define hook_h\n\n#include <stdbool.h>\n"
  },
  {
    "path": "app/iOS.xcconfig",
    "chars": 212,
    "preview": "SDKROOT = iphoneos\nTARGETED_DEVICE_FAMILY = 1,2 // iPhone, iPad\nSUPPORTED_PLATFORMS = iphonesimulator iphoneos\n\nLD_RUNPA"
  },
  {
    "path": "app/iOSFS.h",
    "chars": 224,
    "preview": "//\n//  iOSFS.h\n//  iSH\n//\n//  Created by Noah Peeters on 26.10.19.\n//\n\nextern const struct fs_ops iosfs;\nextern const st"
  },
  {
    "path": "app/iOSFS.m",
    "chars": 18122,
    "preview": "//\n//  iOSFS.m\n//  iSH\n//\n//  Created by Noah Peeters on 26.10.19.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/"
  },
  {
    "path": "app/iSH.entitlements",
    "chars": 399,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "app/iSH.xcconfig",
    "chars": 607,
    "preview": "// Change this to change all the bundle IDs and app groups\nROOT_BUNDLE_IDENTIFIER = app.ish.iSH\n// It's easiest to speci"
  },
  {
    "path": "app/main.m",
    "chars": 369,
    "preview": "//\n//  main.m\n//  iSH\n//\n//  Created by Theodore Dubois on 10/17/17.\n//\n\n#import <UIKit/UIKit.h>\n#import \"AppDelegate.h\""
  },
  {
    "path": "app/terminal/term.css",
    "chars": 160,
    "preview": "body {\n    margin: 0;\n    background: transparent;\n    overflow: hidden;\n}\n\n#terminal {\n    position: absolute;\n    top:"
  },
  {
    "path": "app/terminal/term.html",
    "chars": 303,
    "preview": "<!doctype html>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"height=device-height, initial-scale=1.0, user-scal"
  },
  {
    "path": "app/terminal/term.js",
    "chars": 5686,
    "preview": "hterm.defaultStorage = new lib.Storage.Memory();\nwindow.onload = async function() {\n    await lib.init();\n    window.ter"
  },
  {
    "path": "app/xcode-meson.sh",
    "chars": 1809,
    "preview": "#!/bin/bash\n\n# Try to figure out the user's PATH to pick up their installed utilities.\nexport PATH=\"$PATH:$(sudo -u \"$US"
  },
  {
    "path": "app/xcode-ninja.sh",
    "chars": 153,
    "preview": "#!/bin/sh\n\n# Try to figure out the user's PATH to pick up their installed utilities.\nexport PATH=\"$PATH:$(sudo -u \"$USER"
  },
  {
    "path": "asbestos/asbestos.c",
    "chars": 10576,
    "preview": "#define DEFAULT_CHANNEL instr\n#include \"debug.h\"\n#include \"asbestos/asbestos.h\"\n#include \"asbestos/gen.h\"\n#include \"asbe"
  },
  {
    "path": "asbestos/asbestos.h",
    "chars": 2055,
    "preview": "#ifndef ASBESTOS_H\n#define ASBESTOS_H\n#include \"misc.h\"\n#include \"emu/mmu.h\"\n#include \"util/list.h\"\n#include \"util/sync."
  },
  {
    "path": "asbestos/frame.h",
    "chars": 435,
    "preview": "#include <stdatomic.h>\n#include \"emu/cpu.h\"\n\n// keep in sync with asm\n#define FIBER_RETURN_CACHE_SIZE 4096\n#define FIBER"
  },
  {
    "path": "asbestos/gadgets-aarch64/bits.S",
    "chars": 8280,
    "preview": "#include \"gadgets.h\"\n\n.macro do_shift type, size, s\n    .irp arg, reg_c,imm\n        .gadget \\type\\size\\()_\\arg\n         "
  },
  {
    "path": "asbestos/gadgets-aarch64/control.S",
    "chars": 5253,
    "preview": "#include \"gadgets.h\"\n\n.gadget call\n    // save return address\n    sub _addr, esp, 4\n    write_prep 32, call\n    ldr w8, "
  },
  {
    "path": "asbestos/gadgets-aarch64/entry.S",
    "chars": 1342,
    "preview": "#include \"emu/interrupt.h\"\n#include \"gadgets.h\"\n\n.global NAME(fiber_enter)\n.type_compat fiber_enter,function\nNAME(fiber_"
  },
  {
    "path": "asbestos/gadgets-aarch64/gadgets.h",
    "chars": 4732,
    "preview": "#include \"../gadgets-generic.h\"\n#include \"cpu-offsets.h\"\n\n# register assignments\neax .req w20\nxax .req x20\nebx .req w21\n"
  },
  {
    "path": "asbestos/gadgets-aarch64/math.S",
    "chars": 11740,
    "preview": "#include \"gadgets.h\"\n#include \"math.h\"\n\n.gadget load32_addr\n    mov _tmp, _addr\n    gret\n\n.gadget load16_gs\n    ldrh _tm"
  },
  {
    "path": "asbestos/gadgets-aarch64/math.h",
    "chars": 1275,
    "preview": ".macro do_add op, dst, src, s\n    # setting flags: a horror story\n    .ifb \\s\n        # for 32-bit operands, we can just"
  },
  {
    "path": "asbestos/gadgets-aarch64/memory.S",
    "chars": 2671,
    "preview": "#include \"gadgets.h\"\n#include \"emu/interrupt.h\"\n\n.gadget push\n    sub _addr, esp, 4\n    write_prep 32, push\n    str _tmp"
  },
  {
    "path": "asbestos/gadgets-aarch64/misc.S",
    "chars": 6950,
    "preview": "#include \"gadgets.h\"\n#include \"math.h\"\n\n.gadget cpuid\n    # regrettable\n    save_c\n    sub sp, sp, 0x10\n    str eax, [sp"
  },
  {
    "path": "asbestos/gadgets-aarch64/string.S",
    "chars": 3306,
    "preview": "#include \"gadgets.h\"\n#include \"math.h\"\n\n#define REP_LIST once,rep,repnz\n\n.gadget cld\n    ldr w8, [_cpu, CPU_eflags]\n    "
  },
  {
    "path": "asbestos/gadgets-generic.h",
    "chars": 2140,
    "preview": "#include \"cpu-offsets.h\"\n\n#define ifin(thing, ...) _ifin(thing, __COUNTER__, __VA_ARGS__)\n#define _ifin(thing, line, ..."
  },
  {
    "path": "asbestos/gadgets-x86_64/bits.S",
    "chars": 3233,
    "preview": "#include \"gadgets.h\"\n\n.macro do_shift type, size, s, ss\n    .irp arg, reg_c,imm\n        .gadget \\type\\size\\()_\\arg\n     "
  },
  {
    "path": "asbestos/gadgets-x86_64/control.S",
    "chars": 4672,
    "preview": "#include \"gadgets.h\"\n\n.gadget call\n    // save return address\n    leal -4(%_esp), %_addr\n    write_prep 32, call\n    mov"
  },
  {
    "path": "asbestos/gadgets-x86_64/entry.S",
    "chars": 1379,
    "preview": "#include \"emu/interrupt.h\"\n#include \"gadgets.h\"\n\n.global NAME(fiber_enter)\n.type_compat NAME(fiber_enter),function\nNAME("
  },
  {
    "path": "asbestos/gadgets-x86_64/gadgets.h",
    "chars": 4306,
    "preview": "#include \"../gadgets-generic.h\"\n\n# register assignments\n#define _esp r8d\n#define _sp r8w\n#define _ip r9\n#define _eip r9d"
  },
  {
    "path": "asbestos/gadgets-x86_64/math.S",
    "chars": 6221,
    "preview": "#include \"gadgets.h\"\n\n.gadget load32_addr\n    movl %_addr, %_tmp\n    gret\n\n.gadget load16_gs\n    movw CPU_gs(%_cpu), %r1"
  },
  {
    "path": "asbestos/gadgets-x86_64/memory.S",
    "chars": 2587,
    "preview": "#include \"gadgets.h\"\n#include \"emu/interrupt.h\"\n\n.gadget push\n    leal -4(%_esp), %_addr\n    write_prep 32, push\n    mov"
  },
  {
    "path": "asbestos/gadgets-x86_64/misc.S",
    "chars": 5096,
    "preview": "#include \"gadgets.h\"\n\n.gadget cpuid\n    # regrettable\n    push %rsi\n    push %rdi\n    push %r8\n    push %r9\n    push %r1"
  },
  {
    "path": "asbestos/gadgets-x86_64/string.S",
    "chars": 3080,
    "preview": "#include \"gadgets.h\"\n\n#define REP_LIST once,rep,repnz\n\n.gadget cld\n    andl $~DF_FLAG, CPU_eflags(%_cpu)\n    gret\n\n.gadg"
  },
  {
    "path": "asbestos/gen.c",
    "chars": 20945,
    "preview": "#include <assert.h>\n#include <stdint.h>\n#include \"asbestos/gen.h\"\n#include \"emu/modrm.h\"\n#include \"emu/cpuid.h\"\n#include"
  },
  {
    "path": "asbestos/gen.h",
    "chars": 537,
    "preview": "#ifndef EMU_GEN_H\n#define EMU_GEN_H\n\n#include \"asbestos/asbestos.h\"\n#include \"emu/tlb.h\"\n\nstruct gen_state {\n    addr_t "
  },
  {
    "path": "asbestos/helpers.c",
    "chars": 546,
    "preview": "#include <time.h>\n#include \"emu/cpu.h\"\n#include \"emu/cpuid.h\"\n\nvoid helper_cpuid(dword_t *a, dword_t *b, dword_t *c, dwo"
  },
  {
    "path": "asbestos/offsets.c",
    "chars": 1974,
    "preview": "#include \"asbestos/asbestos.h\"\n#include \"asbestos/frame.h\"\n#include \"emu/cpu.h\"\n#include \"emu/tlb.h\"\n\nvoid cpu() {\n    O"
  },
  {
    "path": "debug.h",
    "chars": 1950,
    "preview": "#ifndef UTIL_DEBUG_H\n#define UTIL_DEBUG_H\n#include <stdio.h>\n#include <stdlib.h>\n\nvoid ish_printk(const char *msg, ...);"
  },
  {
    "path": "deps/aports/sync-archive.sh",
    "chars": 1567,
    "preview": "#!/bin/bash -ex\n# This script only works on my machine\narchive_remote=\"wasabici:alpine-archive\"\n\nfunction sync_repo() {\n"
  },
  {
    "path": "deps/aports/v3.14/community/x86/index.txt",
    "chars": 33,
    "preview": "APKINDEX-v3.14-2023-05-19.tar.gz\n"
  },
  {
    "path": "deps/aports/v3.14/main/x86/index.txt",
    "chars": 33,
    "preview": "APKINDEX-v3.14-2023-11-25.tar.gz\n"
  },
  {
    "path": "deps/aports/v3.17/community/x86/index.txt",
    "chars": 33,
    "preview": "APKINDEX-v3.17-2024-11-30.tar.gz\n"
  },
  {
    "path": "deps/aports/v3.17/main/x86/index.txt",
    "chars": 33,
    "preview": "APKINDEX-v3.17-2026-02-14.tar.gz\n"
  },
  {
    "path": "deps/aports/v3.18/community/x86/index.txt",
    "chars": 33,
    "preview": "APKINDEX-v3.18-2025-05-24.tar.gz\n"
  },
  {
    "path": "deps/aports/v3.18/main/x86/index.txt",
    "chars": 33,
    "preview": "APKINDEX-v3.18-2026-02-07.tar.gz\n"
  },
  {
    "path": "deps/aports/v3.19/community/x86/index.txt",
    "chars": 33,
    "preview": "APKINDEX-v3.19-2026-02-07.tar.gz\n"
  },
  {
    "path": "deps/aports/v3.19/main/x86/index.txt",
    "chars": 33,
    "preview": "APKINDEX-v3.19-2026-02-07.tar.gz\n"
  },
  {
    "path": "deps/clone-linux.sh",
    "chars": 399,
    "preview": "#!/bin/sh -e\nrepo_root=\"$(dirname $0)/..\"\nsub_path=deps/linux\nsub_repo=\"$repo_root/$sub_path\"\ngit submodule init \"$sub_p"
  },
  {
    "path": "deps/config.h",
    "chars": 42510,
    "preview": "/* config.h.  Generated from config.h.in by configure.  */\n/* config.h.in.  Generated from configure.ac by autoheader.  "
  },
  {
    "path": "deps/kconfig-fragment.sh",
    "chars": 94,
    "preview": "#!/bin/sh\noutput=\"$1\"\nshift\n: > \"$output\"\nfor cfg in $@; do\n    echo \"$cfg\" >> \"$output\"\ndone\n"
  },
  {
    "path": "deps/libarchive.xcodeproj/project.pbxproj",
    "chars": 86189,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "deps/libarchive.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 220,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/tbodt/De"
  },
  {
    "path": "deps/libarchive.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "deps/linux-build.sh",
    "chars": 1183,
    "preview": "#!/bin/bash -e\nset -o pipefail\noutput=\"$1\"\nsrctree=\"$2\"\nobjtree=\"$3\"\ndepfile=\"$4\"\n\n# https://stackoverflow.com/a/3572105"
  },
  {
    "path": "deps/linux-sparse.txt",
    "chars": 1683,
    "preview": "/*\nMakefile\nKbuild\nKconfig*\n\n!/arch/\n/arch/ish/\n/arch/x86/include/asm/\n/arch/x86/include/uapi/\n/arch/x86/entry/syscalls/"
  },
  {
    "path": "deps/linux.config",
    "chars": 126,
    "preview": "CONFIG_BLK_DEV_INITRD=n\nCONFIG_ISH_LINK_OBJECT=y\nCONFIG_KALLSYMS=y\nCONFIG_DEBUG_INFO=y\nCONFIG_IP_PNP=n\nCONFIG_STDIO_CONS"
  },
  {
    "path": "deps/makefilter.py",
    "chars": 792,
    "preview": "#!/usr/bin/env -S python3 -u\nimport sys\nimport re\nimport os\nline_re = re.compile(r'^  [A-Z]+\\s+')\ndep_re = [\n\tre.compile"
  },
  {
    "path": "deps/meson.build",
    "chars": 3858,
    "preview": "if get_option('kernel') == 'linux'\n    kconfig = []\n\n    if get_option('engine') in ['asbestos', 'unicorn']\n        kcon"
  },
  {
    "path": "emu/cpu.h",
    "chars": 5899,
    "preview": "#ifndef EMU_H\n#define EMU_H\n\n#include \"misc.h\"\n#include \"emu/mmu.h\"\n#include \"emu/float80.h\"\n\n#ifdef __KERNEL__\n#include"
  },
  {
    "path": "emu/cpuid.h",
    "chars": 869,
    "preview": "#ifndef CPUID_H\n#define CPUID_H\n\n#include \"misc.h\"\n\nstatic inline void do_cpuid(dword_t *eax, dword_t *ebx, dword_t *ecx"
  },
  {
    "path": "emu/decode.h",
    "chars": 78236,
    "preview": "#include \"misc.h\"\n#include \"emu/cpu.h\"\n#include \"emu/modrm.h\"\n#include \"emu/interrupt.h\"\n\n#undef oz\n#define oz OP_SIZE\n#"
  },
  {
    "path": "emu/float80-test.c",
    "chars": 7457,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <math.h>\n#include <fenv.h>\n#include \"float80.h\"\n\n#pr"
  },
  {
    "path": "emu/float80.c",
    "chars": 18562,
    "preview": "#include <assert.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdint.h>\n#include <math.h>\n#include \"float80.h\"\n#i"
  }
]

// ... and 213 more files (download for full content)

About this extraction

This page contains the full source code of the ish-app/ish GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 413 files (2.2 MB), approximately 598.3k tokens, and a symbol index with 2332 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!