[
  {
    "path": ".bundle/config",
    "content": "---\nBUNDLE_PATH: \".deps/bundler-path\"\nBUNDLE_DISABLE_SHARED_GEMS: \"1\"\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n# It's better to use \"wrap line\" in plain text documents\n[*.{adoc,md}]\nrulers = 1000\nmax_line_length = 1000\n\n[*.toml]\nrulers = 96\nmax_line_length = 96\n\n[*.{swift,sh}]\nrulers = 120\nmax_line_length = 120\nindent_style = space\nindent_size = 4\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[COMMIT_EDITMSG]\nmax_line_length = 120\n"
  },
  {
    "path": ".gitattributes",
    "content": "# GitHub: linguist-generated marks paths that you would like to be ignored for the repository's language statistics and hidden by default in diffs\nAeroSpace.xcodeproj/project.pbxproj linguist-generated=true\n"
  },
  {
    "path": ".github/DISCUSSION_TEMPLATE/potential-bugs.yml",
    "content": "body:\n  - type: textarea\n    id: body\n    attributes:\n      label: Body\n      value: |\n        Steps to reproduce:\n        1.\n        2.\n        3.\n\n        Expected result:\n        Actual result:\n\n        ### Additional info\n\n        ```shell\n        $ aerospace -v\n        ```\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [nikitabobko]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/new-issue.yml",
    "content": "name: New Issue\ndescription: New Issue\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        AeroSpace project doesn't accept Issues directly. Please prefer GitHub Discussions. See: https://github.com/nikitabobko/AeroSpace/issues/947\n  - type: checkboxes\n    id: checkbox\n    attributes:\n      label: 'Sanity check'\n      options:\n        - label: |\n            I read https://github.com/nikitabobko/AeroSpace/issues/947\n          required: true\n  - type: textarea\n    id: body\n    attributes:\n      label: Body\n      value: |\n        YOUR ISSUE WILL BE IMMEDIATELY CLOSED BY BOT, DON'T OPEN NEW ISSUES DIRECTLY, USE DISCUSSIONS INSTEAD\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/gh-actions-runner-xcode-select.sh",
    "content": "#!/bin/bash\nset -e # Exit if one of commands exit with non-zero exit code\nset -u # Treat unset variables and parameters other than the special parameters ‘@’ or ‘*’ as an error\nset -o pipefail # Any command failed in the pipe fails the whole pipe\n# set -x # Print shell commands as they are executed (or you can try -v which is less verbose)\n\nsw_vers -productVersion\n# Xcode version affects the target macOS SDK that we compile against + different Xcodes bundle different Swift verions\nif sw_vers -productVersion | grep -q \"^14\"; then # macOS 14\n  sudo xcode-select -s \"$XCODE_16_DEVELOPER_DIR\"\nelse\n  sudo xcode-select -s \"$XCODE_26_DEVELOPER_DIR\"\nfi\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## PR checklist\n\n- [ ] Explain your changes in the relevant commit messages rather than in the PR description. The PR description must not contain more information than the commit messages (except for images and other media).\n- [ ] Each commit must explain what/why/how and motivation in its description. https://cbea.ms/git-commit/\n- [ ] Don't forget to link the appropriate issues/discussions in commit messages (if applicable).\n- [ ] Each commit must be an atomic change (a PR may contain several commits). Don't introduce new functional changes together with refactorings in the same commit.\n- [ ] `./run-tests.sh` exits with non-zero exit code.\n- [ ] Avoid merge commits, always rebase and force push.\n\nFailure to follow the checklist with no apparent reasons will result in silent PR rejection.\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: build\n\non:\n  push:\n    branches:\n      - 'main'\n      - 'rr/**' # \"rr\" stands for \"remote run\"\n  pull_request:\n    branches: [ \"main\" ]\n  schedule:\n    - cron: '0 0 * * *' # every day at 00:00\n\njobs:\n\n  build-debug:\n    strategy:\n      # fail-fast: false # Disable fail-fast in matrix\n      matrix:\n        # https://docs.github.com/en/actions/reference/runners/github-hosted-runners#standard-github-hosted-runners-for-public-repositories\n        # https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md\n        # https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md\n        # https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md\n        #\n        # Xcode versions:\n        # - https://en.wikipedia.org/wiki/Xcode\n        # - https://xcodereleases.com/?scope=release\n        os: [macos-14, macos-15, macos-26]\n    name: build-debug\n    runs-on: ${{ matrix.os }}\n    steps:\n      - run: env # Debug\n      - uses: actions/checkout@v6\n      - run: ./.github/gh-actions-runner-xcode-select.sh\n      - run: brew install swiftly\n      - run: swiftly init --skip-install --assume-yes --verbose && swiftly install\n      - run: ./build-debug.sh\n      - run: ./run-tests.sh\n\n  # We build release artifacts only on the latest macOS versions because:\n  # 1. It cuts the build time twice on GH Actions\n  # 2. The latest Xcode version is not available on old macOS, and old Xcode versions bundle too old Swift version\n  build-release:\n    strategy:\n      # fail-fast: false # Disable fail-fast in matrix\n      matrix:\n        os: [macos-15, macos-26]\n    name: build-release\n    runs-on: ${{ matrix.os }}\n    steps:\n      - run: env # Debug\n      - uses: actions/checkout@v6\n      - run: ./.github/gh-actions-runner-xcode-select.sh\n      - run: brew install bash fish xcbeautify swiftly\n      - run: swiftly init --skip-install --assume-yes --verbose && swiftly install\n      - name: './build-release.sh'\n        run: |\n          # \"-\" means \"Sign to run locally\". There is no aerospace-codesign-certificate on GH Actions\n          ./build-release.sh --codesign-identity -\n          ./install-from-sources.sh --dont-rebuild\n      - name: cat ./.release/xcodebuild.log\n        if: ${{ always() }}\n        run: 'if test -f ./.release/xcodebuild.log; then cat ./.release/xcodebuild.log; fi'\n"
  },
  {
    "path": ".github/workflows/close-third-party-issues.yml",
    "content": "name: close-third-party-issues\n\non:\n  issues:\n    types: [opened]\n\njobs:\n  close-third-party-issues:\n    name: Close third party issues\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n    steps:\n    - name: Close third party issues\n      run: |\n        set -e # Exit if one of commands exit with non-zero exit code\n        set -u # Treat unset variables and parameters other than the special parameters ‘@’ or ‘*’ as an error\n        set -o pipefail # Any command failed in the pipe fails the whole pipe\n\n        author=\"$(gh issue view \"$ISSUE\" --json author --jq '.author.login')\"\n\n        close() {\n          gh issue edit \"$ISSUE\" --add-label bin\n          gh issue close \"$ISSUE\" --comment \"Please don't open issues directly, use GitHub Discussions instead. See: https://github.com/nikitabobko/AeroSpace/issues/947\"\n          gh issue lock \"$ISSUE\"\n        }\n\n        test \"$author\" = nikitabobko || test \"$author\" = mobile-ar || close\n      env:\n        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        GH_REPO: ${{ github.repository }}\n        ISSUE: ${{ github.event.issue.number }}\n"
  },
  {
    "path": ".gitignore",
    "content": "/.idea\n/.debug\n/.release\n/.shell-completion\n/.site\n/.man\n/Gemfile.lock\n# IDK, AppCode randomly creates this EMPTY file. I have no idea what this is\n/default.profraw\n.DS_Store\n/.xcode-build\n# Swift package manager\n/.build\n/.swiftpm\n/.vscode\n# External dependencies\n/.deps\n\n# For whatever local files that developers might want to keep there (I personally keep a separate `generated-html` git worktree here)\n/.local\n\n# XCode User settings\nxcuserdata/\nxcshareddata/\n"
  },
  {
    "path": ".swift-version",
    "content": "6.2.4\n"
  },
  {
    "path": ".swiftformat",
    "content": "# https://github.com/nicklockwood/SwiftFormat/blob/main/Rules.md\n--exclude ./ShellParserGenerated\n--indentcase true\n--patternlet inline\n--indentstrings true\n\n# https://github.com/nicklockwood/SwiftFormat/issues/483 fix indentation for expressions nested in ternary\n--wrapternary before-operators\n\n--disable all\n\n# --enable docComments\n\n--enable anyObjectProtocol\n--enable blankLineAfterImports\n--enable blankLinesAtEndOfScope\n--enable blankLinesBetweenImports\n--enable conditionalAssignment\n--enable docCommentsBeforeModifiers\n--enable duplicateImports\n--enable elseOnSameLine\n--enable emptyBraces\n--enable emptyExtensions\n--enable enumNamespaces\n--enable fileMacro\n--enable genericExtensions\n--enable indent\n--enable leadingDelimiters\n--enable linebreakAtEndOfFile\n--enable linebreaks\n--enable numberFormatting\n--enable preferCountWhere\n--enable preferFinalClasses\n--enable redundantAsync\n--enable redundantBackticks\n--enable redundantBreak\n--enable redundantClosure\n--enable redundantEquatable\n--enable redundantFileprivate\n--enable redundantGet\n--enable redundantLet\n--enable redundantLetError\n--enable redundantMemberwiseInit\n--enable redundantObjc\n--enable redundantOptionalBinding\n--enable redundantThrows\n--enable redundantTypedThrows\n--enable redundantVoidReturnType\n--enable semicolons\n--enable spaceAroundBraces\n--enable spaceAroundBrackets\n--enable spaceAroundGenerics\n--enable spaceAroundOperators\n--enable spaceAroundParens\n--enable spaceInsideBraces\n--enable spaceInsideBrackets\n--enable spaceInsideGenerics\n--enable spaceInsideParens\n--enable strongOutlets\n--enable trailingClosures\n--enable trailingCommas\n--enable trailingSpace\n--enable urlMacro\n--enable wrapMultilineStatementBraces\n\n--enable extensionAccessControl\n--extensionacl on-declarations\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "excluded:\n  - .build\n  - .xcode-build\n  - ./ShellParserGenerated\n\n# https://realm.github.io/SwiftLint/rule-directory.html\nonly_rules:\n  # - line_length # todo fix it\n  - colon\n  - computed_accessors_order\n  - dynamic_inline # Avoid using ‘dynamic’ and ‘@inline(__always)’ together\n  - empty_enum_arguments\n  - empty_parameters # Prefer () -> over Void ->\n  - empty_string # Prefer checking isEmpty over comparing string to an empty string literal\n  - file_name_no_space\n  - first_where\n  - implicit_getter\n  - is_disjoint\n  - last_where # Prefer using .last(where:) over .filter { }.last in collections\n  - legacy_constant\n  - legacy_constructor # Swift constructors are preferred over legacy convenience functions\n  - legacy_hashing # Prefer using the hash(into:) function instead of overriding hashValue\n  - legacy_nsgeometry_functions # Struct extension properties and methods are preferred over legacy functions\n  - legacy_random # Prefer using type.random(in:) over legacy functions\n  - local_doc_comment # Prefer regular comments over doc comments in local scopes\n  - no_fallthrough_only\n  - no_space_in_method_call\n  - nsobject_prefer_isequal # NSObject subclasses should implement isEqual instead of ==\n  - function_name_whitespace\n  - optional_enum_case_matching\n  - redundant_discardable_let\n  - redundant_nil_coalescing # nil coalescing operator is only evaluated if the lhs is nil, coalescing operator with nil as rhs is redundant\n  - switch_case_alignment\n  - toggle_bool\n  - trailing_newline\n  - trailing_semicolon # Lines should not have trailing semicolons\n  - trailing_whitespace # Lines should not have trailing whitespace\n  - unavailable_condition # Use #unavailable/#available instead of #available/#unavailable with an empty body.\n  - unneeded_break_in_switch # Avoid using unneeded break statements\n  - unneeded_override # Remove overridden functions that don’t do anything except call their super\n  # - unused_closure_parameter\n  - unused_control_flow_label\n  - unused_enumerated # When the index or the item is not used, .enumerated() can be removed.\n  - unused_optional_binding # Prefer != nil over let _ =\n  - unused_setter_value\n  - weak_delegate # Delegates should be weak to avoid reference cycles\n\nswitch_case_alignment:\n  indented_cases: true\n\nstrict: true\n# quiet: true\n"
  },
  {
    "path": "AeroSpace.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 77;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t238EF26CAAADD1FE11312D7C /* default-config.toml in Resources */ = {isa = PBXBuildFile; fileRef = 8FE45A887100EB70912B07F0 /* default-config.toml */; };\n\t\t852F88894A3B9FC385563665 /* AppBundle in Frameworks */ = {isa = PBXBuildFile; productRef = 018E55979F61DA6DA6DCB442 /* AppBundle */; };\n\t\t883A44C8295FECF49F94269D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84C35D8E25B61D4D1ADB1851 /* Assets.xcassets */; };\n\t\tC40E0D9C06086C58955237D9 /* AeroSpaceApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C104E927E079E60C91AE3E /* AeroSpaceApp.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t09685297933511208058F7CF /* AeroSpace.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AeroSpace.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t18C104E927E079E60C91AE3E /* AeroSpaceApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AeroSpaceApp.swift; sourceTree = \"<group>\"; };\n\t\t6606D24B4B23E9582CFA3B86 /* AeroSpace */ = {isa = PBXFileReference; lastKnownFileType = folder; name = AeroSpace; path = .; sourceTree = SOURCE_ROOT; };\n\t\t84C35D8E25B61D4D1ADB1851 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t8FE45A887100EB70912B07F0 /* default-config.toml */ = {isa = PBXFileReference; path = \"default-config.toml\"; sourceTree = \"<group>\"; };\n\t\tCF85755BFF66B59A84F98262 /* AeroSpace.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AeroSpace.entitlements; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t2AFAB0BC1A2742132D7CB950 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t852F88894A3B9FC385563665 /* AppBundle in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0E0109AE5F7881520B0D2384 /* config-examples */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8FE45A887100EB70912B07F0 /* default-config.toml */,\n\t\t\t);\n\t\t\tname = \"config-examples\";\n\t\t\tpath = \"docs/config-examples\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t21E15F84087042E63C0150AB /* resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCF85755BFF66B59A84F98262 /* AeroSpace.entitlements */,\n\t\t\t\t84C35D8E25B61D4D1ADB1851 /* Assets.xcassets */,\n\t\t\t);\n\t\t\tpath = resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t393942C56466FDBBE35F9EC0 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6F6BCFA26BF3E35072EF2C77 /* AeroSpaceApp */,\n\t\t\t\t0E0109AE5F7881520B0D2384 /* config-examples */,\n\t\t\t\t3A1FF786C84025133F96138D /* Packages */,\n\t\t\t\t21E15F84087042E63C0150AB /* resources */,\n\t\t\t\t62BEA6F49E6648E2EE3C208F /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3A1FF786C84025133F96138D /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6606D24B4B23E9582CFA3B86 /* AeroSpace */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t62BEA6F49E6648E2EE3C208F /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t09685297933511208058F7CF /* AeroSpace.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6F6BCFA26BF3E35072EF2C77 /* AeroSpaceApp */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t18C104E927E079E60C91AE3E /* AeroSpaceApp.swift */,\n\t\t\t);\n\t\t\tname = AeroSpaceApp;\n\t\t\tpath = Sources/AeroSpaceApp;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tB00BE37A79171B0EE995EB83 /* AeroSpace */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1C34EA41A1F045E016D1944D /* Build configuration list for PBXNativeTarget \"AeroSpace\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD7A18303C03F2CB26F7BB54B /* Sources */,\n\t\t\t\tBA5F2F9022B8385637D263E4 /* Resources */,\n\t\t\t\t2AFAB0BC1A2742132D7CB950 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = AeroSpace;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t018E55979F61DA6DA6DCB442 /* AppBundle */,\n\t\t\t);\n\t\t\tproductName = AeroSpace;\n\t\t\tproductReference = 09685297933511208058F7CF /* AeroSpace.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0B585B3093DA0FC12E7983E2 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastUpgradeCheck = 1430;\n\t\t\t};\n\t\t\tbuildConfigurationList = D6982B0C3E92C5AF28BCD315 /* Build configuration list for PBXProject \"AeroSpace\" */;\n\t\t\tcompatibilityVersion = \"Xcode 14.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tBase,\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 393942C56466FDBBE35F9EC0;\n\t\t\tminimizedProjectReferenceProxies = 1;\n\t\t\tpackageReferences = (\n\t\t\t\t9A00429279948F2879C9FE30 /* XCLocalSwiftPackageReference \".\" */,\n\t\t\t);\n\t\t\tpreferredProjectObjectVersion = 77;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tB00BE37A79171B0EE995EB83 /* AeroSpace */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tBA5F2F9022B8385637D263E4 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t883A44C8295FECF49F94269D /* Assets.xcassets in Resources */,\n\t\t\t\t238EF26CAAADD1FE11312D7C /* default-config.toml in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD7A18303C03F2CB26F7BB54B /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC40E0D9C06086C58955237D9 /* AeroSpaceApp.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t175127AAF914899705FABF12 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t31B702864571F51814E4F12C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = resources/AeroSpace.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"aerospace-codesign-certificate\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_LSUIElement = YES;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = \"0.0.0-SNAPSHOT\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = bobko.aerospace.debug;\n\t\t\t\tPRODUCT_NAME = \"AeroSpace-Debug\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 6.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA991F90908318BCD1655E904 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD1D1A9E07F0AB40E14CAC0F6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = resources/AeroSpace.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"aerospace-codesign-certificate\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_LSUIElement = YES;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = \"0.0.0-SNAPSHOT\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = bobko.aerospace;\n\t\t\t\tPRODUCT_NAME = AeroSpace;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 6.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1C34EA41A1F045E016D1944D /* Build configuration list for PBXNativeTarget \"AeroSpace\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t31B702864571F51814E4F12C /* Debug */,\n\t\t\t\tD1D1A9E07F0AB40E14CAC0F6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n\t\tD6982B0C3E92C5AF28BCD315 /* Build configuration list for PBXProject \"AeroSpace\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t175127AAF914899705FABF12 /* Debug */,\n\t\t\t\tA991F90908318BCD1655E904 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCLocalSwiftPackageReference section */\n\t\t9A00429279948F2879C9FE30 /* XCLocalSwiftPackageReference \".\" */ = {\n\t\t\tisa = XCLocalSwiftPackageReference;\n\t\t\trelativePath = .;\n\t\t};\n/* End XCLocalSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t018E55979F61DA6DA6DCB442 /* AppBundle */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = AppBundle;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 0B585B3093DA0FC12E7983E2 /* Project object */;\n}\n"
  },
  {
    "path": "AeroSpace.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## Users cannot create GitHub Issues directly\n\nAeroSpace project doesn't accept Issues directly - we ask you to create a [Discussion](https://github.com/nikitabobko/AeroSpace/discussions) first.\n\nThe submitted Issues are often either obvious duplicates, environmental problems, or configuration errors by the users themselves.\nFor a hobby project, I don't have enough time and energy to process every such submitted Issue.\n\nAs an alternative, you can start a Discussion on [GitHub discussions](https://github.com/nikitabobko/AeroSpace/discussions) forum.\nAny Discussion which clearly identifies a problem and can be confirmed or reproduced will be converted to an Issue by maintainers.\n\nIt's users' responsibility to minimize their bugs as much as possible.\nAll users play a part in bugs reproduction.\n\nIn general the flow is the following:\n- Discussions are here to kick-off the discussion and identify what the actionable item exactly is\n- Issues are created later. Issues are well-formed, clear and actionable tasks\n\nThis pattern makes it easier for maintainers or contributors to find issues to work on since _almost every_ Issue is ready to be worked on.\n\n## Submit bugs and feature ideas\n\nSubmit bugs to https://github.com/nikitabobko/AeroSpace/discussions/categories/potential-bugs\nSubmit feature ideas to https://github.com/nikitabobko/AeroSpace/discussions/categories/feature-ideas\n\nRules:\n* Search for duplicates (in GitHub Issues and Discussions) before creating a new discussion\n* Upvote for issues/discussions that you find useful\n\n**Consider including in bug reports**\n\n* `aerospace debug-windows` output, if the problem is about handling some windows\n* Screenshots of problematic windows\n* Videos of problematic windows\n* What did you try to resolve the issue?\n* Your config\n* AeroSpace version\n* macOS version\n\n**Consider including in feature request**\n\n* Use cases!\n* Did I mention use cases?\n* Alternative approaches\n* Links to docs of similar features in other window managers that you know\n* Synopsis, if you suggest a new command\n* Mental model description\n\n## Discuss issues/discussions\n\nOne of the most useful thing you can do is to discuss issues/discussions.\n\nImagine that you were assigned to fix the issue.\nTry to suggest the best approach and design on how to fix the issue.\nSuggest the synopsis/config format, reason in written form what is good about it, what is bad about it, what are the alternatives, etc.\nBasically, see the \"Prior discussion\" section in [Submit Pull Requests](#submit-pull-requests).\n\nIf you have something to contribute to the conversation. Do it!\n\nPlease keep the conversation to the point. Discuss one issue at a time, crossreference other issues\n\nYou can take a look at the following issues:\n\n* Most voted issues: https://github.com/nikitabobko/AeroSpace/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc\n* Sometimes conversations happen on old issues that aren’t yet closed. See https://github.com/nikitabobko/AeroSpace/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc\n* Issues that are unclear on how to fix, or issues that require design of the interface (CLI or config interface) are tagged with `design-needed` tag https://github.com/nikitabobko/AeroSpace/issues?q=is%3Aissue+is%3Aopen+label%3Adesign-needed\n\n## Submit Pull Requests\n\nSmall and trivial improvements can be submitted without any discussion.\n\n**Prior discussion**. For non-trivial changes (such as user visible changes), it's always better to ask for prior approval and discuss what you want to do before doing it.\n\nPlease create a new discussion and describe you want to do.\n\nConsider including\n\n* What users will observe after your change?\n* Feature interaction with existing features or potential future features\n* What use cases does it cover\n* What is the proposed syntax for the config\n* What is the proposed synopsis of CLI command\n* How you think it should be implemented (if you can describe it)\n* etc.\n\nDiscussing that you want to do something doesn't put any obligations on you. If you don't want to start the discussion just because you're afraid that you won't do it. Don't be afraid!\n\n**Commit hygiene**. Each submitted commit must be atomic change (a Pull Request may contain several commits). Don't introduce new functional changes together with refactorings in the same commit.\n\nSimilarly, when implementing features and bug fixes, please stick to the structure of the codebase as much as possible and do not take this as an opportunity to do some \"refactoring along the way\".\n\nA good commit message also mentions the motivation of the change (the commit describes what, why and how)\n\n**License Agreement**. By contributing changes to this repository, you agree to license your contributions under the MIT license.\n\nMaintainers can merge your pull request with arbitrary modifications.\n\n**Pull request merge**. It cannot be guaranteed that your pull request will be merged even after the discussion.\nBe ready that your pull request might be rejected because the implementation isn't good, or the approach is incorrect.\n\nThe prior discussion is here for you to minimize the risk of rejection.\n\n## Spread the word\n\nDo you like the project? Does AeroSpace finally fix your problems with windows management on macOS? Good to hear it!\n\n* Spread the word in social networks! (Don't forget to share the link :) )\n* Talk about AeroSpace to your colleagues and friends\n* Write a blogpost about your workflows\n* Record a YouTube video\n\n## Share your workflow and tips\n\nSubmit your tips to [the Goodies page](https://nikitabobko.github.io/AeroSpace/goodies). The source code of the page can be found in `./docs` directory\n\n## Support the project financially\n\nSupporting the project financially counts as a contribution (even if it's just a $1/month). https://github.com/sponsors/nikitabobko\n"
  },
  {
    "path": "Gemfile",
    "content": "# frozen_string_literal: true\nruby '~> 3.0' # >= 3.0 and < 4.0\n\nsource \"https://rubygems.org\"\ngem 'asciidoctor', '2.0.23'\ngem 'pygments.rb', '3.0'\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) 2023 Nikita Bobko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Package.resolved",
    "content": "{\n  \"originHash\" : \"120ba1d30192b339dc5c9d1461d2b3d1e329a17a4867b471290c07c6b3c0cb73\",\n  \"pins\" : [\n    {\n      \"identity\" : \"antlr4\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/antlr/antlr4\",\n      \"state\" : {\n        \"revision\" : \"7ed420ff2c78d62883875c442d75f32e73bc86c8\",\n        \"version\" : \"4.13.1\"\n      }\n    },\n    {\n      \"identity\" : \"hotkey\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/soffes/HotKey\",\n      \"state\" : {\n        \"revision\" : \"a3cf605d7a96f6ff50e04fcb6dea6e2613cfcbe4\",\n        \"version\" : \"0.2.1\"\n      }\n    },\n    {\n      \"identity\" : \"issoundadditions\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/InerziaSoft/ISSoundAdditions\",\n      \"state\" : {\n        \"revision\" : \"4b555f0354e6c280917bae8a598a258efe87ab98\",\n        \"version\" : \"2.0.1\"\n      }\n    },\n    {\n      \"identity\" : \"swift-collections\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/apple/swift-collections\",\n      \"state\" : {\n        \"revision\" : \"7b847a3b7008b2dc2f47ca3110d8c782fb2e5c7e\",\n        \"version\" : \"1.3.0\"\n      }\n    },\n    {\n      \"identity\" : \"tomlkit\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/LebJe/TOMLKit\",\n      \"state\" : {\n        \"revision\" : \"404c4dd011743461bff12d00a5118d0ed59d630c\",\n        \"version\" : \"0.5.5\"\n      }\n    }\n  ],\n  \"version\" : 3\n}\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version: 6.2\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"AeroSpacePackage\",\n    // Runtime support for parameterized protocol types is only available in macOS 13.0.0 or newer\n    // And it specifies deploymentTarget for CLI\n    platforms: [.macOS(.v13)],\n    // Products define the executables and libraries a package produces, making them visible to other packages.\n    products: [\n        .executable(name: \"aerospace\", targets: [\"Cli\"]),\n        // Don't use this build for release, use xcode instead\n        .executable(name: \"AeroSpaceApp\", targets: [\"AeroSpaceApp\"]),\n        // We only need to expose this as a product for xcode\n        .library(name: \"AppBundle\", targets: [\"AppBundle\"]),\n    ],\n    dependencies: [\n        .package(path: \"./ShellParserGenerated\"),\n        .package(url: \"https://github.com/InerziaSoft/ISSoundAdditions.git\", exact: \"2.0.1\"),\n        .package(url: \"https://github.com/LebJe/TOMLKit.git\", exact: \"0.5.5\"),\n        .package(url: \"https://github.com/apple/swift-collections.git\", exact: \"1.3.0\"),\n        .package(url: \"https://github.com/soffes/HotKey.git\", exact: \"0.2.1\"),\n    ],\n    // Targets are the basic building blocks of a package, defining a module or a test suite.\n    // Targets can depend on other targets in this package and products from dependencies.\n    targets: [\n        // Exposes the private _AXUIElementGetWindow function to swift\n        .target(\n            name: \"PrivateApi\",\n            path: \"Sources/PrivateApi\",\n            publicHeadersPath: \"include\",\n        ),\n        .target(\n            name: \"Common\",\n            dependencies: [\n                .product(name: \"Collections\", package: \"swift-collections\"),\n            ],\n        ),\n        .target(\n            name: \"AppBundle\",\n            dependencies: [\n                .product(name: \"Collections\", package: \"swift-collections\"),\n                .product(name: \"HotKey\", package: \"HotKey\"),\n                .product(name: \"ISSoundAdditions\", package: \"ISSoundAdditions\"),\n                .product(name: \"ShellParserGenerated\", package: \"ShellParserGenerated\"),\n                .product(name: \"TOMLKit\", package: \"TOMLKit\"),\n                .target(name: \"Common\"),\n                .target(name: \"PrivateApi\"),\n            ],\n            swiftSettings: [\n                .enableUpcomingFeature(\"NonisolatedNonsendingByDefault\"),\n            ],\n        ),\n        .executableTarget(\n            name: \"AeroSpaceApp\",\n            dependencies: [\n                .target(name: \"AppBundle\"),\n            ],\n        ),\n        .executableTarget(\n            name: \"Cli\",\n            dependencies: [\n                .target(name: \"Common\"),\n            ],\n        ),\n        .testTarget(\n            name: \"AppBundleTests\",\n            dependencies: [\n                .target(name: \"AppBundle\"),\n            ],\n        ),\n    ],\n)\n"
  },
  {
    "path": "README.md",
    "content": "# AeroSpace Beta [![Build](https://github.com/nikitabobko/AeroSpace/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/nikitabobko/AeroSpace/actions/workflows/build.yml)\n\n<img src=\"./resources/Assets.xcassets/AppIcon.appiconset/icon.png\" width=\"40%\" align=\"right\">\n\nAeroSpace is an i3-like tiling window manager for macOS\n\nVideos:\n- [YouTube 91 sec Demo](https://www.youtube.com/watch?v=UOl7ErqWbrk)\n- [YouTube Guide by Josean Martinez](https://www.youtube.com/watch?v=-FoWClVHG5g)\n\nDocs:\n- [AeroSpace Guide](https://nikitabobko.github.io/AeroSpace/guide)\n- [AeroSpace Commands](https://nikitabobko.github.io/AeroSpace/commands)\n- [AeroSpace Goodies](https://nikitabobko.github.io/AeroSpace/goodies)\n\n## Key features\n\n- Tiling window manager based on a [tree paradigm](https://nikitabobko.github.io/AeroSpace/guide#tree)\n- [i3](https://i3wm.org/) inspired\n- Fast workspaces switching without animations and without the necessity to disable SIP\n- AeroSpace employs its [own emulation of virtual workspaces](https://nikitabobko.github.io/AeroSpace/guide#emulation-of-virtual-workspaces) instead of relying on native macOS Spaces due to [their considerable limitations](https://nikitabobko.github.io/AeroSpace/guide#emulation-of-virtual-workspaces)\n- Plain text configuration (dotfiles friendly). See: [default-config.toml](https://nikitabobko.github.io/AeroSpace/guide#default-config)\n- CLI first (manpages and shell completion included)\n- Doesn't require disabling SIP (System Integrity Protection)\n- [Proper multi-monitor support](https://nikitabobko.github.io/AeroSpace/guide#multiple-monitors) (i3-like paradigm)\n\n## Installation\n\nInstall via [Homebrew](https://brew.sh/) to get autoupdates (Preferred)\n\n```\nbrew install --cask nikitabobko/tap/aerospace\n```\n\nIn multi-monitor setup please make sure that monitors [are properly arranged](https://nikitabobko.github.io/AeroSpace/guide#proper-monitor-arrangement).\n\nOther installation options: https://nikitabobko.github.io/AeroSpace/guide#installation\n\n> [!NOTE]\n> By using AeroSpace, you acknowledge that it's not [notarized](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution).\n>\n> Notarization is a \"security\" feature by Apple.\n> You send binaries to Apple, and they either approve them or not.\n> In reality, notarization is about building binaries the way Apple likes it.\n>\n> I don't have anything against notarization as a concept.\n> I specifically don't like the way Apple does notarization.\n> I don't have time to deal with Apple.\n>\n> [Homebrew installation script](https://github.com/nikitabobko/homebrew-tap/blob/main/Casks/aerospace.rb) is configured to\n> automatically delete `com.apple.quarantine` attribute, that's why the app should work out of the box, without any warnings that\n> \"Apple cannot check AeroSpace for malicious software\"\n\n## Community, discussions, issues\n\nAeroSpace project doesn't accept Issues directly - we ask you to create a [Discussion](https://github.com/nikitabobko/AeroSpace/discussions) first.\nPlease read [CONTRIBUTING.md](./CONTRIBUTING.md) for more details.\n\nCommunity discussions happen at GitHub Discussions.\nThere you can discuss bugs, propose new features, ask your questions, show off your setup, or just chat.\n\nThere are 7 channels:\n-   [#all](https://github.com/nikitabobko/AeroSpace/discussions).\n    [RSS](https://github.com/nikitabobko/AeroSpace/discussions.atom?discussions_q=sort%3Adate_created).\n    Feed with all discussions.\n-   [#announcements](https://github.com/nikitabobko/AeroSpace/discussions/categories/announcements).\n    [RSS](https://github.com/nikitabobko/AeroSpace/discussions/categories/announcements.atom?discussions_q=category%3Aannouncements+sort%3Adate_created).\n    Only maintainers can post here.\n    Highly moderated traffic.\n-   [#announcements-releases](https://github.com/nikitabobko/AeroSpace/discussions/categories/announcements-releases).\n    [RSS](https://github.com/nikitabobko/AeroSpace/discussions/categories/announcements-releases.atom?discussions_q=category%3Aannouncements-releases+sort%3Adate_created).\n    Announcements about non-patch releases.\n    Only maintainers can post here.\n-   [#feature-ideas](https://github.com/nikitabobko/AeroSpace/discussions/categories/feature-ideas).\n    [RSS](https://github.com/nikitabobko/AeroSpace/discussions/categories/feature-ideas.atom?discussions_q=category%3Afeature-ideas+sort%3Adate_created).\n-   [#general](https://github.com/nikitabobko/AeroSpace/discussions/categories/general).\n    [RSS](https://github.com/nikitabobko/AeroSpace/discussions/categories/general.atom?discussions_q=sort%3Adate_created+category%3Ageneral).\n-   [#potential-bugs](https://github.com/nikitabobko/AeroSpace/discussions/categories/potential-bugs).\n    [RSS](https://github.com/nikitabobko/AeroSpace/discussions/categories/potential-bugs.atom?discussions_q=category%3Apotential-bugs+sort%3Adate_created).\n    If you think that you have encountered a bug, you can discuss your bugs here.\n-   [#questions-and-answers](https://github.com/nikitabobko/AeroSpace/discussions/categories/questions-and-answers).\n    [RSS](https://github.com/nikitabobko/AeroSpace/discussions/categories/questions-and-answers.atom?discussions_q=category%3Aquestions-and-answers+sort%3Adate_created).\n    Everyone is welcome to ask questions.\n    Everyone is encouraged to answer other people's questions.\n\n## Project status\n\nPublic Beta. AeroSpace can be used as a daily driver, but expect breaking changes until 1.0 is reached.\n\nWhat stops us from 1.0 release:\n- [x] https://github.com/nikitabobko/AeroSpace/issues/131 Performance. Implement thread-per-application to circumvent macOS blocking AX API.\n- [ ] https://github.com/nikitabobko/AeroSpace/issues/1215 _Big refactoring_. Rewrite mutable double-linked core tree data structure to immutable single-linked persistent tree.\n  Important for: stability and potential performance\n  - [ ] https://github.com/nikitabobko/AeroSpace/issues/1216 The big refactoring will help us to fix stability issue that windows may randomly jump to the focused workspace\n  - [ ] https://github.com/nikitabobko/AeroSpace/issues/68 The big refactoring will help us to support macOS native tabs\n- [ ] https://github.com/nikitabobko/AeroSpace/issues/278 Implement shell-like combinators.\n  Ignore a lot of crazy fuss in the issue,\n  We are most probably going with the minimal approach to only introduce common shell-combinators: `||`, `&&`, `;` and `eval` command to send multiple commands in one go.\n- [ ] https://github.com/nikitabobko/AeroSpace/issues/1012 Investigate a possibility to use `CGEvent.tapCreate` API for global hotkeys\n  - [ ] https://github.com/nikitabobko/AeroSpace/issues/28 Maybe it will allow to distinguish left and right modifiers. Maybe not\n\nBig and important issues which will go after 1.0 release:\n- [ ] https://github.com/nikitabobko/AeroSpace/issues/2 sticky windows\n- [ ] https://github.com/nikitabobko/AeroSpace/issues/260 Dynamic TWM\n\n## Development\n\nA notes on how to setup the project, build it, how to run the tests, etc. can be found here: [dev-docs/development.md](./dev-docs/development.md)\n\n## Project values\n\n**Values**\n- AeroSpace is targeted at advanced users and developers\n- Keyboard centric\n- Breaking changes (configuration files, CLI, behavior) are avoided as much as possible, but it must not let the software stagnate.\n  Thus breaking changes can happen, but with careful considerations and helpful message.\n  [Semver](https://semver.org/) major version is bumped in case of a breaking change (It's all guaranteed once AeroSpace reaches 1.0 version, until then breaking changes just happen)\n- AeroSpace doesn't use GUI, unless necessarily\n  - AeroSpace will never provide a GUI for configuration.\n    For advanced users, it's easier to edit a configuration file in text editor rather than navigating through checkboxes in GUI.\n  - Status menu icon is ok, because visual feedback is needed\n- Provide _practical_ features. Fancy appearance features are not _practical_ (e.g. window borders, transparency, animations, etc.)\n- \"dark magic\" (aka \"private APIs\", \"code injections\", etc.) must be avoided as much as possible\n  - Right now, AeroSpace uses only a single private API to get window ID of accessibility object `_AXUIElementGetWindow`.\n    Everything else is [macOS public accessibility API](https://developer.apple.com/documentation/applicationservices/axuielement_h).\n  - AeroSpace will never require you to disable SIP (System Integrity Protection).\n  - The goal is to make AeroSpace easily maintainable, and resistant to macOS updates.\n\n**Non Values**\n- Play nicely with existing macOS features.\n  If limitations are imposed then AeroSpace won't play nicely with existing macOS features\n  (For example, AeroSpace doesn't acknowledge the existence of macOS Spaces, and it uses [emulation of its own workspaces](https://nikitabobko.github.io/AeroSpace/guide#emulation-of-virtual-workspaces))\n- Ricing.\n  AeroSpace provides only a very minimal support for ricing - gaps and a few callbacks for integrations with bars.\n  The current maintainer doesn't care about ricing.\n  Ricing issues are not a priority, and they are mostly ignored.\n  The ricing stance can change only with the appearance of more maintainers.\n\n## macOS compatibility table\n\n|                                                                                | macOS 13 (Ventura) | macOS 14 (Sonoma) | macOS 15 (Sequoia) | macOS 26 (Tahoe) |\n| ------------------------------------------------------------------------------ | ------------------ | ----------------- | ------------------ | ---------------- |\n| AeroSpace binary runs on ...                                                   | +                  | +                 | +                  | +                |\n| AeroSpace debug build from sources is supported on ...                         |                    | +                 | +                  | +                |\n| AeroSpace release build from sources is supported on ... (Requires Xcode 26+)  |                    |                   | +                  | +                |\n\n## Sponsorship\n\nAeroSpace is developed and maintained in my free time.\nIf you find it useful, [consider sponsoring](https://github.com/sponsors/nikitabobko#sponsors).\n\n## People who have write access\n\nIn alphabetical order:\n\n- [@mobile-ar](https://github.com/mobile-ar/)\n- [@nikitabobko](https://github.com/nikitabobko/)\n\n## Tip of the day\n\n```bash\ndefaults write -g NSWindowShouldDragOnGesture -bool true\n```\n\nNow, you can move windows by holding `ctrl`+`cmd` and dragging any part of the window (not necessarily the window title)\n\nSource: [reddit](https://www.reddit.com/r/MacOS/comments/k6hiwk/keyboard_modifier_to_simplify_click_drag_of/)\n\n## Related projects\n\n- [Amethyst](https://github.com/ianyh/Amethyst)\n- [yabai](https://github.com/koekeishiya/yabai)\n"
  },
  {
    "path": "ShellParserGenerated/.gitignore",
    "content": ".DS_Store\n/.build\n/Packages\nxcuserdata/\nDerivedData/\n.swiftpm/configuration/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": "ShellParserGenerated/Package.swift",
    "content": "// swift-tools-version: 5.9\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"ShellParserGenerated\",\n    products: [\n        // Products define the executables and libraries a package produces, making them visible to other packages.\n        .library(\n            name: \"ShellParserGenerated\",\n            targets: [\"ShellParserGenerated\"]\n        ),\n    ],\n    dependencies: [\n        .package(url: \"https://github.com/antlr/antlr4\", exact: \"4.13.1\"),\n    ],\n    targets: [\n        // Targets are the basic building blocks of a package, defining a module or a test suite.\n        // Targets can depend on other targets in this package and products from dependencies.\n        .target(\n            name: \"ShellParserGenerated\",\n            dependencies: [\n                .product(name: \"Antlr4Static\", package: \"antlr4\"),\n            ]\n        ),\n    ]\n)\n"
  },
  {
    "path": "ShellParserGenerated/Sources/ShellParserGenerated/ShellLexer.swift",
    "content": "// Generated from ./grammar/ShellLexer.g4 by ANTLR 4.13.1\nimport Antlr4\n\nopen class ShellLexer: Lexer {\n\n\tinternal static var _decisionToDFA: [DFA] = {\n          var decisionToDFA = [DFA]()\n          let length = ShellLexer._ATN.getNumberOfDecisions()\n          for i in 0..<length {\n          \t    decisionToDFA.append(DFA(ShellLexer._ATN.getDecisionState(i)!, i))\n          }\n           return decisionToDFA\n     }()\n\n\tinternal static let _sharedContextCache = PredictionContextCache()\n\n\tpublic\n\tstatic let TRIPLE_QUOTE=1, SINGLE_QUOTED_STRING=2, LDQUOTE=3, LPAR=4, INTERPOLATION_START=5, \n            RPAR=6, ELIF=7, IF=8, SWITCH=9, CASE=10, DO=11, THEN=12, ELSE=13, \n            FOR=14, WHILE=15, CATCH=16, IN=17, END=18, DEFER=19, AND=20, \n            PIPE=21, OR=22, SEMICOLON=23, NL=24, WORD=25, ARG=26, ESCAPE_NEWLINE=27, \n            COMMENT=28, SPACES=29, ANY=30, TEXT=31, INTERPOLATION_START_IN_DSTRING=32, \n            ESCAPE_SEQUENCE=33, RDQUOTE=34\n\n\tpublic\n\tstatic let IN_DSTRING=1\n\tpublic\n\tstatic let channelNames: [String] = [\n\t\t\"DEFAULT_TOKEN_CHANNEL\", \"HIDDEN\"\n\t]\n\n\tpublic\n\tstatic let modeNames: [String] = [\n\t\t\"DEFAULT_MODE\", \"IN_DSTRING\"\n\t]\n\n\tpublic\n\tstatic let ruleNames: [String] = [\n\t\t\"TRIPLE_QUOTE\", \"SINGLE_QUOTED_STRING\", \"LDQUOTE\", \"LPAR\", \"INTERPOLATION_START\", \n\t\t\"RPAR\", \"ELIF\", \"IF\", \"SWITCH\", \"CASE\", \"DO\", \"THEN\", \"ELSE\", \"FOR\", \"WHILE\", \n\t\t\"CATCH\", \"IN\", \"END\", \"DEFER\", \"AND\", \"PIPE\", \"OR\", \"SEMICOLON\", \"NL\", \n\t\t\"WORD\", \"ARG\", \"ESCAPE_NEWLINE\", \"COMMENT\", \"SPACES\", \"ANY\", \"TEXT\", \"INTERPOLATION_START_IN_DSTRING\", \n\t\t\"ESCAPE_SEQUENCE\", \"RDQUOTE\"\n\t]\n\n\tprivate static let _LITERAL_NAMES: [String?] = [\n\t\tnil, nil, nil, nil, \"'('\", nil, \"')'\", nil, nil, nil, nil, nil, nil, nil, \n\t\tnil, nil, nil, nil, nil, nil, \"'&&'\", \"'|'\", \"'||'\", \"';'\"\n\t]\n\tprivate static let _SYMBOLIC_NAMES: [String?] = [\n\t\tnil, \"TRIPLE_QUOTE\", \"SINGLE_QUOTED_STRING\", \"LDQUOTE\", \"LPAR\", \"INTERPOLATION_START\", \n\t\t\"RPAR\", \"ELIF\", \"IF\", \"SWITCH\", \"CASE\", \"DO\", \"THEN\", \"ELSE\", \"FOR\", \"WHILE\", \n\t\t\"CATCH\", \"IN\", \"END\", \"DEFER\", \"AND\", \"PIPE\", \"OR\", \"SEMICOLON\", \"NL\", \n\t\t\"WORD\", \"ARG\", \"ESCAPE_NEWLINE\", \"COMMENT\", \"SPACES\", \"ANY\", \"TEXT\", \"INTERPOLATION_START_IN_DSTRING\", \n\t\t\"ESCAPE_SEQUENCE\", \"RDQUOTE\"\n\t]\n\tpublic\n\tstatic let VOCABULARY = Vocabulary(_LITERAL_NAMES, _SYMBOLIC_NAMES)\n\n\n\toverride open\n\tfunc getVocabulary() -> Vocabulary {\n\t\treturn ShellLexer.VOCABULARY\n\t}\n\n\tpublic\n\trequired init(_ input: CharStream) {\n\t    RuntimeMetaData.checkVersion(\"4.13.1\", RuntimeMetaData.VERSION)\n\t\tsuper.init(input)\n\t\t_interp = LexerATNSimulator(self, ShellLexer._ATN, ShellLexer._decisionToDFA, ShellLexer._sharedContextCache)\n\t}\n\n\toverride open\n\tfunc getGrammarFileName() -> String { return \"ShellLexer.g4\" }\n\n\toverride open\n\tfunc getRuleNames() -> [String] { return ShellLexer.ruleNames }\n\n\toverride open\n\tfunc getSerializedATN() -> [Int] { return ShellLexer._serializedATN }\n\n\toverride open\n\tfunc getChannelNames() -> [String] { return ShellLexer.channelNames }\n\n\toverride open\n\tfunc getModeNames() -> [String] { return ShellLexer.modeNames }\n\n\toverride open\n\tfunc getATN() -> ATN { return ShellLexer._ATN }\n\n\toverride open\n\tfunc action(_ _localctx: RuleContext?,  _ ruleIndex: Int, _ actionIndex: Int) throws {\n\t\tswitch (ruleIndex) {\n\t\tcase 5:\n\t\t\ttry RPAR_action((_localctx as RuleContext?), actionIndex)\n\n\t\tcase 33:\n\t\t\ttry RDQUOTE_action((_localctx as RuleContext?), actionIndex)\n\n\t\tdefault: break\n\t\t}\n\t}\n\tprivate func RPAR_action(_ _localctx: RuleContext?,  _ actionIndex: Int) throws {\n\t\tswitch (actionIndex) {\n\t\tcase 0:\n\n\t\t\t    _ = try? popMode()\n\n\n\t\t default: break\n\t\t}\n\t}\n\tprivate func RDQUOTE_action(_ _localctx: RuleContext?,  _ actionIndex: Int) throws {\n\t\tswitch (actionIndex) {\n\t\tcase 1:\n\n\t\t\t    _ = try? popMode()\n\n\n\t\t default: break\n\t\t}\n\t}\n\n\tstatic let _serializedATN:[Int] = [\n\t\t4,0,34,316,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,\n\t\t6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,\n\t\t2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,\n\t\t2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,\n\t\t2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2,33,7,33,1,0,1,0,1,\n\t\t0,1,0,1,0,1,0,3,0,77,8,0,1,1,1,1,5,1,81,8,1,10,1,12,1,84,9,1,1,1,1,1,1,\n\t\t2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,6,1,6,\n\t\t1,6,1,6,1,6,1,6,5,6,110,8,6,10,6,12,6,113,9,6,1,7,1,7,1,7,1,7,5,7,119,\n\t\t8,7,10,7,12,7,122,9,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,132,8,8,10,8,\n\t\t12,8,135,9,8,1,9,1,9,1,9,1,9,1,9,1,9,5,9,143,8,9,10,9,12,9,146,9,9,1,10,\n\t\t1,10,1,10,1,10,5,10,152,8,10,10,10,12,10,155,9,10,1,11,1,11,1,11,1,11,\n\t\t1,11,1,11,5,11,163,8,11,10,11,12,11,166,9,11,1,12,1,12,1,12,1,12,1,12,\n\t\t1,12,5,12,174,8,12,10,12,12,12,177,9,12,1,13,1,13,1,13,1,13,1,13,5,13,\n\t\t184,8,13,10,13,12,13,187,9,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,5,14,\n\t\t196,8,14,10,14,12,14,199,9,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,5,15,\n\t\t208,8,15,10,15,12,15,211,9,15,1,16,1,16,1,16,1,16,5,16,217,8,16,10,16,\n\t\t12,16,220,9,16,1,17,1,17,1,17,1,17,1,17,5,17,227,8,17,10,17,12,17,230,\n\t\t9,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,5,18,239,8,18,10,18,12,18,242,\n\t\t9,18,1,19,1,19,1,19,1,20,1,20,1,21,1,21,1,21,1,22,1,22,1,23,3,23,255,8,\n\t\t23,1,23,3,23,258,8,23,1,23,1,23,1,24,4,24,263,8,24,11,24,12,24,264,1,25,\n\t\t4,25,268,8,25,11,25,12,25,269,1,26,1,26,3,26,274,8,26,1,26,3,26,277,8,\n\t\t26,1,26,1,26,1,26,1,26,1,27,1,27,5,27,285,8,27,10,27,12,27,288,9,27,1,\n\t\t27,1,27,1,28,4,28,293,8,28,11,28,12,28,294,1,28,1,28,1,29,1,29,1,30,4,\n\t\t30,302,8,30,11,30,12,30,303,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,\n\t\t33,1,33,1,33,1,82,0,34,2,1,4,2,6,3,8,4,10,5,12,6,14,7,16,8,18,9,20,10,\n\t\t22,11,24,12,26,13,28,14,30,15,32,16,34,17,36,18,38,19,40,20,42,21,44,22,\n\t\t46,23,48,24,50,25,52,26,54,27,56,28,58,29,60,30,62,31,64,32,66,33,68,34,\n\t\t2,0,1,5,4,0,45,47,65,90,95,95,97,122,8,0,33,33,37,37,43,57,61,61,65,90,\n\t\t94,95,97,123,125,125,1,0,10,10,2,0,9,9,32,32,3,0,34,34,36,36,92,92,338,\n\t\t0,2,1,0,0,0,0,4,1,0,0,0,0,6,1,0,0,0,0,8,1,0,0,0,0,10,1,0,0,0,0,12,1,0,\n\t\t0,0,0,14,1,0,0,0,0,16,1,0,0,0,0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,\n\t\t24,1,0,0,0,0,26,1,0,0,0,0,28,1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,\n\t\t0,0,0,0,36,1,0,0,0,0,38,1,0,0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,\n\t\t0,46,1,0,0,0,0,48,1,0,0,0,0,50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,\n\t\t1,0,0,0,0,58,1,0,0,0,0,60,1,0,0,0,1,62,1,0,0,0,1,64,1,0,0,0,1,66,1,0,0,\n\t\t0,1,68,1,0,0,0,2,76,1,0,0,0,4,78,1,0,0,0,6,87,1,0,0,0,8,91,1,0,0,0,10,\n\t\t95,1,0,0,0,12,100,1,0,0,0,14,103,1,0,0,0,16,114,1,0,0,0,18,123,1,0,0,0,\n\t\t20,136,1,0,0,0,22,147,1,0,0,0,24,156,1,0,0,0,26,167,1,0,0,0,28,178,1,0,\n\t\t0,0,30,188,1,0,0,0,32,200,1,0,0,0,34,212,1,0,0,0,36,221,1,0,0,0,38,231,\n\t\t1,0,0,0,40,243,1,0,0,0,42,246,1,0,0,0,44,248,1,0,0,0,46,251,1,0,0,0,48,\n\t\t254,1,0,0,0,50,262,1,0,0,0,52,267,1,0,0,0,54,271,1,0,0,0,56,282,1,0,0,\n\t\t0,58,292,1,0,0,0,60,298,1,0,0,0,62,301,1,0,0,0,64,305,1,0,0,0,66,310,1,\n\t\t0,0,0,68,313,1,0,0,0,70,71,5,34,0,0,71,72,5,34,0,0,72,77,5,34,0,0,73,74,\n\t\t5,39,0,0,74,75,5,39,0,0,75,77,5,39,0,0,76,70,1,0,0,0,76,73,1,0,0,0,77,\n\t\t3,1,0,0,0,78,82,5,39,0,0,79,81,9,0,0,0,80,79,1,0,0,0,81,84,1,0,0,0,82,\n\t\t83,1,0,0,0,82,80,1,0,0,0,83,85,1,0,0,0,84,82,1,0,0,0,85,86,5,39,0,0,86,\n\t\t5,1,0,0,0,87,88,5,34,0,0,88,89,1,0,0,0,89,90,6,2,0,0,90,7,1,0,0,0,91,92,\n\t\t5,40,0,0,92,93,1,0,0,0,93,94,6,3,1,0,94,9,1,0,0,0,95,96,5,36,0,0,96,97,\n\t\t5,40,0,0,97,98,1,0,0,0,98,99,6,4,1,0,99,11,1,0,0,0,100,101,5,41,0,0,101,\n\t\t102,6,5,2,0,102,13,1,0,0,0,103,104,5,101,0,0,104,105,5,108,0,0,105,106,\n\t\t5,105,0,0,106,107,5,102,0,0,107,111,1,0,0,0,108,110,3,48,23,0,109,108,\n\t\t1,0,0,0,110,113,1,0,0,0,111,109,1,0,0,0,111,112,1,0,0,0,112,15,1,0,0,0,\n\t\t113,111,1,0,0,0,114,115,5,105,0,0,115,116,5,102,0,0,116,120,1,0,0,0,117,\n\t\t119,3,48,23,0,118,117,1,0,0,0,119,122,1,0,0,0,120,118,1,0,0,0,120,121,\n\t\t1,0,0,0,121,17,1,0,0,0,122,120,1,0,0,0,123,124,5,115,0,0,124,125,5,119,\n\t\t0,0,125,126,5,105,0,0,126,127,5,116,0,0,127,128,5,99,0,0,128,129,5,104,\n\t\t0,0,129,133,1,0,0,0,130,132,3,48,23,0,131,130,1,0,0,0,132,135,1,0,0,0,\n\t\t133,131,1,0,0,0,133,134,1,0,0,0,134,19,1,0,0,0,135,133,1,0,0,0,136,137,\n\t\t5,99,0,0,137,138,5,97,0,0,138,139,5,115,0,0,139,140,5,101,0,0,140,144,\n\t\t1,0,0,0,141,143,3,48,23,0,142,141,1,0,0,0,143,146,1,0,0,0,144,142,1,0,\n\t\t0,0,144,145,1,0,0,0,145,21,1,0,0,0,146,144,1,0,0,0,147,148,5,100,0,0,148,\n\t\t149,5,111,0,0,149,153,1,0,0,0,150,152,3,48,23,0,151,150,1,0,0,0,152,155,\n\t\t1,0,0,0,153,151,1,0,0,0,153,154,1,0,0,0,154,23,1,0,0,0,155,153,1,0,0,0,\n\t\t156,157,5,116,0,0,157,158,5,104,0,0,158,159,5,101,0,0,159,160,5,110,0,\n\t\t0,160,164,1,0,0,0,161,163,3,48,23,0,162,161,1,0,0,0,163,166,1,0,0,0,164,\n\t\t162,1,0,0,0,164,165,1,0,0,0,165,25,1,0,0,0,166,164,1,0,0,0,167,168,5,101,\n\t\t0,0,168,169,5,108,0,0,169,170,5,115,0,0,170,171,5,101,0,0,171,175,1,0,\n\t\t0,0,172,174,3,48,23,0,173,172,1,0,0,0,174,177,1,0,0,0,175,173,1,0,0,0,\n\t\t175,176,1,0,0,0,176,27,1,0,0,0,177,175,1,0,0,0,178,179,5,102,0,0,179,180,\n\t\t5,111,0,0,180,181,5,114,0,0,181,185,1,0,0,0,182,184,3,48,23,0,183,182,\n\t\t1,0,0,0,184,187,1,0,0,0,185,183,1,0,0,0,185,186,1,0,0,0,186,29,1,0,0,0,\n\t\t187,185,1,0,0,0,188,189,5,119,0,0,189,190,5,104,0,0,190,191,5,105,0,0,\n\t\t191,192,5,108,0,0,192,193,5,101,0,0,193,197,1,0,0,0,194,196,3,48,23,0,\n\t\t195,194,1,0,0,0,196,199,1,0,0,0,197,195,1,0,0,0,197,198,1,0,0,0,198,31,\n\t\t1,0,0,0,199,197,1,0,0,0,200,201,5,99,0,0,201,202,5,97,0,0,202,203,5,116,\n\t\t0,0,203,204,5,99,0,0,204,205,5,104,0,0,205,209,1,0,0,0,206,208,3,48,23,\n\t\t0,207,206,1,0,0,0,208,211,1,0,0,0,209,207,1,0,0,0,209,210,1,0,0,0,210,\n\t\t33,1,0,0,0,211,209,1,0,0,0,212,213,5,105,0,0,213,214,5,110,0,0,214,218,\n\t\t1,0,0,0,215,217,3,48,23,0,216,215,1,0,0,0,217,220,1,0,0,0,218,216,1,0,\n\t\t0,0,218,219,1,0,0,0,219,35,1,0,0,0,220,218,1,0,0,0,221,222,5,101,0,0,222,\n\t\t223,5,110,0,0,223,224,5,100,0,0,224,228,1,0,0,0,225,227,3,48,23,0,226,\n\t\t225,1,0,0,0,227,230,1,0,0,0,228,226,1,0,0,0,228,229,1,0,0,0,229,37,1,0,\n\t\t0,0,230,228,1,0,0,0,231,232,5,100,0,0,232,233,5,101,0,0,233,234,5,102,\n\t\t0,0,234,235,5,101,0,0,235,236,5,114,0,0,236,240,1,0,0,0,237,239,3,48,23,\n\t\t0,238,237,1,0,0,0,239,242,1,0,0,0,240,238,1,0,0,0,240,241,1,0,0,0,241,\n\t\t39,1,0,0,0,242,240,1,0,0,0,243,244,5,38,0,0,244,245,5,38,0,0,245,41,1,\n\t\t0,0,0,246,247,5,124,0,0,247,43,1,0,0,0,248,249,5,124,0,0,249,250,5,124,\n\t\t0,0,250,45,1,0,0,0,251,252,5,59,0,0,252,47,1,0,0,0,253,255,3,58,28,0,254,\n\t\t253,1,0,0,0,254,255,1,0,0,0,255,257,1,0,0,0,256,258,5,13,0,0,257,256,1,\n\t\t0,0,0,257,258,1,0,0,0,258,259,1,0,0,0,259,260,5,10,0,0,260,49,1,0,0,0,\n\t\t261,263,7,0,0,0,262,261,1,0,0,0,263,264,1,0,0,0,264,262,1,0,0,0,264,265,\n\t\t1,0,0,0,265,51,1,0,0,0,266,268,7,1,0,0,267,266,1,0,0,0,268,269,1,0,0,0,\n\t\t269,267,1,0,0,0,269,270,1,0,0,0,270,53,1,0,0,0,271,273,5,92,0,0,272,274,\n\t\t3,58,28,0,273,272,1,0,0,0,273,274,1,0,0,0,274,276,1,0,0,0,275,277,3,56,\n\t\t27,0,276,275,1,0,0,0,276,277,1,0,0,0,277,278,1,0,0,0,278,279,5,10,0,0,\n\t\t279,280,1,0,0,0,280,281,6,26,3,0,281,55,1,0,0,0,282,286,5,35,0,0,283,285,\n\t\t8,2,0,0,284,283,1,0,0,0,285,288,1,0,0,0,286,284,1,0,0,0,286,287,1,0,0,\n\t\t0,287,289,1,0,0,0,288,286,1,0,0,0,289,290,6,27,3,0,290,57,1,0,0,0,291,\n\t\t293,7,3,0,0,292,291,1,0,0,0,293,294,1,0,0,0,294,292,1,0,0,0,294,295,1,\n\t\t0,0,0,295,296,1,0,0,0,296,297,6,28,3,0,297,59,1,0,0,0,298,299,9,0,0,0,\n\t\t299,61,1,0,0,0,300,302,8,4,0,0,301,300,1,0,0,0,302,303,1,0,0,0,303,301,\n\t\t1,0,0,0,303,304,1,0,0,0,304,63,1,0,0,0,305,306,5,36,0,0,306,307,5,40,0,\n\t\t0,307,308,1,0,0,0,308,309,6,31,1,0,309,65,1,0,0,0,310,311,5,92,0,0,311,\n\t\t312,9,0,0,0,312,67,1,0,0,0,313,314,5,34,0,0,314,315,6,33,4,0,315,69,1,\n\t\t0,0,0,28,0,1,76,82,111,120,133,144,153,164,175,185,197,209,218,228,240,\n\t\t254,257,262,264,267,269,273,276,286,294,303,5,5,1,0,5,0,0,1,5,0,6,0,0,\n\t\t1,33,1\n\t]\n\n\tpublic\n\tstatic let _ATN: ATN = try! ATNDeserializer().deserialize(_serializedATN)\n}"
  },
  {
    "path": "ShellParserGenerated/Sources/ShellParserGenerated/ShellParser.swift",
    "content": "// Generated from ./grammar/ShellParser.g4 by ANTLR 4.13.1\nimport Antlr4\n\nopen class ShellParser: Parser {\n\n\tinternal static var _decisionToDFA: [DFA] = {\n          var decisionToDFA = [DFA]()\n          let length = ShellParser._ATN.getNumberOfDecisions()\n          for i in 0..<length {\n            decisionToDFA.append(DFA(ShellParser._ATN.getDecisionState(i)!, i))\n           }\n           return decisionToDFA\n     }()\n\n\tinternal static let _sharedContextCache = PredictionContextCache()\n\n\tpublic\n\tenum Tokens: Int {\n\t\tcase EOF = -1, TRIPLE_QUOTE = 1, SINGLE_QUOTED_STRING = 2, LDQUOTE = 3, \n                 LPAR = 4, INTERPOLATION_START = 5, RPAR = 6, ELIF = 7, \n                 IF = 8, SWITCH = 9, CASE = 10, DO = 11, THEN = 12, ELSE = 13, \n                 FOR = 14, WHILE = 15, CATCH = 16, IN = 17, END = 18, DEFER = 19, \n                 AND = 20, PIPE = 21, OR = 22, SEMICOLON = 23, NL = 24, \n                 WORD = 25, ARG = 26, ESCAPE_NEWLINE = 27, COMMENT = 28, \n                 SPACES = 29, ANY = 30, TEXT = 31, INTERPOLATION_START_IN_DSTRING = 32, \n                 ESCAPE_SEQUENCE = 33, RDQUOTE = 34\n\t}\n\n\tpublic\n\tstatic let RULE_root = 0, RULE_cmds = 1, RULE_cmd = 2, RULE_arg = 3, RULE_dStringFragment = 4\n\n\tpublic\n\tstatic let ruleNames: [String] = [\n\t\t\"root\", \"cmds\", \"cmd\", \"arg\", \"dStringFragment\"\n\t]\n\n\tprivate static let _LITERAL_NAMES: [String?] = [\n\t\tnil, nil, nil, nil, \"'('\", nil, \"')'\", nil, nil, nil, nil, nil, nil, nil, \n\t\tnil, nil, nil, nil, nil, nil, \"'&&'\", \"'|'\", \"'||'\", \"';'\"\n\t]\n\tprivate static let _SYMBOLIC_NAMES: [String?] = [\n\t\tnil, \"TRIPLE_QUOTE\", \"SINGLE_QUOTED_STRING\", \"LDQUOTE\", \"LPAR\", \"INTERPOLATION_START\", \n\t\t\"RPAR\", \"ELIF\", \"IF\", \"SWITCH\", \"CASE\", \"DO\", \"THEN\", \"ELSE\", \"FOR\", \"WHILE\", \n\t\t\"CATCH\", \"IN\", \"END\", \"DEFER\", \"AND\", \"PIPE\", \"OR\", \"SEMICOLON\", \"NL\", \n\t\t\"WORD\", \"ARG\", \"ESCAPE_NEWLINE\", \"COMMENT\", \"SPACES\", \"ANY\", \"TEXT\", \"INTERPOLATION_START_IN_DSTRING\", \n\t\t\"ESCAPE_SEQUENCE\", \"RDQUOTE\"\n\t]\n\tpublic\n\tstatic let VOCABULARY = Vocabulary(_LITERAL_NAMES, _SYMBOLIC_NAMES)\n\n\toverride open\n\tfunc getGrammarFileName() -> String { return \"ShellParser.g4\" }\n\n\toverride open\n\tfunc getRuleNames() -> [String] { return ShellParser.ruleNames }\n\n\toverride open\n\tfunc getSerializedATN() -> [Int] { return ShellParser._serializedATN }\n\n\toverride open\n\tfunc getATN() -> ATN { return ShellParser._ATN }\n\n\n\toverride open\n\tfunc getVocabulary() -> Vocabulary {\n\t    return ShellParser.VOCABULARY\n\t}\n\n\toverride public\n\tinit(_ input:TokenStream) throws {\n\t    RuntimeMetaData.checkVersion(\"4.13.1\", RuntimeMetaData.VERSION)\n\t\ttry super.init(input)\n\t\t_interp = ParserATNSimulator(self,ShellParser._ATN,ShellParser._decisionToDFA, ShellParser._sharedContextCache)\n\t}\n\n\n\tpublic class RootContext: ParserRuleContext {\n\t\t\topen\n\t\t\tfunc cmds() -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc EOF() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.EOF.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.NL.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.NL.rawValue, i)\n\t\t\t}\n\t\toverride open\n\t\tfunc getRuleIndex() -> Int {\n\t\t\treturn ShellParser.RULE_root\n\t\t}\n\t}\n\t@discardableResult\n\t open func root() throws -> RootContext {\n\t\tvar _localctx: RootContext\n\t\t_localctx = RootContext(_ctx, getState())\n\t\ttry enterRule(_localctx, 0, ShellParser.RULE_root)\n\t\tvar _la: Int = 0\n\t\tdefer {\n\t    \t\ttry! exitRule()\n\t    }\n\t\tdo {\n\t\t \ttry enterOuterAlt(_localctx, 1)\n\t\t \tsetState(13)\n\t\t \ttry _errHandler.sync(self)\n\t\t \t_la = try _input.LA(1)\n\t\t \twhile (_la == ShellParser.Tokens.NL.rawValue) {\n\t\t \t\tsetState(10)\n\t\t \t\ttry match(ShellParser.Tokens.NL.rawValue)\n\n\n\t\t \t\tsetState(15)\n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_la = try _input.LA(1)\n\t\t \t}\n\t\t \tsetState(20)\n\t\t \ttry _errHandler.sync(self)\n\t\t \tswitch (ShellParser.Tokens(rawValue: try _input.LA(1))!) {\n\t\t \tcase .LPAR:fallthrough\n\t\t \tcase .IF:fallthrough\n\t\t \tcase .WORD:\n\t\t \t\tsetState(16)\n\t\t \t\ttry cmds()\n\t\t \t\tsetState(17)\n\t\t \t\ttry match(ShellParser.Tokens.EOF.rawValue)\n\n\t\t \t\tbreak\n\n\t\t \tcase .EOF:\n\t\t \t\tsetState(19)\n\t\t \t\ttry match(ShellParser.Tokens.EOF.rawValue)\n\n\t\t \t\tbreak\n\t\t \tdefault:\n\t\t \t\tthrow ANTLRException.recognition(e: NoViableAltException(self))\n\t\t \t}\n\n\t\t}\n\t\tcatch ANTLRException.recognition(let re) {\n\t\t\t_localctx.exception = re\n\t\t\t_errHandler.reportError(self, re)\n\t\t\ttry _errHandler.recover(self, re)\n\t\t}\n\n\t\treturn _localctx\n\t}\n\n\tpublic class CmdsContext: ParserRuleContext {\n\t\toverride open\n\t\tfunc getRuleIndex() -> Int {\n\t\t\treturn ShellParser.RULE_cmds\n\t\t}\n\t}\n\tpublic class IfElseContext: CmdsContext {\n\t\t\topen\n\t\t\tfunc IF() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.IF.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmd() -> [CmdContext] {\n\t\t\t\treturn getRuleContexts(CmdContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmd(_ i: Int) -> CmdContext? {\n\t\t\t\treturn getRuleContext(CmdContext.self, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc THEN() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.THEN.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc THEN(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.THEN.rawValue, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc END() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.END.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds() -> [CmdsContext] {\n\t\t\t\treturn getRuleContexts(CmdsContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds(_ i: Int) -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc ELIF() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.ELIF.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc ELIF(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.ELIF.rawValue, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc ELSE() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.ELSE.rawValue, 0)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: CmdsContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class SeqContext: CmdsContext {\n\t\t\topen\n\t\t\tfunc cmd() -> CmdContext? {\n\t\t\t\treturn getRuleContext(CmdContext.self, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds() -> [CmdsContext] {\n\t\t\t\treturn getRuleContexts(CmdsContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds(_ i: Int) -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc SEMICOLON() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.SEMICOLON.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc SEMICOLON(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.SEMICOLON.rawValue, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.NL.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.NL.rawValue, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: CmdsContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\t@discardableResult\n\t open func cmds() throws -> CmdsContext {\n\t\tvar _localctx: CmdsContext\n\t\t_localctx = CmdsContext(_ctx, getState())\n\t\ttry enterRule(_localctx, 2, ShellParser.RULE_cmds)\n\t\tvar _la: Int = 0\n\t\tdefer {\n\t    \t\ttry! exitRule()\n\t    }\n\t\tdo {\n\t\t\tvar _alt:Int\n\t\t \tsetState(60)\n\t\t \ttry _errHandler.sync(self)\n\t\t \tswitch(try getInterpreter().adaptivePredict(_input,9, _ctx)) {\n\t\t \tcase 1:\n\t\t \t\t_localctx =  IfElseContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 1)\n\t\t \t\tsetState(22)\n\t\t \t\ttry match(ShellParser.Tokens.IF.rawValue)\n\t\t \t\tsetState(23)\n\t\t \t\ttry cmd(0)\n\t\t \t\tsetState(24)\n\t\t \t\ttry match(ShellParser.Tokens.THEN.rawValue)\n\t\t \t\tsetState(26)\n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_la = try _input.LA(1)\n\t\t \t\tif (((Int64(_la) & ~0x3f) == 0 && ((Int64(1) << _la) & 33554704) != 0)) {\n\t\t \t\t\tsetState(25)\n\t\t \t\t\ttry cmds()\n\n\t\t \t\t}\n\n\t\t \t\tsetState(36)\n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_la = try _input.LA(1)\n\t\t \t\twhile (_la == ShellParser.Tokens.ELIF.rawValue) {\n\t\t \t\t\tsetState(28)\n\t\t \t\t\ttry match(ShellParser.Tokens.ELIF.rawValue)\n\t\t \t\t\tsetState(29)\n\t\t \t\t\ttry cmd(0)\n\t\t \t\t\tsetState(30)\n\t\t \t\t\ttry match(ShellParser.Tokens.THEN.rawValue)\n\t\t \t\t\tsetState(32)\n\t\t \t\t\ttry _errHandler.sync(self)\n\t\t \t\t\t_la = try _input.LA(1)\n\t\t \t\t\tif (((Int64(_la) & ~0x3f) == 0 && ((Int64(1) << _la) & 33554704) != 0)) {\n\t\t \t\t\t\tsetState(31)\n\t\t \t\t\t\ttry cmds()\n\n\t\t \t\t\t}\n\n\n\n\t\t \t\t\tsetState(38)\n\t\t \t\t\ttry _errHandler.sync(self)\n\t\t \t\t\t_la = try _input.LA(1)\n\t\t \t\t}\n\t\t \t\tsetState(43)\n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_la = try _input.LA(1)\n\t\t \t\tif (_la == ShellParser.Tokens.ELSE.rawValue) {\n\t\t \t\t\tsetState(39)\n\t\t \t\t\ttry match(ShellParser.Tokens.ELSE.rawValue)\n\t\t \t\t\tsetState(41)\n\t\t \t\t\ttry _errHandler.sync(self)\n\t\t \t\t\t_la = try _input.LA(1)\n\t\t \t\t\tif (((Int64(_la) & ~0x3f) == 0 && ((Int64(1) << _la) & 33554704) != 0)) {\n\t\t \t\t\t\tsetState(40)\n\t\t \t\t\t\ttry cmds()\n\n\t\t \t\t\t}\n\n\n\t\t \t\t}\n\n\t\t \t\tsetState(45)\n\t\t \t\ttry match(ShellParser.Tokens.END.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 2:\n\t\t \t\t_localctx =  SeqContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 2)\n\t\t \t\tsetState(47)\n\t\t \t\ttry cmd(0)\n\t\t \t\tsetState(49); \n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_alt = 1;\n\t\t \t\trepeat {\n\t\t \t\t\tswitch (_alt) {\n\t\t \t\t\tcase 1:\n\t\t \t\t\t\tsetState(48)\n\t\t \t\t\t\t_la = try _input.LA(1)\n\t\t \t\t\t\tif (!(_la == ShellParser.Tokens.SEMICOLON.rawValue || _la == ShellParser.Tokens.NL.rawValue)) {\n\t\t \t\t\t\ttry _errHandler.recoverInline(self)\n\t\t \t\t\t\t}\n\t\t \t\t\t\telse {\n\t\t \t\t\t\t\t_errHandler.reportMatch(self)\n\t\t \t\t\t\t\ttry consume()\n\t\t \t\t\t\t}\n\n\n\t\t \t\t\t\tbreak\n\t\t \t\t\tdefault:\n\t\t \t\t\t\tthrow ANTLRException.recognition(e: NoViableAltException(self))\n\t\t \t\t\t}\n\t\t \t\t\tsetState(51); \n\t\t \t\t\ttry _errHandler.sync(self)\n\t\t \t\t\t_alt = try getInterpreter().adaptivePredict(_input,7,_ctx)\n\t\t \t\t} while (_alt != 2 && _alt !=  ATN.INVALID_ALT_NUMBER)\n\t\t \t\tsetState(56)\n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_alt = try getInterpreter().adaptivePredict(_input,8,_ctx)\n\t\t \t\twhile (_alt != 1 && _alt != ATN.INVALID_ALT_NUMBER) {\n\t\t \t\t\tif ( _alt==1+1 ) {\n\t\t \t\t\t\tsetState(53)\n\t\t \t\t\t\ttry cmds()\n\n\t\t \t\t \n\t\t \t\t\t}\n\t\t \t\t\tsetState(58)\n\t\t \t\t\ttry _errHandler.sync(self)\n\t\t \t\t\t_alt = try getInterpreter().adaptivePredict(_input,8,_ctx)\n\t\t \t\t}\n\n\t\t \t\tbreak\n\t\t \tcase 3:\n\t\t \t\t_localctx =  SeqContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 3)\n\t\t \t\tsetState(59)\n\t\t \t\ttry cmd(0)\n\n\t\t \t\tbreak\n\t\t \tdefault: break\n\t\t \t}\n\t\t}\n\t\tcatch ANTLRException.recognition(let re) {\n\t\t\t_localctx.exception = re\n\t\t\t_errHandler.reportError(self, re)\n\t\t\ttry _errHandler.recover(self, re)\n\t\t}\n\n\t\treturn _localctx\n\t}\n\n\n\tpublic class CmdContext: ParserRuleContext {\n\t\toverride open\n\t\tfunc getRuleIndex() -> Int {\n\t\t\treturn ShellParser.RULE_cmd\n\t\t}\n\t}\n\tpublic class ArgsContext: CmdContext {\n\t\t\topen\n\t\t\tfunc WORD() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.WORD.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc arg() -> [ArgContext] {\n\t\t\t\treturn getRuleContexts(ArgContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc arg(_ i: Int) -> ArgContext? {\n\t\t\t\treturn getRuleContext(ArgContext.self, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: CmdContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class CmdErrorContext: CmdContext {\n\t\t\topen\n\t\t\tfunc LPAR() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.LPAR.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds() -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.RPAR.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.RPAR.rawValue, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: CmdContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class OrContext: CmdContext {\n\t\t\topen\n\t\t\tfunc cmd() -> [CmdContext] {\n\t\t\t\treturn getRuleContexts(CmdContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmd(_ i: Int) -> CmdContext? {\n\t\t\t\treturn getRuleContext(CmdContext.self, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc OR() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.OR.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.NL.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.NL.rawValue, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: CmdContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class ParensContext: CmdContext {\n\t\t\topen\n\t\t\tfunc LPAR() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.LPAR.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds() -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.RPAR.rawValue, 0)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: CmdContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class AndContext: CmdContext {\n\t\t\topen\n\t\t\tfunc cmd() -> [CmdContext] {\n\t\t\t\treturn getRuleContexts(CmdContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmd(_ i: Int) -> CmdContext? {\n\t\t\t\treturn getRuleContext(CmdContext.self, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc AND() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.AND.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.NL.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.NL.rawValue, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: CmdContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class PipeContext: CmdContext {\n\t\t\topen\n\t\t\tfunc cmd() -> [CmdContext] {\n\t\t\t\treturn getRuleContexts(CmdContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmd(_ i: Int) -> CmdContext? {\n\t\t\t\treturn getRuleContext(CmdContext.self, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc PIPE() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.PIPE.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.NL.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc NL(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.NL.rawValue, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: CmdContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\n\t public final  func cmd( ) throws -> CmdContext   {\n\t\treturn try cmd(0)\n\t}\n\t@discardableResult\n\tprivate func cmd(_ _p: Int) throws -> CmdContext   {\n\t\tlet _parentctx: ParserRuleContext? = _ctx\n\t\tlet _parentState: Int = getState()\n\t\tvar _localctx: CmdContext\n\t\t_localctx = CmdContext(_ctx, _parentState)\n\t\tlet _startState: Int = 4\n\t\ttry enterRecursionRule(_localctx, 4, ShellParser.RULE_cmd, _p)\n\t\tvar _la: Int = 0\n\t\tdefer {\n\t    \t\ttry! unrollRecursionContexts(_parentctx)\n\t    }\n\t\tdo {\n\t\t\tvar _alt: Int\n\t\t\ttry enterOuterAlt(_localctx, 1)\n\t\t\tsetState(84)\n\t\t\ttry _errHandler.sync(self)\n\t\t\tswitch(try getInterpreter().adaptivePredict(_input,11, _ctx)) {\n\t\t\tcase 1:\n\t\t\t\t_localctx = ArgsContext(_localctx)\n\t\t\t\t_ctx = _localctx\n\n\t\t\t\tsetState(63)\n\t\t\t\ttry match(ShellParser.Tokens.WORD.rawValue)\n\t\t\t\tsetState(67)\n\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t_alt = try getInterpreter().adaptivePredict(_input,10,_ctx)\n\t\t\t\twhile (_alt != 2 && _alt != ATN.INVALID_ALT_NUMBER) {\n\t\t\t\t\tif ( _alt==1 ) {\n\t\t\t\t\t\tsetState(64)\n\t\t\t\t\t\ttry arg()\n\n\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t\tsetState(69)\n\t\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t\t_alt = try getInterpreter().adaptivePredict(_input,10,_ctx)\n\t\t\t\t}\n\n\t\t\t\tbreak\n\t\t\tcase 2:\n\t\t\t\t_localctx = ParensContext(_localctx)\n\t\t\t\t_ctx = _localctx\n\t\t\t\tsetState(70)\n\t\t\t\ttry match(ShellParser.Tokens.LPAR.rawValue)\n\t\t\t\tsetState(71)\n\t\t\t\ttry cmds()\n\t\t\t\tsetState(72)\n\t\t\t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\n\t\t\t\tbreak\n\t\t\tcase 3:\n\t\t\t\t_localctx = CmdErrorContext(_localctx)\n\t\t\t\t_ctx = _localctx\n\t\t\t\tsetState(74)\n\t\t\t\ttry match(ShellParser.Tokens.LPAR.rawValue)\n\t\t\t\tsetState(75)\n\t\t\t\ttry cmds()\n\t\t\t\tsetState(76)\n\t\t\t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\t\t\t\tsetState(77)\n\t\t\t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\t\t\t\tnotifyErrorListeners(\"Unbalanced parenthesis\")\n\n\t\t\t\tbreak\n\t\t\tcase 4:\n\t\t\t\t_localctx = CmdErrorContext(_localctx)\n\t\t\t\t_ctx = _localctx\n\t\t\t\tsetState(80)\n\t\t\t\ttry match(ShellParser.Tokens.LPAR.rawValue)\n\t\t\t\tsetState(81)\n\t\t\t\ttry cmds()\n\t\t\t\tnotifyErrorListeners(\"Unbalanced parenthesis\")\n\n\t\t\t\tbreak\n\t\t\tdefault: break\n\t\t\t}\n\t\t\t_ctx!.stop = try _input.LT(-1)\n\t\t\tsetState(115)\n\t\t\ttry _errHandler.sync(self)\n\t\t\t_alt = try getInterpreter().adaptivePredict(_input,16,_ctx)\n\t\t\twhile (_alt != 2 && _alt != ATN.INVALID_ALT_NUMBER) {\n\t\t\t\tif ( _alt==1 ) {\n\t\t\t\t\tif _parseListeners != nil {\n\t\t\t\t\t   try triggerExitRuleEvent()\n\t\t\t\t\t}\n\t\t\t\t\tsetState(113)\n\t\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t\tswitch(try getInterpreter().adaptivePredict(_input,15, _ctx)) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t_localctx = PipeContext(  CmdContext(_parentctx, _parentState))\n\t\t\t\t\t\ttry pushNewRecursionContext(_localctx, _startState, ShellParser.RULE_cmd)\n\t\t\t\t\t\tsetState(86)\n\t\t\t\t\t\tif (!(precpred(_ctx, 6))) {\n\t\t\t\t\t\t    throw ANTLRException.recognition(e:FailedPredicateException(self, \"precpred(_ctx, 6)\"))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetState(90)\n\t\t\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t\t\t_la = try _input.LA(1)\n\t\t\t\t\t\twhile (_la == ShellParser.Tokens.NL.rawValue) {\n\t\t\t\t\t\t\tsetState(87)\n\t\t\t\t\t\t\ttry match(ShellParser.Tokens.NL.rawValue)\n\n\n\t\t\t\t\t\t\tsetState(92)\n\t\t\t\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t\t\t\t_la = try _input.LA(1)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetState(93)\n\t\t\t\t\t\ttry match(ShellParser.Tokens.PIPE.rawValue)\n\t\t\t\t\t\tsetState(94)\n\t\t\t\t\t\ttry cmd(7)\n\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t_localctx = AndContext(  CmdContext(_parentctx, _parentState))\n\t\t\t\t\t\ttry pushNewRecursionContext(_localctx, _startState, ShellParser.RULE_cmd)\n\t\t\t\t\t\tsetState(95)\n\t\t\t\t\t\tif (!(precpred(_ctx, 5))) {\n\t\t\t\t\t\t    throw ANTLRException.recognition(e:FailedPredicateException(self, \"precpred(_ctx, 5)\"))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetState(99)\n\t\t\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t\t\t_la = try _input.LA(1)\n\t\t\t\t\t\twhile (_la == ShellParser.Tokens.NL.rawValue) {\n\t\t\t\t\t\t\tsetState(96)\n\t\t\t\t\t\t\ttry match(ShellParser.Tokens.NL.rawValue)\n\n\n\t\t\t\t\t\t\tsetState(101)\n\t\t\t\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t\t\t\t_la = try _input.LA(1)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetState(102)\n\t\t\t\t\t\ttry match(ShellParser.Tokens.AND.rawValue)\n\t\t\t\t\t\tsetState(103)\n\t\t\t\t\t\ttry cmd(6)\n\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\t_localctx = OrContext(  CmdContext(_parentctx, _parentState))\n\t\t\t\t\t\ttry pushNewRecursionContext(_localctx, _startState, ShellParser.RULE_cmd)\n\t\t\t\t\t\tsetState(104)\n\t\t\t\t\t\tif (!(precpred(_ctx, 4))) {\n\t\t\t\t\t\t    throw ANTLRException.recognition(e:FailedPredicateException(self, \"precpred(_ctx, 4)\"))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetState(108)\n\t\t\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t\t\t_la = try _input.LA(1)\n\t\t\t\t\t\twhile (_la == ShellParser.Tokens.NL.rawValue) {\n\t\t\t\t\t\t\tsetState(105)\n\t\t\t\t\t\t\ttry match(ShellParser.Tokens.NL.rawValue)\n\n\n\t\t\t\t\t\t\tsetState(110)\n\t\t\t\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t\t\t\t_la = try _input.LA(1)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetState(111)\n\t\t\t\t\t\ttry match(ShellParser.Tokens.OR.rawValue)\n\t\t\t\t\t\tsetState(112)\n\t\t\t\t\t\ttry cmd(5)\n\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault: break\n\t\t\t\t\t}\n\t\t\t \n\t\t\t\t}\n\t\t\t\tsetState(117)\n\t\t\t\ttry _errHandler.sync(self)\n\t\t\t\t_alt = try getInterpreter().adaptivePredict(_input,16,_ctx)\n\t\t\t}\n\n\t\t}\n\t\tcatch ANTLRException.recognition(let re) {\n\t\t\t_localctx.exception = re\n\t\t\t_errHandler.reportError(self, re)\n\t\t\ttry _errHandler.recover(self, re)\n\t\t}\n\n\t\treturn _localctx;\n\t}\n\n\tpublic class ArgContext: ParserRuleContext {\n\t\toverride open\n\t\tfunc getRuleIndex() -> Int {\n\t\t\treturn ShellParser.RULE_arg\n\t\t}\n\t}\n\tpublic class WordContext: ArgContext {\n\t\t\topen\n\t\t\tfunc ARG() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.ARG.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc WORD() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.WORD.rawValue, 0)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: ArgContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class SubstitutionContext: ArgContext {\n\t\t\topen\n\t\t\tfunc INTERPOLATION_START() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.INTERPOLATION_START.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds() -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.RPAR.rawValue, 0)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: ArgContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class ArgErrorContext: ArgContext {\n\t\t\topen\n\t\t\tfunc LDQUOTE() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.LDQUOTE.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RDQUOTE() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.RDQUOTE.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RDQUOTE(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.RDQUOTE.rawValue, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc dStringFragment() -> [DStringFragmentContext] {\n\t\t\t\treturn getRuleContexts(DStringFragmentContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc dStringFragment(_ i: Int) -> DStringFragmentContext? {\n\t\t\t\treturn getRuleContext(DStringFragmentContext.self, i)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc INTERPOLATION_START() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.INTERPOLATION_START.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds() -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.RPAR.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.RPAR.rawValue, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: ArgContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class SQuotedStringContext: ArgContext {\n\t\t\topen\n\t\t\tfunc SINGLE_QUOTED_STRING() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.SINGLE_QUOTED_STRING.rawValue, 0)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: ArgContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class DQuotedStringContext: ArgContext {\n\t\t\topen\n\t\t\tfunc LDQUOTE() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.LDQUOTE.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RDQUOTE() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.RDQUOTE.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc dStringFragment() -> [DStringFragmentContext] {\n\t\t\t\treturn getRuleContexts(DStringFragmentContext.self)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc dStringFragment(_ i: Int) -> DStringFragmentContext? {\n\t\t\t\treturn getRuleContext(DStringFragmentContext.self, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: ArgContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\t@discardableResult\n\t open func arg() throws -> ArgContext {\n\t\tvar _localctx: ArgContext\n\t\t_localctx = ArgContext(_ctx, getState())\n\t\ttry enterRule(_localctx, 6, ShellParser.RULE_arg)\n\t\tvar _la: Int = 0\n\t\tdefer {\n\t    \t\ttry! exitRule()\n\t    }\n\t\tdo {\n\t\t\tvar _alt:Int\n\t\t \tsetState(161)\n\t\t \ttry _errHandler.sync(self)\n\t\t \tswitch(try getInterpreter().adaptivePredict(_input,20, _ctx)) {\n\t\t \tcase 1:\n\t\t \t\t_localctx =  WordContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 1)\n\t\t \t\tsetState(118)\n\t\t \t\ttry match(ShellParser.Tokens.ARG.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 2:\n\t\t \t\t_localctx =  WordContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 2)\n\t\t \t\tsetState(119)\n\t\t \t\ttry match(ShellParser.Tokens.WORD.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 3:\n\t\t \t\t_localctx =  SQuotedStringContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 3)\n\t\t \t\tsetState(120)\n\t\t \t\ttry match(ShellParser.Tokens.SINGLE_QUOTED_STRING.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 4:\n\t\t \t\t_localctx =  DQuotedStringContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 4)\n\t\t \t\tsetState(121)\n\t\t \t\ttry match(ShellParser.Tokens.LDQUOTE.rawValue)\n\t\t \t\tsetState(125)\n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_la = try _input.LA(1)\n\t\t \t\twhile (((Int64(_la) & ~0x3f) == 0 && ((Int64(1) << _la) & 15032385536) != 0)) {\n\t\t \t\t\tsetState(122)\n\t\t \t\t\ttry dStringFragment()\n\n\n\t\t \t\t\tsetState(127)\n\t\t \t\t\ttry _errHandler.sync(self)\n\t\t \t\t\t_la = try _input.LA(1)\n\t\t \t\t}\n\t\t \t\tsetState(128)\n\t\t \t\ttry match(ShellParser.Tokens.RDQUOTE.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 5:\n\t\t \t\t_localctx =  SubstitutionContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 5)\n\t\t \t\tsetState(129)\n\t\t \t\ttry match(ShellParser.Tokens.INTERPOLATION_START.rawValue)\n\t\t \t\tsetState(130)\n\t\t \t\ttry cmds()\n\t\t \t\tsetState(131)\n\t\t \t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 6:\n\t\t \t\t_localctx =  ArgErrorContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 6)\n\t\t \t\tsetState(133)\n\t\t \t\ttry match(ShellParser.Tokens.LDQUOTE.rawValue)\n\t\t \t\tsetState(137)\n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_la = try _input.LA(1)\n\t\t \t\twhile (((Int64(_la) & ~0x3f) == 0 && ((Int64(1) << _la) & 15032385536) != 0)) {\n\t\t \t\t\tsetState(134)\n\t\t \t\t\ttry dStringFragment()\n\n\n\t\t \t\t\tsetState(139)\n\t\t \t\t\ttry _errHandler.sync(self)\n\t\t \t\t\t_la = try _input.LA(1)\n\t\t \t\t}\n\t\t \t\tsetState(140)\n\t\t \t\ttry match(ShellParser.Tokens.RDQUOTE.rawValue)\n\t\t \t\tsetState(141)\n\t\t \t\ttry match(ShellParser.Tokens.RDQUOTE.rawValue)\n\t\t \t\tnotifyErrorListeners(\"Unbalanced quotes\")\n\n\t\t \t\tbreak\n\t\t \tcase 7:\n\t\t \t\t_localctx =  ArgErrorContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 7)\n\t\t \t\tsetState(143)\n\t\t \t\ttry match(ShellParser.Tokens.LDQUOTE.rawValue)\n\t\t \t\tsetState(147)\n\t\t \t\ttry _errHandler.sync(self)\n\t\t \t\t_alt = try getInterpreter().adaptivePredict(_input,19,_ctx)\n\t\t \t\twhile (_alt != 2 && _alt != ATN.INVALID_ALT_NUMBER) {\n\t\t \t\t\tif ( _alt==1 ) {\n\t\t \t\t\t\tsetState(144)\n\t\t \t\t\t\ttry dStringFragment()\n\n\t\t \t\t \n\t\t \t\t\t}\n\t\t \t\t\tsetState(149)\n\t\t \t\t\ttry _errHandler.sync(self)\n\t\t \t\t\t_alt = try getInterpreter().adaptivePredict(_input,19,_ctx)\n\t\t \t\t}\n\t\t \t\tnotifyErrorListeners(\"Unbalanced quotes\")\n\n\t\t \t\tbreak\n\t\t \tcase 8:\n\t\t \t\t_localctx =  ArgErrorContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 8)\n\t\t \t\tsetState(151)\n\t\t \t\ttry match(ShellParser.Tokens.INTERPOLATION_START.rawValue)\n\t\t \t\tsetState(152)\n\t\t \t\ttry cmds()\n\t\t \t\tsetState(153)\n\t\t \t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\t\t \t\tsetState(154)\n\t\t \t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\t\t \t\tnotifyErrorListeners(\"Unbalanced parenthesis\")\n\n\t\t \t\tbreak\n\t\t \tcase 9:\n\t\t \t\t_localctx =  ArgErrorContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 9)\n\t\t \t\tsetState(157)\n\t\t \t\ttry match(ShellParser.Tokens.INTERPOLATION_START.rawValue)\n\t\t \t\tsetState(158)\n\t\t \t\ttry cmds()\n\t\t \t\tnotifyErrorListeners(\"Unbalanced parenthesis\")\n\n\t\t \t\tbreak\n\t\t \tdefault: break\n\t\t \t}\n\t\t}\n\t\tcatch ANTLRException.recognition(let re) {\n\t\t\t_localctx.exception = re\n\t\t\t_errHandler.reportError(self, re)\n\t\t\ttry _errHandler.recover(self, re)\n\t\t}\n\n\t\treturn _localctx\n\t}\n\n\tpublic class DStringFragmentContext: ParserRuleContext {\n\t\toverride open\n\t\tfunc getRuleIndex() -> Int {\n\t\t\treturn ShellParser.RULE_dStringFragment\n\t\t}\n\t}\n\tpublic class InterpolationContext: DStringFragmentContext {\n\t\t\topen\n\t\t\tfunc INTERPOLATION_START_IN_DSTRING() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.INTERPOLATION_START_IN_DSTRING.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds() -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.RPAR.rawValue, 0)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: DStringFragmentContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class DStringFragmentErrorContext: DStringFragmentContext {\n\t\t\topen\n\t\t\tfunc INTERPOLATION_START_IN_DSTRING() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.INTERPOLATION_START_IN_DSTRING.rawValue, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc cmds() -> CmdsContext? {\n\t\t\t\treturn getRuleContext(CmdsContext.self, 0)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR() -> [TerminalNode] {\n\t\t\t\treturn getTokens(ShellParser.Tokens.RPAR.rawValue)\n\t\t\t}\n\t\t\topen\n\t\t\tfunc RPAR(_ i:Int) -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.RPAR.rawValue, i)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: DStringFragmentContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class EscapeSequenceContext: DStringFragmentContext {\n\t\t\topen\n\t\t\tfunc ESCAPE_SEQUENCE() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.ESCAPE_SEQUENCE.rawValue, 0)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: DStringFragmentContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\tpublic class TextContext: DStringFragmentContext {\n\t\t\topen\n\t\t\tfunc TEXT() -> TerminalNode? {\n\t\t\t\treturn getToken(ShellParser.Tokens.TEXT.rawValue, 0)\n\t\t\t}\n\n\t\tpublic\n\t\tinit(_ ctx: DStringFragmentContext) {\n\t\t\tsuper.init()\n\t\t\tcopyFrom(ctx)\n\t\t}\n\t}\n\t@discardableResult\n\t open func dStringFragment() throws -> DStringFragmentContext {\n\t\tvar _localctx: DStringFragmentContext\n\t\t_localctx = DStringFragmentContext(_ctx, getState())\n\t\ttry enterRule(_localctx, 8, ShellParser.RULE_dStringFragment)\n\t\tdefer {\n\t    \t\ttry! exitRule()\n\t    }\n\t\tdo {\n\t\t \tsetState(179)\n\t\t \ttry _errHandler.sync(self)\n\t\t \tswitch(try getInterpreter().adaptivePredict(_input,21, _ctx)) {\n\t\t \tcase 1:\n\t\t \t\t_localctx =  TextContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 1)\n\t\t \t\tsetState(163)\n\t\t \t\ttry match(ShellParser.Tokens.TEXT.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 2:\n\t\t \t\t_localctx =  EscapeSequenceContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 2)\n\t\t \t\tsetState(164)\n\t\t \t\ttry match(ShellParser.Tokens.ESCAPE_SEQUENCE.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 3:\n\t\t \t\t_localctx =  InterpolationContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 3)\n\t\t \t\tsetState(165)\n\t\t \t\ttry match(ShellParser.Tokens.INTERPOLATION_START_IN_DSTRING.rawValue)\n\t\t \t\tsetState(166)\n\t\t \t\ttry cmds()\n\t\t \t\tsetState(167)\n\t\t \t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\n\t\t \t\tbreak\n\t\t \tcase 4:\n\t\t \t\t_localctx =  DStringFragmentErrorContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 4)\n\t\t \t\tsetState(169)\n\t\t \t\ttry match(ShellParser.Tokens.INTERPOLATION_START_IN_DSTRING.rawValue)\n\t\t \t\tsetState(170)\n\t\t \t\ttry cmds()\n\t\t \t\tsetState(171)\n\t\t \t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\t\t \t\tsetState(172)\n\t\t \t\ttry match(ShellParser.Tokens.RPAR.rawValue)\n\t\t \t\tnotifyErrorListeners(\"Unbalanced parenthesis\")\n\n\t\t \t\tbreak\n\t\t \tcase 5:\n\t\t \t\t_localctx =  DStringFragmentErrorContext(_localctx);\n\t\t \t\ttry enterOuterAlt(_localctx, 5)\n\t\t \t\tsetState(175)\n\t\t \t\ttry match(ShellParser.Tokens.INTERPOLATION_START_IN_DSTRING.rawValue)\n\t\t \t\tsetState(176)\n\t\t \t\ttry cmds()\n\t\t \t\tnotifyErrorListeners(\"Unbalanced parenthesis\")\n\n\t\t \t\tbreak\n\t\t \tdefault: break\n\t\t \t}\n\t\t}\n\t\tcatch ANTLRException.recognition(let re) {\n\t\t\t_localctx.exception = re\n\t\t\t_errHandler.reportError(self, re)\n\t\t\ttry _errHandler.recover(self, re)\n\t\t}\n\n\t\treturn _localctx\n\t}\n\n\toverride open\n\tfunc sempred(_ _localctx: RuleContext?, _ ruleIndex: Int,  _ predIndex: Int)throws -> Bool {\n\t\tswitch (ruleIndex) {\n\t\tcase  2:\n\t\t\treturn try cmd_sempred(_localctx?.castdown(CmdContext.self), predIndex)\n\t    default: return true\n\t\t}\n\t}\n\tprivate func cmd_sempred(_ _localctx: CmdContext!,  _ predIndex: Int) throws -> Bool {\n\t\tswitch (predIndex) {\n\t\t    case 0:return precpred(_ctx, 6)\n\t\t    case 1:return precpred(_ctx, 5)\n\t\t    case 2:return precpred(_ctx, 4)\n\t\t    default: return true\n\t\t}\n\t}\n\n\tstatic let _serializedATN:[Int] = [\n\t\t4,1,34,182,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,1,0,5,0,12,8,0,10,0,\n\t\t12,0,15,9,0,1,0,1,0,1,0,1,0,3,0,21,8,0,1,1,1,1,1,1,1,1,3,1,27,8,1,1,1,\n\t\t1,1,1,1,1,1,3,1,33,8,1,5,1,35,8,1,10,1,12,1,38,9,1,1,1,1,1,3,1,42,8,1,\n\t\t3,1,44,8,1,1,1,1,1,1,1,1,1,4,1,50,8,1,11,1,12,1,51,1,1,5,1,55,8,1,10,1,\n\t\t12,1,58,9,1,1,1,3,1,61,8,1,1,2,1,2,1,2,5,2,66,8,2,10,2,12,2,69,9,2,1,2,\n\t\t1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,3,2,85,8,2,1,2,1,2,\n\t\t5,2,89,8,2,10,2,12,2,92,9,2,1,2,1,2,1,2,1,2,5,2,98,8,2,10,2,12,2,101,9,\n\t\t2,1,2,1,2,1,2,1,2,5,2,107,8,2,10,2,12,2,110,9,2,1,2,1,2,5,2,114,8,2,10,\n\t\t2,12,2,117,9,2,1,3,1,3,1,3,1,3,1,3,5,3,124,8,3,10,3,12,3,127,9,3,1,3,1,\n\t\t3,1,3,1,3,1,3,1,3,1,3,5,3,136,8,3,10,3,12,3,139,9,3,1,3,1,3,1,3,1,3,1,\n\t\t3,5,3,146,8,3,10,3,12,3,149,9,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,\n\t\t3,1,3,3,3,162,8,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,\n\t\t1,4,1,4,1,4,3,4,180,8,4,1,4,1,56,1,4,5,0,2,4,6,8,0,1,1,0,23,24,212,0,13,\n\t\t1,0,0,0,2,60,1,0,0,0,4,84,1,0,0,0,6,161,1,0,0,0,8,179,1,0,0,0,10,12,5,\n\t\t24,0,0,11,10,1,0,0,0,12,15,1,0,0,0,13,11,1,0,0,0,13,14,1,0,0,0,14,20,1,\n\t\t0,0,0,15,13,1,0,0,0,16,17,3,2,1,0,17,18,5,0,0,1,18,21,1,0,0,0,19,21,5,\n\t\t0,0,1,20,16,1,0,0,0,20,19,1,0,0,0,21,1,1,0,0,0,22,23,5,8,0,0,23,24,3,4,\n\t\t2,0,24,26,5,12,0,0,25,27,3,2,1,0,26,25,1,0,0,0,26,27,1,0,0,0,27,36,1,0,\n\t\t0,0,28,29,5,7,0,0,29,30,3,4,2,0,30,32,5,12,0,0,31,33,3,2,1,0,32,31,1,0,\n\t\t0,0,32,33,1,0,0,0,33,35,1,0,0,0,34,28,1,0,0,0,35,38,1,0,0,0,36,34,1,0,\n\t\t0,0,36,37,1,0,0,0,37,43,1,0,0,0,38,36,1,0,0,0,39,41,5,13,0,0,40,42,3,2,\n\t\t1,0,41,40,1,0,0,0,41,42,1,0,0,0,42,44,1,0,0,0,43,39,1,0,0,0,43,44,1,0,\n\t\t0,0,44,45,1,0,0,0,45,46,5,18,0,0,46,61,1,0,0,0,47,49,3,4,2,0,48,50,7,0,\n\t\t0,0,49,48,1,0,0,0,50,51,1,0,0,0,51,49,1,0,0,0,51,52,1,0,0,0,52,56,1,0,\n\t\t0,0,53,55,3,2,1,0,54,53,1,0,0,0,55,58,1,0,0,0,56,57,1,0,0,0,56,54,1,0,\n\t\t0,0,57,61,1,0,0,0,58,56,1,0,0,0,59,61,3,4,2,0,60,22,1,0,0,0,60,47,1,0,\n\t\t0,0,60,59,1,0,0,0,61,3,1,0,0,0,62,63,6,2,-1,0,63,67,5,25,0,0,64,66,3,6,\n\t\t3,0,65,64,1,0,0,0,66,69,1,0,0,0,67,65,1,0,0,0,67,68,1,0,0,0,68,85,1,0,\n\t\t0,0,69,67,1,0,0,0,70,71,5,4,0,0,71,72,3,2,1,0,72,73,5,6,0,0,73,85,1,0,\n\t\t0,0,74,75,5,4,0,0,75,76,3,2,1,0,76,77,5,6,0,0,77,78,5,6,0,0,78,79,6,2,\n\t\t-1,0,79,85,1,0,0,0,80,81,5,4,0,0,81,82,3,2,1,0,82,83,6,2,-1,0,83,85,1,\n\t\t0,0,0,84,62,1,0,0,0,84,70,1,0,0,0,84,74,1,0,0,0,84,80,1,0,0,0,85,115,1,\n\t\t0,0,0,86,90,10,6,0,0,87,89,5,24,0,0,88,87,1,0,0,0,89,92,1,0,0,0,90,88,\n\t\t1,0,0,0,90,91,1,0,0,0,91,93,1,0,0,0,92,90,1,0,0,0,93,94,5,21,0,0,94,114,\n\t\t3,4,2,7,95,99,10,5,0,0,96,98,5,24,0,0,97,96,1,0,0,0,98,101,1,0,0,0,99,\n\t\t97,1,0,0,0,99,100,1,0,0,0,100,102,1,0,0,0,101,99,1,0,0,0,102,103,5,20,\n\t\t0,0,103,114,3,4,2,6,104,108,10,4,0,0,105,107,5,24,0,0,106,105,1,0,0,0,\n\t\t107,110,1,0,0,0,108,106,1,0,0,0,108,109,1,0,0,0,109,111,1,0,0,0,110,108,\n\t\t1,0,0,0,111,112,5,22,0,0,112,114,3,4,2,5,113,86,1,0,0,0,113,95,1,0,0,0,\n\t\t113,104,1,0,0,0,114,117,1,0,0,0,115,113,1,0,0,0,115,116,1,0,0,0,116,5,\n\t\t1,0,0,0,117,115,1,0,0,0,118,162,5,26,0,0,119,162,5,25,0,0,120,162,5,2,\n\t\t0,0,121,125,5,3,0,0,122,124,3,8,4,0,123,122,1,0,0,0,124,127,1,0,0,0,125,\n\t\t123,1,0,0,0,125,126,1,0,0,0,126,128,1,0,0,0,127,125,1,0,0,0,128,162,5,\n\t\t34,0,0,129,130,5,5,0,0,130,131,3,2,1,0,131,132,5,6,0,0,132,162,1,0,0,0,\n\t\t133,137,5,3,0,0,134,136,3,8,4,0,135,134,1,0,0,0,136,139,1,0,0,0,137,135,\n\t\t1,0,0,0,137,138,1,0,0,0,138,140,1,0,0,0,139,137,1,0,0,0,140,141,5,34,0,\n\t\t0,141,142,5,34,0,0,142,162,6,3,-1,0,143,147,5,3,0,0,144,146,3,8,4,0,145,\n\t\t144,1,0,0,0,146,149,1,0,0,0,147,145,1,0,0,0,147,148,1,0,0,0,148,150,1,\n\t\t0,0,0,149,147,1,0,0,0,150,162,6,3,-1,0,151,152,5,5,0,0,152,153,3,2,1,0,\n\t\t153,154,5,6,0,0,154,155,5,6,0,0,155,156,6,3,-1,0,156,162,1,0,0,0,157,158,\n\t\t5,5,0,0,158,159,3,2,1,0,159,160,6,3,-1,0,160,162,1,0,0,0,161,118,1,0,0,\n\t\t0,161,119,1,0,0,0,161,120,1,0,0,0,161,121,1,0,0,0,161,129,1,0,0,0,161,\n\t\t133,1,0,0,0,161,143,1,0,0,0,161,151,1,0,0,0,161,157,1,0,0,0,162,7,1,0,\n\t\t0,0,163,180,5,31,0,0,164,180,5,33,0,0,165,166,5,32,0,0,166,167,3,2,1,0,\n\t\t167,168,5,6,0,0,168,180,1,0,0,0,169,170,5,32,0,0,170,171,3,2,1,0,171,172,\n\t\t5,6,0,0,172,173,5,6,0,0,173,174,6,4,-1,0,174,180,1,0,0,0,175,176,5,32,\n\t\t0,0,176,177,3,2,1,0,177,178,6,4,-1,0,178,180,1,0,0,0,179,163,1,0,0,0,179,\n\t\t164,1,0,0,0,179,165,1,0,0,0,179,169,1,0,0,0,179,175,1,0,0,0,180,9,1,0,\n\t\t0,0,22,13,20,26,32,36,41,43,51,56,60,67,84,90,99,108,113,115,125,137,147,\n\t\t161,179\n\t]\n\n\tpublic\n\tstatic let _ATN = try! ATNDeserializer().deserialize(_serializedATN)\n}"
  },
  {
    "path": "Sources/AeroSpaceApp/AeroSpaceApp.swift",
    "content": "import AppBundle\nimport SwiftUI\n\n// This file is shared between SPM and xcode project\n\n@main\nstruct AeroSpaceApp: App {\n    @StateObject var viewModel = TrayMenuModel.shared\n    @StateObject var messageModel = MessageModel.shared\n    @Environment(\\.openWindow) var openWindow: OpenWindowAction\n\n    init() {\n        initAppBundle()\n    }\n\n    var body: some Scene {\n        menuBar(viewModel: viewModel)\n        getMessageWindow(messageModel: messageModel)\n            .onChange(of: messageModel.message) { message in\n                if message != nil {\n                    openWindow(id: messageWindowId)\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/GlobalObserver.swift",
    "content": "import AppKit\nimport Common\n\nenum GlobalObserver {\n    private static func onNotif(_ notification: Notification) {\n        // Third line of defence against lock screen window. See: closedWindowsCache\n        // Second and third lines of defence are technically needed only to avoid potential flickering\n        if (notification.userInfo?[NSWorkspace.applicationUserInfoKey] as? NSRunningApplication)?.bundleIdentifier == lockScreenAppBundleId {\n            return\n        }\n        let notifName = notification.name.rawValue\n        Task { @MainActor in\n            if !TrayMenuModel.shared.isEnabled { return }\n            if notifName == NSWorkspace.didActivateApplicationNotification.rawValue {\n                scheduleRefreshSession(.globalObserver(notifName), optimisticallyPreLayoutWorkspaces: true)\n            } else {\n                scheduleRefreshSession(.globalObserver(notifName))\n            }\n        }\n    }\n\n    private static func onHideApp(_ notification: Notification) {\n        let notifName = notification.name.rawValue\n        Task { @MainActor in\n            guard let token: RunSessionGuard = .isServerEnabled else { return }\n            try await runLightSession(.globalObserver(notifName), token) {\n                if config.automaticallyUnhideMacosHiddenApps {\n                    if let w = prevFocus?.windowOrNil,\n                       w.macAppUnsafe.nsApp.isHidden,\n                       // \"Hide others\" (cmd-alt-h) -> don't force focus\n                       // \"Hide app\" (cmd-h) -> force focus\n                       MacApp.allAppsMap.values.count(where: { $0.nsApp.isHidden }) == 1\n                    {\n                        // Force focus\n                        _ = w.focusWindow()\n                        w.nativeFocus()\n                    }\n                    for app in MacApp.allAppsMap.values {\n                        app.nsApp.unhide()\n                    }\n                }\n            }\n        }\n    }\n\n    @MainActor\n    static func initObserver() {\n        let nc = NSWorkspace.shared.notificationCenter\n        nc.addObserver(forName: NSWorkspace.didLaunchApplicationNotification, object: nil, queue: .main, using: onNotif)\n        nc.addObserver(forName: NSWorkspace.didActivateApplicationNotification, object: nil, queue: .main, using: onNotif)\n        nc.addObserver(forName: NSWorkspace.didHideApplicationNotification, object: nil, queue: .main, using: onHideApp)\n        nc.addObserver(forName: NSWorkspace.didUnhideApplicationNotification, object: nil, queue: .main, using: onNotif)\n        nc.addObserver(forName: NSWorkspace.activeSpaceDidChangeNotification, object: nil, queue: .main, using: onNotif)\n        nc.addObserver(forName: NSWorkspace.didTerminateApplicationNotification, object: nil, queue: .main, using: onNotif)\n\n        NSEvent.addGlobalMonitorForEvents(matching: .leftMouseUp) { _ in\n            // todo reduce number of refreshSession in the callback\n            //  resetManipulatedWithMouseIfPossible might call its own refreshSession\n            //  The end of the callback calls refreshSession\n            Task { @MainActor in\n                guard let token: RunSessionGuard = .isServerEnabled else { return }\n                try await resetManipulatedWithMouseIfPossible()\n                let mouseLocation = mouseLocation\n                let clickedMonitor = mouseLocation.monitorApproximation\n                switch true {\n                    // Detect clicks on desktop of different monitors\n                    case clickedMonitor.activeWorkspace != focus.workspace:\n                        _ = try await runLightSession(.globalObserverLeftMouseUp, token) {\n                            clickedMonitor.activeWorkspace.focusWorkspace()\n                        }\n                    // Detect close button clicks for unfocused windows. Yes, kAXUIElementDestroyedNotification is that unreliable\n                    //  And trigger new window detection that could be delayed due to mouseDown event\n                    default:\n                        scheduleRefreshSession(.globalObserverLeftMouseUp)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/CmdEnv.swift",
    "content": "import Common\n\nstruct CmdEnv: ConvenienceCopyable {\n    var windowId: UInt32?\n    var workspaceName: String?\n\n    static let defaultEnv: CmdEnv = .init()\n    func withFocus(_ focus: LiveFocus) -> CmdEnv {\n        switch focus.asLeaf {\n            case .window(let wd): .defaultEnv.copy(\\.windowId, wd.windowId)\n            case .emptyWorkspace(let ws): .defaultEnv.copy(\\.workspaceName, ws.name)\n        }\n    }\n\n    var asMap: [String: String] {\n        var result = [String: String]()\n        if let windowId {\n            result[AEROSPACE_WINDOW_ID] = windowId.description\n        }\n        if let workspaceName {\n            result[AEROSPACE_WORKSPACE] = workspaceName.description\n        }\n        return result\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/CmdIo.swift",
    "content": "struct CmdStdin: ~Copyable {\n    private var input: String = \"\"\n    init(_ input: String) {\n        self.input = input\n    }\n    static var emptyStdin: CmdStdin { .init(\"\") }\n\n    mutating func readAll() -> String {\n        let result = input\n        input = \"\"\n        return result\n    }\n}\n\nfinal class CmdIo {\n    private var stdin: CmdStdin\n    var stdout: [String] = []\n    var stderr: [String] = []\n\n    init(stdin: consuming CmdStdin) { self.stdin = stdin }\n\n    @discardableResult func out(_ msg: String) -> Bool { stdout.append(msg); return true }\n    @discardableResult func err(_ msg: String) -> Bool { stderr.append(msg); return false }\n    @discardableResult func out(_ msg: [String]) -> Bool { stdout += msg; return true }\n    // periphery:ignore\n    @discardableResult func err(_ msg: [String]) -> Bool { stderr += msg; return false }\n\n    func readStdin() -> String { stdin.readAll() }\n}\n\nstruct CmdResult {\n    let stdout: [String]\n    let stderr: [String]\n    let exitCode: Int32\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/Command.swift",
    "content": "import AppKit\nimport Common\n\nprotocol Command: AeroAny, Equatable, Sendable {\n    associatedtype T where T: CmdArgs\n    var args: T { get }\n    @MainActor\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool\n\n    /// We should reset closedWindowsCache when the command can potentiall change the tree\n    var shouldResetClosedWindowsCache: Bool { get }\n}\n\nextension Command {\n    static func == (lhs: Self, rhs: Self) -> Bool {\n        return lhs.args.equals(rhs.args)\n    }\n\n    nonisolated func equals(_ other: any Command) -> Bool {\n        (other as? Self).flatMap { self == $0 } ?? false\n    }\n}\n\nextension Command {\n    var info: CmdStaticInfo { T.info }\n}\n\nextension Command {\n    @MainActor\n    @discardableResult\n    func run(_ env: CmdEnv, _ stdin: consuming CmdStdin) async throws -> CmdResult {\n        return try await [self].runCmdSeq(env, stdin)\n    }\n\n    var isExec: Bool { self is ExecAndForgetCommand }\n}\n\n// There are 4 entry points for running commands:\n// 1. config keybindings\n// 2. CLI requests to server\n// 3. on-window-detected callback\n// 4. Tray icon buttons\nextension [Command] {\n    @MainActor\n    func runCmdSeq(_ env: CmdEnv, _ io: sending CmdIo) async throws -> Bool {\n        var isSucc = true\n        for command in self {\n            isSucc = try await command.run(env, io) && isSucc\n            if command.shouldResetClosedWindowsCache { resetClosedWindowsCache() }\n            refreshModel()\n        }\n        return isSucc\n    }\n\n    @MainActor\n    func runCmdSeq(_ env: CmdEnv, _ stdin: consuming CmdStdin) async throws -> CmdResult {\n        let io: CmdIo = CmdIo(stdin: stdin)\n        let isSucc = try await runCmdSeq(env, io)\n        return CmdResult(stdout: io.stdout, stderr: io.stderr, exitCode: isSucc ? 0 : 1)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/cmdManifest.swift",
    "content": "import Common\n\nextension CmdArgs {\n    func toCommand() -> any Command {\n        let command: any Command\n        switch Self.info.kind {\n            case .balanceSizes:\n                command = BalanceSizesCommand(args: self as! BalanceSizesCmdArgs)\n            case .close:\n                command = CloseCommand(args: self as! CloseCmdArgs)\n            case .closeAllWindowsButCurrent:\n                command = CloseAllWindowsButCurrentCommand(args: self as! CloseAllWindowsButCurrentCmdArgs)\n            case .config:\n                command = ConfigCommand(args: self as! ConfigCmdArgs)\n            case .debugWindows:\n                command = DebugWindowsCommand(args: self as! DebugWindowsCmdArgs)\n            case .enable:\n                command = EnableCommand(args: self as! EnableCmdArgs)\n            case .execAndForget:\n                die(\"exec-and-forget is parsed separately\")\n            case .flattenWorkspaceTree:\n                command = FlattenWorkspaceTreeCommand(args: self as! FlattenWorkspaceTreeCmdArgs)\n            case .focus:\n                command = FocusCommand(args: self as! FocusCmdArgs)\n            case .focusBackAndForth:\n                command = FocusBackAndForthCommand(args: self as! FocusBackAndForthCmdArgs)\n            case .focusMonitor:\n                command = FocusMonitorCommand(args: self as! FocusMonitorCmdArgs)\n            case .fullscreen:\n                command = FullscreenCommand(args: self as! FullscreenCmdArgs)\n            case .joinWith:\n                command = JoinWithCommand(args: self as! JoinWithCmdArgs)\n            case .layout:\n                command = LayoutCommand(args: self as! LayoutCmdArgs)\n            case .listApps:\n                command = ListAppsCommand(args: self as! ListAppsCmdArgs)\n            case .listExecEnvVars:\n                command = ListExecEnvVarsCommand(args: self as! ListExecEnvVarsCmdArgs)\n            case .listModes:\n                command = ListModesCommand(args: self as! ListModesCmdArgs)\n            case .listMonitors:\n                command = ListMonitorsCommand(args: self as! ListMonitorsCmdArgs)\n            case .listWindows:\n                command = ListWindowsCommand(args: self as! ListWindowsCmdArgs)\n            case .listWorkspaces:\n                command = ListWorkspacesCommand(args: self as! ListWorkspacesCmdArgs)\n            case .macosNativeFullscreen:\n                command = MacosNativeFullscreenCommand(args: self as! MacosNativeFullscreenCmdArgs)\n            case .macosNativeMinimize:\n                command = MacosNativeMinimizeCommand(args: self as! MacosNativeMinimizeCmdArgs)\n            case .mode:\n                command = ModeCommand(args: self as! ModeCmdArgs)\n            case .move:\n                command = MoveCommand(args: self as! MoveCmdArgs)\n            case .moveMouse:\n                command = MoveMouseCommand(args: self as! MoveMouseCmdArgs)\n            case .moveNodeToMonitor:\n                command = MoveNodeToMonitorCommand(args: self as! MoveNodeToMonitorCmdArgs)\n            case .moveNodeToWorkspace:\n                command = MoveNodeToWorkspaceCommand(args: self as! MoveNodeToWorkspaceCmdArgs)\n            case .moveWorkspaceToMonitor:\n                command = MoveWorkspaceToMonitorCommand(args: self as! MoveWorkspaceToMonitorCmdArgs)\n            case .reloadConfig:\n                command = ReloadConfigCommand(args: self as! ReloadConfigCmdArgs)\n            case .resize:\n                command = ResizeCommand(args: self as! ResizeCmdArgs)\n            case .split:\n                command = SplitCommand(args: self as! SplitCmdArgs)\n            case .subscribe:\n                die(\"subscribe is handled separately\")\n            case .summonWorkspace:\n                command = SummonWorkspaceCommand(args: self as! SummonWorkspaceCmdArgs)\n            case .swap:\n                command = SwapCommand(args: self as! SwapCmdArgs)\n            case .triggerBinding:\n                command = TriggerBindingCommand(args: self as! TriggerBindingCmdArgs)\n            case .volume:\n                command = VolumeCommand(args: self as! VolumeCmdArgs)\n            case .workspace:\n                command = WorkspaceCommand(args: self as! WorkspaceCmdArgs)\n            case .workspaceBackAndForth:\n                command = WorkspaceBackAndForthCommand(args: self as! WorkspaceBackAndForthCmdArgs)\n        }\n        check(command.info == Self.info)\n        return command\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/cmdResolveTargetOrReportError.swift",
    "content": "import Common\n\nextension CmdArgs {\n    @MainActor\n    var workspace: Workspace? {\n        if let workspaceName { Workspace.get(byName: workspaceName.raw) } else { nil }\n    }\n\n    @MainActor\n    func resolveTargetOrReportError(_ env: CmdEnv, _ io: CmdIo) -> LiveFocus? {\n        // Flags\n        if let windowId {\n            if let wi = Window.get(byId: windowId) {\n                return wi.toLiveFocusOrReportError(io)\n            } else {\n                io.err(\"Invalid <window-id> \\(windowId) passed to --window-id\")\n                return nil\n            }\n        }\n        if let workspace {\n            return workspace.toLiveFocus()\n        }\n        // Env\n        if let windowId = env.windowId {\n            if let wi = Window.get(byId: windowId) {\n                return wi.toLiveFocusOrReportError(io)\n            } else {\n                io.err(\"Invalid <window-id> \\(windowId) specified in \\(AEROSPACE_WINDOW_ID) env variable\")\n                return nil\n            }\n        }\n        if let wsName = env.workspaceName {\n            return Workspace.get(byName: wsName).toLiveFocus()\n        }\n        // Real Focus\n        return focus\n    }\n}\n\nextension Window {\n    @MainActor\n    func toLiveFocusOrReportError(_ io: CmdIo) -> LiveFocus? {\n        if let result = toLiveFocusOrNil() {\n            return result\n        } else {\n            io.err(\"Window \\(windowId) doesn't belong to any monitor. And thus can't even define a focused workspace\")\n            return nil\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/format.swift",
    "content": "import Common\n\nenum AeroObj {\n    case window(window: Window, title: String)\n    case workspace(Workspace)\n    case app(any AbstractApp)\n    case monitor(Monitor)\n\n    var kind: AeroObjKind {\n        switch self {\n            case .window: .window\n            case .workspace: .workspace\n            case .app: .app\n            case .monitor: .monitor\n        }\n    }\n}\n\nextension [AeroObj] {\n    @MainActor\n    func format(_ format: [StringInterToken]) -> Result<[String], String> {\n        var cellTable: [[Cell<String>]] = []\n        for obj in self {\n            var line: [Cell<String>] = []\n            var curCell: String = \"\"\n            var errors: [String] = []\n            for token in format {\n                switch token {\n                    case .interVar(PlainInterVar.rightPadding.rawValue):\n                        line.append(Cell(value: curCell, rightPadding: true))\n                        curCell = \"\"\n                    case .literal(let literal):\n                        curCell += literal\n                    case .interVar(let value):\n                        switch value.expandFormatVar(obj: obj) {\n                            case .success(let expanded): curCell += expanded.toString()\n                            case .failure(let error): errors.append(error)\n                        }\n                }\n            }\n            if !errors.isEmpty { return .failure(errors.joinErrors()) }\n            line.append(Cell(value: curCell, rightPadding: false))\n            cellTable.append(line)\n        }\n        let result = cellTable\n            .transposed()\n            .map { column in\n                let columndWidth = column.map { $0.value.count }.max().orDie()\n                return column.map {\n                    $0.rightPadding\n                        ? $0.value + String(repeating: \" \", count: columndWidth - $0.value.count)\n                        : $0.value\n                }\n            }\n            .transposed()\n            .map { line in line.joined(separator: \"\") }\n        return .success(result)\n    }\n}\n\nenum Primitive: Encodable {\n    case bool(Bool)\n    case int(Int)\n    case int32(Int32)\n    case uint32(UInt32)\n    case string(String)\n\n    func toString() -> String {\n        switch self {\n            case .bool(let x): x.description\n            case .int(let x): x.description\n            case .int32(let x): x.description\n            case .uint32(let x): x.description\n            case .string(let x): x\n        }\n    }\n\n    func encode(to encoder: any Encoder) throws {\n        let value: Encodable = switch self {\n            case .bool(let x): x\n            case .int(let x): x\n            case .int32(let x): x\n            case .uint32(let x): x\n            case .string(let x): x\n        }\n        var container = encoder.singleValueContainer()\n        try container.encode(value)\n    }\n}\n\nprivate struct Cell<T> {\n    let value: T\n    let rightPadding: Bool\n}\n\nextension String {\n    @MainActor\n    func expandFormatVar(obj: AeroObj) -> Result<Primitive, String> {\n        let formatVar = self.toFormatVar()\n        switch (obj, formatVar) {\n            case (_, .none): break\n\n            case (.window(let w, _), .workspace):\n                return w.nodeWorkspace.flatMap(AeroObj.workspace).map(expandFormatVar) ?? .success(.string(\"NULL-WOKRSPACE\"))\n            case (.window(let w, _), .monitor):\n                return w.nodeMonitor.flatMap(AeroObj.monitor).map(expandFormatVar) ?? .success(.string(\"NULL-MONITOR\"))\n            case (.window(let w, _), .app):\n                return expandFormatVar(obj: .app(w.app))\n            case (.window(_, _), .window): break\n\n            case (.workspace(let ws), .monitor):\n                return expandFormatVar(obj: AeroObj.monitor(ws.workspaceMonitor))\n            case (.workspace, _): break\n\n            case (.app(_), _): break\n            case (.monitor(_), _): break\n        }\n        switch (obj, formatVar) {\n            case (.window(let w, let title), .window(let f)):\n                return switch f {\n                    case .windowId: .success(.uint32(w.windowId))\n                    case .windowIsFullscreen: .success(.bool(w.isFullscreen))\n                    case .windowTitle: .success(.string(title))\n                    case .windowLayout, .windowParentContainerLayout: toLayoutResult(w: w)\n                }\n            case (.workspace(let w), .workspace(let f)):\n                return switch f {\n                    case .workspaceName: .success(.string(w.name))\n                    case .workspaceVisible: .success(.bool(w.isVisible))\n                    case .workspaceFocused: .success(.bool(focus.workspace == w))\n                    case .workspaceRootContainerLayout: .success(.string(toLayoutString(tc: w.rootTilingContainer)))\n                }\n            case (.monitor(let m), .monitor(let f)):\n                return switch f {\n                    case .monitorId_oneBased: .success(m.monitorId_oneBased.map { .int($0) } ?? .string(\"NULL-MONITOR-ID\"))\n                    case .monitorAppKitNsScreenScreensId: .success(.int(m.monitorAppKitNsScreenScreensId))\n                    case .monitorName: .success(.string(m.name))\n                    case .monitorIsMain: .success(.bool(m.isMain))\n                }\n            case (.app(let a), .app(let f)):\n                return switch f {\n                    case .appBundleId: .success(.string(a.rawAppBundleId ?? \"NULL-APP-BUNDLE-ID\"))\n                    case .appName: .success(.string(a.name ?? \"NULL-APP-NAME\"))\n                    case .appPid: .success(.int32(a.pid))\n                    case .appExecPath: .success(.string(a.execPath ?? \"NULL-APP-EXEC-PATH\"))\n                    case .appBundlePath: .success(.string(a.bundlePath ?? \"NULL-APP-BUNDLE-PATH\"))\n                }\n            default: break\n        }\n        if self == PlainInterVar.newline.rawValue { return .success(.string(\"\\n\")) }\n        if self == PlainInterVar.tab.rawValue { return .success(.string(\"\\t\")) }\n        return .failure(\"Unknown interpolation variable '\\(self)'. \" +\n            \"Possible values:\\n\\(getAvailableInterVars(for: obj.kind).joined(separator: \"\\n\").prependLines(\"  \"))\")\n    }\n\n    private func toFormatVar() -> FormatVar? {\n        FormatVar.WindowFormatVar(rawValue: self).flatMap(FormatVar.window)\n            ?? FormatVar.WorkspaceFormatVar(rawValue: self).flatMap(FormatVar.workspace)\n            ?? FormatVar.AppFormatVar(rawValue: self).flatMap(FormatVar.app)\n            ?? FormatVar.MonitorFormatVar(rawValue: self).flatMap(FormatVar.monitor)\n    }\n}\n\nprivate func toLayoutString(tc: TilingContainer) -> String {\n    switch (tc.layout, tc.orientation) {\n        case (.tiles, .h): return LayoutCmdArgs.LayoutDescription.h_tiles.rawValue\n        case (.tiles, .v): return LayoutCmdArgs.LayoutDescription.v_tiles.rawValue\n        case (.accordion, .h): return LayoutCmdArgs.LayoutDescription.h_accordion.rawValue\n        case (.accordion, .v): return LayoutCmdArgs.LayoutDescription.v_accordion.rawValue\n    }\n}\n\nprivate func toLayoutResult(w: Window) -> Result<Primitive, String> {\n    guard let parent = w.parent else { return .failure(\"NULL-PARENT\") }\n    return switch getChildParentRelation(child: w, parent: parent) {\n        case .tiling(let tc): .success(.string(toLayoutString(tc: tc)))\n        case .floatingWindow: .success(.string(LayoutCmdArgs.LayoutDescription.floating.rawValue))\n        case .macosNativeFullscreenWindow: .success(.string(\"macos_native_fullscreen\"))\n        case .macosNativeHiddenAppWindow: .success(.string(\"macos_native_window_of_hidden_app\"))\n        case .macosNativeMinimizedWindow: .success(.string(\"macos_native_minimized\"))\n        case .macosPopupWindow: .success(.string(\"NULL-WINDOW-LAYOUT\"))\n\n        case .rootTilingContainer: .failure(\"Not possible\")\n        case .shimContainerRelation: .failure(\"Window cannot have a shim container relation\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/formatToJson.swift",
    "content": "import Common\nimport Foundation\n\nextension [AeroObj] {\n    @MainActor\n    func formatToJson(_ format: [StringInterToken], ignoreRightPaddingVar: Bool) -> Result<String, String> {\n        var list: [[String: Primitive]] = []\n        for richObj in self {\n            var rawObj: [String: Primitive] = [:]\n            for token in format {\n                switch token {\n                    case .interVar(PlainInterVar.rightPadding.rawValue) where ignoreRightPaddingVar:\n                        break\n                    case .literal:\n                        break // should be spaces\n                    case .interVar(let varName):\n                        switch varName.expandFormatVar(obj: richObj) {\n                            case .success(let expanded): rawObj[varName] = expanded\n                            case .failure(let error): return .failure(error)\n                        }\n                }\n            }\n            list.append(rawObj)\n        }\n        return JSONEncoder.aeroSpaceDefault.encodeToString(list).map(Result.success)\n            ?? .failure(\"Can't encode '\\(list)' to JSON\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/BalanceSizesCommand.swift",
    "content": "import AppKit\nimport Common\nimport Foundation\n\nstruct BalanceSizesCommand: Command {\n    let args: BalanceSizesCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        balance(target.workspace.rootTilingContainer)\n        return true\n    }\n}\n\n@MainActor\nprivate func balance(_ parent: TilingContainer) {\n    for child in parent.children {\n        switch parent.layout {\n            case .tiles: child.setWeight(parent.orientation, 1)\n            case .accordion: break // Do nothing\n        }\n        if let child = child as? TilingContainer {\n            balance(child)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/CloseAllWindowsButCurrentCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct CloseAllWindowsButCurrentCommand: Command {\n    let args: CloseAllWindowsButCurrentCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let focused = target.windowOrNil else {\n            return io.err(\"Empty workspace\")\n        }\n        guard let workspace = focused.nodeWorkspace else {\n            return io.err(\"Focused window '\\(focused.windowId)' doesn't belong to workspace\")\n        }\n        var result = true\n        for window in workspace.allLeafWindowsRecursive where window != focused {\n            result = try await CloseCommand(args: args.closeArgs).run(env.copy(\\.windowId, window.windowId), io) && result\n        }\n        return result\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/CloseCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct CloseCommand: Command {\n    let args: CloseCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        try await allowOnlyCancellationError { @MainActor @Sendable in\n            guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n            guard let window = target.windowOrNil else {\n                return io.err(\"Empty workspace\")\n            }\n            // Access ax directly. Not cool :(\n            if try await args.quitIfLastWindow.andAsync({ @MainActor @Sendable in try await window.macAppUnsafe.getAxWindowsCount() == 1 }) {\n                let app = window.macAppUnsafe\n                if app.nsApp.terminate() {\n                    for workspace in Workspace.all {\n                        for window in workspace.allLeafWindowsRecursive where window.app.pid == app.pid {\n                            (window as! MacWindow).garbageCollect(skipClosedWindowsCache: true)\n                        }\n                    }\n                    return true\n                } else {\n                    return io.err(\"Failed to quit '\\(window.app.name ?? \"Unknown app\")'\")\n                }\n            } else {\n                window.closeAxWindow()\n                return true\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ConfigCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ConfigCommand: Command {\n    let args: ConfigCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        switch args.mode {\n            case .getKey(let key):\n                return getKey(io, args: args, key: key)\n            case .majorKeys:\n                let out = \"\"\"\n                    .\n                    mode\n                    \\(config.modes.keys.map { \"mode.\\($0).binding\" }.joined(separator: \"\\n\"))\n                    \"\"\"\n                return io.out(out)\n            case .allKeys:\n                let configMap = buildConfigMap()\n                var allKeys: [String] = []\n                configMap.dumpAllKeysRecursive(path: \".\", result: &allKeys)\n                return io.out(allKeys.joined(separator: \"\\n\"))\n            case .configPath:\n                return io.out(configUrl.absoluteURL.path)\n        }\n    }\n}\n\nextension String {\n    fileprivate func toKeyPath() -> Result<[String], String> {\n        if self == \".\" { return .success([]) }\n        if isEmpty { return .failure(\"Invalid empty key\") }\n        if self.contains(\"..\") { return .failure(\"Invalid key '\\(self)'\") }\n        if self.hasSuffix(\".\") { return .failure(\"Invalid key '\\(self)'\") }\n        return .success(self.split(separator: \".\", omittingEmptySubsequences: false).map(String.init))\n    }\n}\n\n@MainActor private func getKey(_ io: CmdIo, args: ConfigCmdArgs, key: String) -> Bool {\n    let keyPath: [String]\n    switch key.toKeyPath() {\n        case .success(let _keyPath): keyPath = _keyPath\n        case .failure(let error):\n            return io.err(error)\n    }\n    var configMap: ConfigMapValue\n    switch buildConfigMap().find(keyPath: keyPath.slice) {\n        case .success(let value):\n            configMap = value\n        case .failure(let error):\n            return io.err(error)\n    }\n    if args.keys {\n        switch configMap {\n            case .scalar(let scalar):\n                return io.err(\"--keys flag cannot be applied to scalar object '\\(scalar)'\")\n            case .map(let map):\n                configMap = .array(map.keys.map { .scalar(.string($0)) })\n            case .array(let array):\n                configMap = .array((0 ..< array.count).map { .scalar(.int($0)) })\n        }\n    }\n    if args.json {\n        if let json = JSONEncoder.aeroSpaceDefault.encodeToString(configMap) {\n            return io.out(json)\n        } else {\n            return io.err(\"Can't convert json Data to String\")\n        }\n    } else {\n        switch configMap {\n            case .scalar(let scalar):\n                return io.out(scalar.describe)\n            case .map:\n                return io.err(\"Complicated objects can be printed only with --json flag. \" +\n                    \"Alternatively, you can try to inspect keys of the object with --keys flag\")\n            case .array(let array):\n                let plainArray: Result<[String], String> = array.mapAllOrFailure {\n                    switch $0 {\n                        case .scalar(let scalar): .success(scalar.describe)\n                        default: .failure(\"Printing array of non-string objects is supported only with --json flag.\" +\n                                \"Alternatively, you can try to inspect keys of the object with --keys flag\")\n                    }\n                }\n                return switch plainArray {\n                    case .success(let array): io.out(array.sorted().joined(separator: \"\\n\"))\n                    case .failure(let error): io.err(error)\n                }\n        }\n    }\n}\n\nextension ConfigMapValue {\n    func find(keyPath: StrArrSlice) -> Result<ConfigMapValue, String> {\n        if let key = keyPath.first {\n            switch self {\n                case .scalar(let scalar):\n                    return .failure(\"Can't dereference scalar value '\\(scalar.describe)'\")\n                case .map(let map):\n                    if let child = map[key] {\n                        return child.find(keyPath: keyPath.slice(1...).orDie())\n                    } else {\n                        return .failure(\"No value at key token '\\(key)'\")\n                    }\n                case .array(let array):\n                    if let key = Int(key) {\n                        if let child = array.getOrNil(atIndex: key) {\n                            return child.find(keyPath: keyPath.slice(1...).orDie())\n                        } else {\n                            return .failure(\"Index out of bounds. Index: \\(key), Size: \\(array.count)\")\n                        }\n                    } else {\n                        return .failure(\"Can't convert key token '\\(key)' to Int\")\n                    }\n            }\n        } else {\n            return .success(self)\n        }\n    }\n\n    func dumpAllKeysRecursive(path: String, result: inout [String]) {\n        result.append(path)\n        switch self {\n            case .scalar: break\n            case .map(let map):\n                for (key, value) in map {\n                    let path = path == \".\" ? key : path + \".\" + key\n                    value.dumpAllKeysRecursive(path: path, result: &result)\n                }\n            case .array(let array):\n                for (index, value) in array.enumerated() {\n                    let path = path == \".\" ? String(index) : path + \".\" + String(index)\n                    value.dumpAllKeysRecursive(path: path, result: &result)\n                }\n        }\n    }\n}\n\nextension [Command] {\n    var prettyDescription: String {\n        map { $0.args.description }.joined(separator: \"; \")\n    }\n}\n\n@MainActor func buildConfigMap() -> ConfigMapValue {\n    let mode = config.modes.mapValues { (mode: Mode) -> ConfigMapValue in\n        var keyNotationToScript: [String: ConfigMapValue] = [:]\n        for binding in mode.bindings.values {\n            keyNotationToScript[binding.descriptionWithKeyNotation] =\n                .scalar(.string(binding.commands.prettyDescription))\n        }\n        return .map([\"binding\": .map(keyNotationToScript)])\n    }\n    return .map([\"mode\": .map(mode)])\n}\n\nenum ConfigScalarValue: Encodable {\n    case string(String)\n    case int(Int)\n\n    var describe: String {\n        return switch self {\n            case .string(let string): string\n            case .int(let int): String(int)\n        }\n    }\n\n    func encode(to encoder: Encoder) throws {\n        let value: Encodable = switch self {\n            case .string(let string): string\n            case .int(let int): int\n        }\n        var container = encoder.singleValueContainer()\n        try container.encode(value)\n    }\n}\n\nenum ConfigMapValue: Encodable {\n    case scalar(ConfigScalarValue)\n    case map([String: ConfigMapValue])\n    case array([ConfigMapValue])\n\n    func encode(to encoder: Encoder) throws {\n        let value: Encodable = switch self {\n            case .scalar(let scalar): scalar\n            case .map(let map): map\n            case .array(let array): array\n        }\n        var container = encoder.singleValueContainer()\n        try container.encode(value)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/DebugWindowsCommand.swift",
    "content": "import AppKit\nimport Common\nimport OrderedCollections\n\nprivate let disclaimer =\n    \"\"\"\n    !!! DISCLAIMER !!!\n    !!! 'debug-windows' command is not stable API. Please don't rely on the command existence and output format !!!\n    !!! The only intended use case is to report bugs about incorrect windows handling !!!\n    \"\"\"\n\n@MainActor private var debugWindowsState: DebugWindowsState = .notRecording\n@MainActor private var debugWindowsLog: OrderedDictionary<UInt32, String> = [:]\nprivate let debugWindowsLimit = 10\n\nenum DebugWindowsState {\n    case recording\n    case notRecording\n    case recordingAborted\n}\n\nstruct DebugWindowsCommand: Command {\n    let args: DebugWindowsCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        if let windowId = args.windowId {\n            guard let window = Window.get(byId: windowId) else {\n                return io.err(\"Can't find window with the specified window-id: \\(windowId)\")\n            }\n            io.out(try await dumpWindowDebugInfo(window) + \"\\n\")\n            io.out(disclaimer)\n            return true\n        }\n        switch debugWindowsState {\n            case .recording:\n                debugWindowsState = .notRecording\n                io.out(debugWindowsLog.values.joined(separator: \"\\n\\n\"))\n                io.out(\"\\n\" + disclaimer + \"\\n\")\n                io.out(\"Debug session finished\" + \"\\n\")\n                debugWindowsLog = [:]\n                return true\n            case .notRecording:\n                debugWindowsState = .recording\n                debugWindowsLog = [:]\n                io.out(\n                    \"\"\"\n                    Debug windows session has started\n                    1. Focus the problematic window\n                    2. Run 'aerospace debug-windows' once again to finish the session and get the results\n                    \"\"\",\n                )\n                // Make sure that the Terminal window that started the recording is recorded first\n                guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n                if let window = target.windowOrNil {\n                    try await debugWindowsIfRecording(window)\n                }\n                return true\n            case .recordingAborted:\n                io.out(\n                    \"\"\"\n                    Recording of the previous session was aborted after \\(debugWindowsLimit) windows has been focused\n                    Run the command one more time to start new debug session\n                    \"\"\",\n                )\n                debugWindowsState = .notRecording\n                debugWindowsLog = [:]\n                return false\n        }\n    }\n}\n\n@MainActor\nprivate func dumpWindowDebugInfo(_ window: Window) async throws -> String {\n    let window = window as! MacWindow\n    let appInfoDic = window.macApp.nsApp.bundleURL.flatMap { Bundle.init(url: $0) }?.infoDictionary ?? [:]\n\n    var result: [String: Json] = try await window.dumpAxInfo()\n\n    let windowLevel = getWindowLevel(for: window.windowId)\n    let windowLevelJson = windowLevel?.toJson() ?? .null\n    result[\"Aero.windowLevel\"] = windowLevelJson\n    result[\"Aero.axWindowId\"] = .uint32(window.windowId)\n    result[\"Aero.workspace\"] = .stringOrNull(window.nodeWorkspace?.name)\n    result[\"Aero.treeNodeParent\"] = .string(String(describing: window.parent))\n    result[\"Aero.macOS.version\"] = .string(ProcessInfo().operatingSystemVersionString) // because built-in apps might behave differently depending on the OS version\n    result[\"Aero.App.appBundleId\"] = .stringOrNull(window.app.rawAppBundleId)\n    result[\"Aero.App.pid\"] = .int(Int(window.app.pid))\n    result[\"Aero.App.versionShort\"] = .stringOrNull(appInfoDic[\"CFBundleShortVersionString\"] as? String)\n    result[\"Aero.App.version\"] = .stringOrNull(appInfoDic[\"CFBundleVersion\"] as? String)\n    result[\"Aero.App.nsApp.activationPolicy\"] = .string(window.macApp.nsApp.activationPolicy.prettyDescription)\n    result[\"Aero.App.nsApp.execPath\"] = .stringOrNull(window.macApp.nsApp.executableURL?.description)\n    result[\"Aero.App.nsApp.appBundlePath\"] = .stringOrNull(window.macApp.nsApp.bundleURL?.description)\n    result[\"Aero.AXApp\"] = .dict(try await window.macApp.dumpAppAxInfo())\n\n    let isDialog = try await window.isDialogHeuristic(windowLevel)\n    let isWindow = try await window.isWindowHeuristic(windowLevel)\n    result[\"Aero.AxUiElementWindowType\"] = .string(AxUiElementWindowType.new(isWindow: isWindow, isDialog: { isDialog }).rawValue)\n    result[\"Aero.AxUiElementWindowType_isDialogHeuristic\"] = .bool(isDialog)\n\n    var matchingCallbacks: [Json] = []\n    for callback in config.onWindowDetected where try await callback.matches(window) {\n        matchingCallbacks.append(callback.debugJson)\n    }\n    result[\"Aero.on-window-detected\"] = .array(matchingCallbacks)\n\n    return JSONEncoder.aeroSpaceDefault.encodeToString(result).prettyDescription\n        .prefixLines(with: \"\\(window.app.rawAppBundleId ?? \"nil-bundle-id\").\\(window.windowId) ||| \")\n}\n\n@MainActor\nfunc debugWindowsIfRecording(_ window: Window) async throws {\n    switch debugWindowsState {\n        case .recording: break\n        case .notRecording, .recordingAborted: return\n    }\n    if debugWindowsLog.count > debugWindowsLimit {\n        debugWindowsState = .recordingAborted\n        debugWindowsLog = [:]\n    }\n    if debugWindowsLog.keys.contains(window.windowId) {\n        return\n    }\n    debugWindowsLog[window.windowId] = try await dumpWindowDebugInfo(window)\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/EnableCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct EnableCommand: Command {\n    let args: EnableCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        let prevState = TrayMenuModel.shared.isEnabled\n        let newState: Bool = switch args.targetState.val {\n            case .on: true\n            case .off: false\n            case .toggle: !TrayMenuModel.shared.isEnabled\n        }\n        if newState == prevState {\n            if !args.failIfNoop {\n                io.out((newState ? \"Already enabled\" : \"Already disabled\") +\n                    \"Tip: use --fail-if-noop to exit with non-zero code\")\n            }\n            return !args.failIfNoop\n        }\n\n        TrayMenuModel.shared.isEnabled = newState\n        if newState {\n            for workspace in Workspace.all {\n                for window in workspace.allLeafWindowsRecursive where window.isFloating {\n                    window.lastFloatingSize = try await window.getAxSize() ?? window.lastFloatingSize\n                }\n            }\n            try await activateMode(mainModeId)\n        } else {\n            try await activateMode(nil)\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ExecAndForgetCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ExecAndForgetCommand: Command {\n    let args: ExecAndForgetCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        // todo shall exec-and-forget fork exec session?\n        // It doesn't throw if exit code is non-zero\n        let process = Process()\n        process.environment = config.execConfig.envVariables + env.asMap\n        process.executableURL = URL(filePath: \"/bin/bash\")\n        process.arguments = [\"-c\", args.bashScript]\n        return Result { try process.run() }.isSuccess\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/FlattenWorkspaceTreeCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct FlattenWorkspaceTreeCommand: Command {\n    let args: FlattenWorkspaceTreeCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache: Bool = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        let workspace = target.workspace\n        let windows = workspace.rootTilingContainer.allLeafWindowsRecursive\n        for window in windows {\n            window.bind(to: workspace.rootTilingContainer, adaptiveWeight: 1, index: INDEX_BIND_LAST)\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/FocusBackAndForthCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct FocusBackAndForthCommand: Command {\n    let args: FocusBackAndForthCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        if let prevFocus {\n            return setFocus(to: prevFocus)\n        } else {\n            return io.err(\"Prev window has been closed\")\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/FocusCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct FocusCommand: Command {\n    let args: FocusCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        // todo bug: floating windows break mru\n        let floatingWindows = args.floatingAsTiling ? try await makeFloatingWindowsSeenAsTiling(workspace: target.workspace) : []\n        defer {\n            if args.floatingAsTiling {\n                restoreFloatingWindows(floatingWindows: floatingWindows, workspace: target.workspace)\n            }\n        }\n\n        switch args.target {\n            case .direction(let direction):\n                let window = target.windowOrNil\n                if let (parent, ownIndex) = window?.closestParent(hasChildrenInDirection: direction, withLayout: nil) {\n                    guard let windowToFocus = parent.children[ownIndex + direction.focusOffset]\n                        .findLeafWindowRecursive(snappedTo: direction.opposite) else { return false }\n                    return windowToFocus.focusWindow()\n                } else {\n                    return hitWorkspaceBoundaries(target, io, args, direction)\n                }\n            case .windowId(let windowId):\n                if let windowToFocus = Window.get(byId: windowId) {\n                    return windowToFocus.focusWindow()\n                } else {\n                    return io.err(\"Can't find window with ID \\(windowId)\")\n                }\n            case .dfsIndex(let dfsIndex):\n                if let windowToFocus = target.workspace.rootTilingContainer.allLeafWindowsRecursive.getOrNil(atIndex: Int(dfsIndex)) {\n                    return windowToFocus.focusWindow()\n                } else {\n                    return io.err(\"Can't find window with DFS index \\(dfsIndex)\")\n                }\n            case .dfsRelative(let nextPrev):\n                let windows = target.workspace.rootTilingContainer.allLeafWindowsRecursive\n                guard let currentIndex = windows.firstIndex(where: { $0 == target.windowOrNil }) else {\n                    return false\n                }\n                var targetIndex = switch nextPrev {\n                    case .dfsNext: currentIndex + 1\n                    case .dfsPrev: currentIndex - 1\n                }\n                if !(0 ..< windows.count).contains(targetIndex) {\n                    switch args.boundariesAction {\n                        case .stop: return true\n                        case .fail: return false\n                        case .wrapAroundTheWorkspace: targetIndex = (targetIndex + windows.count) % windows.count\n                        case .wrapAroundAllMonitors: return dieT(\"Must be discarded by args parser\")\n                    }\n                }\n                return windows[targetIndex].focusWindow()\n        }\n    }\n}\n\n@MainActor private func hitWorkspaceBoundaries(\n    _ target: LiveFocus,\n    _ io: CmdIo,\n    _ args: FocusCmdArgs,\n    _ direction: CardinalDirection,\n) -> Bool {\n    switch args.boundaries {\n        case .workspace:\n            return switch args.boundariesAction {\n                case .stop: true\n                case .fail: false\n                case .wrapAroundTheWorkspace: wrapAroundTheWorkspace(target, io, direction)\n                case .wrapAroundAllMonitors: dieT(\"Must be discarded by args parser\")\n            }\n        case .allMonitorsOuterFrame:\n            let currentMonitor = target.workspace.workspaceMonitor\n            guard let (monitors, index) = currentMonitor.findRelativeMonitor(inDirection: direction) else {\n                return io.err(\"Should never happen. Can't find the current monitor\")\n            }\n\n            if let targetMonitor = monitors.getOrNil(atIndex: index) {\n                return targetMonitor.activeWorkspace.focusWorkspace()\n            } else {\n                guard let wrapped = monitors.get(wrappingIndex: index) else { return false }\n                return hitAllMonitorsOuterFrameBoundaries(target, io, args, direction, wrapped)\n            }\n    }\n}\n\n@MainActor private func hitAllMonitorsOuterFrameBoundaries(\n    _ target: LiveFocus,\n    _ io: CmdIo,\n    _ args: FocusCmdArgs,\n    _ direction: CardinalDirection,\n    _ wrappedMonitor: Monitor,\n) -> Bool {\n    switch args.boundariesAction {\n        case .stop:\n            return true\n        case .fail:\n            return false\n        case .wrapAroundTheWorkspace:\n            return wrapAroundTheWorkspace(target, io, direction)\n        case .wrapAroundAllMonitors:\n            wrappedMonitor.activeWorkspace.findLeafWindowRecursive(snappedTo: direction.opposite)?.markAsMostRecentChild()\n            return wrappedMonitor.activeWorkspace.focusWorkspace()\n    }\n}\n\n@MainActor private func wrapAroundTheWorkspace(_ target: LiveFocus, _ io: CmdIo, _ direction: CardinalDirection) -> Bool {\n    guard let windowToFocus = target.workspace.findLeafWindowRecursive(snappedTo: direction.opposite) else {\n        return io.err(noWindowIsFocused)\n    }\n    return windowToFocus.focusWindow()\n}\n\n@MainActor private func makeFloatingWindowsSeenAsTiling(workspace: Workspace) async throws -> [FloatingWindowData] {\n    let mruBefore = workspace.mostRecentWindowRecursive\n    defer {\n        mruBefore?.markAsMostRecentChild()\n    }\n    var _floatingWindows: [FloatingWindowData] = []\n    for window in workspace.floatingWindows {\n        let center = try await window.getCenter() // todo bug: we shouldn't access ax api here. What if the window was moved but it wasn't committed to ax yet?\n        guard let center else { continue }\n\n        let tilingParent: TilingContainer\n        let index: Int\n        if let target = center.coerce(in: workspace.workspaceMonitor.visibleRectPaddedByOuterGaps)?\n            .findIn(tree: workspace.rootTilingContainer, virtual: true)\n        {\n            guard let targetCenter = try await target.getCenter() else { continue }\n            guard let _tilingParent = target.parent as? TilingContainer else { continue }\n            tilingParent = _tilingParent\n            index = center.getProjection(tilingParent.orientation) >= targetCenter.getProjection(tilingParent.orientation)\n                ? target.ownIndex.orDie() + 1\n                : target.ownIndex.orDie()\n        } else {\n            index = 0\n            tilingParent = workspace.rootTilingContainer\n        }\n\n        let data = window.unbindFromParent()\n        let floatingWindowData = FloatingWindowData(\n            window: window,\n            center: center,\n            parent: tilingParent,\n            adaptiveWeight: data.adaptiveWeight,\n            index: index,\n        )\n        _floatingWindows.append(floatingWindowData)\n    }\n    let floatingWindows: [FloatingWindowData] = _floatingWindows.sortedBy { $0.center.getProjection($0.parent.orientation) }.reversed()\n\n    for floating in floatingWindows { // Make floating windows be seen as tiling\n        floating.window.bind(to: floating.parent, adaptiveWeight: 1, index: floating.index)\n    }\n    return floatingWindows\n}\n\n@MainActor private func restoreFloatingWindows(floatingWindows: [FloatingWindowData], workspace: Workspace) {\n    let mruBefore = workspace.mostRecentWindowRecursive\n    defer {\n        mruBefore?.markAsMostRecentChild()\n    }\n    for floating in floatingWindows {\n        floating.window.bind(to: workspace, adaptiveWeight: floating.adaptiveWeight, index: INDEX_BIND_LAST)\n    }\n}\n\nprivate struct FloatingWindowData {\n    let window: Window\n    let center: CGPoint\n\n    let parent: TilingContainer\n    let adaptiveWeight: CGFloat\n    let index: Int\n}\n\nextension TreeNode {\n    @MainActor\n    func findLeafWindowRecursive(snappedTo direction: CardinalDirection) -> Window? {\n        switch nodeCases {\n            case .workspace(let workspace):\n                return workspace.rootTilingContainer.findLeafWindowRecursive(snappedTo: direction)\n            case .window(let window):\n                return window\n            case .tilingContainer(let container):\n                if direction.orientation == container.orientation {\n                    return (direction.isPositive ? container.children.last : container.children.first)?\n                        .findLeafWindowRecursive(snappedTo: direction)\n                } else {\n                    return mostRecentChild?.findLeafWindowRecursive(snappedTo: direction)\n                }\n            case .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer,\n                 .macosPopupWindowsContainer, .macosHiddenAppsWindowsContainer:\n                die(\"Impossible\")\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/FocusMonitorCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct FocusMonitorCommand: Command {\n    let args: FocusMonitorCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        return switch args.target.val.resolve(target.workspace.workspaceMonitor, wrapAround: args.wrapAround) {\n            case .success(let targetMonitor): targetMonitor.activeWorkspace.focusWorkspace()\n            case .failure(let msg): io.err(msg)\n        }\n    }\n}\n\nextension MonitorTarget {\n    func resolve(_ currentMonitor: Monitor, wrapAround: Bool) -> Result<Monitor, String> {\n        switch self {\n            case .direction(let direction):\n                guard let (monitorsInDirection, index) = currentMonitor.findRelativeMonitor(inDirection: direction) else {\n                    return .failure(\"Should never happen. Can't find the current monitor\")\n                }\n                let targetMonitor = wrapAround ? monitorsInDirection.get(wrappingIndex: index) : monitorsInDirection.getOrNil(atIndex: index)\n                guard let targetMonitor else {\n                    return .failure(\"No monitors in direction \\(direction)\")\n                }\n                return .success(targetMonitor)\n            case .relative(let nextPrev):\n                let monitors = sortedMonitors\n                guard let curIndex = monitors.firstIndex(where: { $0.rect.topLeftCorner == currentMonitor.rect.topLeftCorner }) else {\n                    return .failure(\"Can't find current monitor\")\n                }\n                let targetIndex = nextPrev == .next ? curIndex + 1 : curIndex - 1\n                let targetMonitor = wrapAround ? monitors.get(wrappingIndex: targetIndex) : monitors.getOrNil(atIndex: targetIndex)\n                guard let targetMonitor else {\n                    return .failure(\"Can't find target monitor\")\n                }\n                return .success(targetMonitor)\n            case .patterns(let patterns):\n                let monitors = sortedMonitors\n                guard let targetMonitor = patterns.lazy.compactMap({ $0.resolveMonitor(sortedMonitors: monitors) }).first else {\n                    return .failure(\"None of the monitors match the pattern(s)\")\n                }\n                return .success(targetMonitor)\n        }\n    }\n}\n\nextension Monitor {\n    func relation(to monitor: Monitor) -> Orientation {\n        guard let otherYRange = monitor.rect.minY.until(excl: monitor.rect.maxY) else { return .h }\n        guard let myYRange = rect.minY.until(excl: rect.maxY) else { return .h }\n        return myYRange.overlaps(otherYRange) ? .h : .v\n    }\n\n    func findRelativeMonitor(inDirection direction: CardinalDirection) -> (monitorsInDirection: [Monitor], index: Int)? {\n        let currentMonitor = self\n        let monitors = sortedMonitors.filter {\n            currentMonitor.rect.topLeftCorner == $0.rect.topLeftCorner ||\n                $0.relation(to: currentMonitor) == direction.orientation\n        }\n        guard let index = monitors.firstIndex(where: { $0.rect.topLeftCorner == currentMonitor.rect.topLeftCorner }) else { return nil }\n        return (monitors, index + direction.focusOffset)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/FullscreenCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct FullscreenCommand: Command {\n    let args: FullscreenCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let window = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n        let newState: Bool = switch args.toggle {\n            case .on: true\n            case .off: false\n            case .toggle: !window.isFullscreen\n        }\n        if newState == window.isFullscreen {\n            io.err((newState ? \"Already fullscreen. \" : \"Already not fullscreen. \") +\n                \"Tip: use --fail-if-noop to exit with non-zero code\")\n            return !args.failIfNoop\n        }\n        window.isFullscreen = newState\n        window.noOuterGapsInFullscreen = args.noOuterGaps\n\n        // Focus on its own workspace\n        window.markAsMostRecentChild()\n        return true\n    }\n}\n\nlet noWindowIsFocused = \"No window is focused\"\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/JoinWithCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct JoinWithCommand: Command {\n    let args: JoinWithCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        let direction = args.direction.val\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let currentWindow = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n        guard let (parent, ownIndex) = currentWindow.closestParent(hasChildrenInDirection: direction, withLayout: nil) else {\n            return io.err(\"No windows in the specified direction\")\n        }\n        let joinWithTarget = parent.children[ownIndex + direction.focusOffset]\n        let prevBinding = joinWithTarget.unbindFromParent()\n        let newParent = TilingContainer(\n            parent: parent,\n            adaptiveWeight: prevBinding.adaptiveWeight,\n            parent.orientation.opposite,\n            .tiles,\n            index: prevBinding.index,\n        )\n        currentWindow.unbindFromParent()\n\n        joinWithTarget.bind(to: newParent, adaptiveWeight: WEIGHT_AUTO, index: 0)\n        currentWindow.bind(to: newParent, adaptiveWeight: WEIGHT_AUTO, index: direction.isPositive ? 0 : INDEX_BIND_LAST)\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/LayoutCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct LayoutCommand: Command {\n    let args: LayoutCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let window = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n        let targetDescription = args.toggleBetween.val.first(where: { !window.matchesDescription($0) })\n            ?? args.toggleBetween.val.first.orDie()\n        if window.matchesDescription(targetDescription) { return false }\n        switch targetDescription {\n            case .h_accordion:\n                return changeTilingLayout(io, targetLayout: .accordion, targetOrientation: .h, window: window)\n            case .v_accordion:\n                return changeTilingLayout(io, targetLayout: .accordion, targetOrientation: .v, window: window)\n            case .h_tiles:\n                return changeTilingLayout(io, targetLayout: .tiles, targetOrientation: .h, window: window)\n            case .v_tiles:\n                return changeTilingLayout(io, targetLayout: .tiles, targetOrientation: .v, window: window)\n            case .accordion:\n                return changeTilingLayout(io, targetLayout: .accordion, targetOrientation: nil, window: window)\n            case .tiles:\n                return changeTilingLayout(io, targetLayout: .tiles, targetOrientation: nil, window: window)\n            case .horizontal:\n                return changeTilingLayout(io, targetLayout: nil, targetOrientation: .h, window: window)\n            case .vertical:\n                return changeTilingLayout(io, targetLayout: nil, targetOrientation: .v, window: window)\n            case .tiling:\n                guard let parent = window.parent else { return false }\n                switch parent.cases {\n                    case .macosPopupWindowsContainer:\n                        return false // Impossible\n                    case .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer, .macosHiddenAppsWindowsContainer:\n                        return io.err(\"Can't change layout for macOS minimized, fullscreen windows or windows or hidden apps. This behavior is subject to change\")\n                    case .tilingContainer:\n                        return true // Nothing to do\n                    case .workspace(let workspace):\n                        window.lastFloatingSize = try await window.getAxSize() ?? window.lastFloatingSize\n                        try await window.relayoutWindow(on: workspace, forceTile: true)\n                        return true\n                }\n            case .floating:\n                let workspace = target.workspace\n                window.bindAsFloatingWindow(to: workspace)\n                if let size = window.lastFloatingSize { window.setAxFrame(nil, size) }\n                return true\n        }\n    }\n}\n\n@MainActor private func changeTilingLayout(_ io: CmdIo, targetLayout: Layout?, targetOrientation: Orientation?, window: Window) -> Bool {\n    guard let parent = window.parent else { return false }\n    switch parent.cases {\n        case .tilingContainer(let parent):\n            let targetOrientation = targetOrientation ?? parent.orientation\n            let targetLayout = targetLayout ?? parent.layout\n            parent.layout = targetLayout\n            parent.changeOrientation(targetOrientation)\n            return true\n        case .workspace, .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer,\n             .macosPopupWindowsContainer, .macosHiddenAppsWindowsContainer:\n            return io.err(\"The window is non-tiling\")\n    }\n}\n\nextension Window {\n    fileprivate func matchesDescription(_ layout: LayoutCmdArgs.LayoutDescription) -> Bool {\n        return switch layout {\n            case .accordion:   (parent as? TilingContainer)?.layout == .accordion\n            case .tiles:       (parent as? TilingContainer)?.layout == .tiles\n            case .horizontal:  (parent as? TilingContainer)?.orientation == .h\n            case .vertical:    (parent as? TilingContainer)?.orientation == .v\n            case .h_accordion: (parent as? TilingContainer).map { $0.layout == .accordion && $0.orientation == .h } == true\n            case .v_accordion: (parent as? TilingContainer).map { $0.layout == .accordion && $0.orientation == .v } == true\n            case .h_tiles:     (parent as? TilingContainer).map { $0.layout == .tiles && $0.orientation == .h } == true\n            case .v_tiles:     (parent as? TilingContainer).map { $0.layout == .tiles && $0.orientation == .v } == true\n            case .tiling:      parent is TilingContainer\n            case .floating:    parent is Workspace\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ListAppsCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ListAppsCommand: Command {\n    let args: ListAppsCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        var result = Array(MacApp.allAppsMap.values)\n        if let hidden = args.macosHidden {\n            result = result.filter { $0.nsApp.isHidden == hidden }\n        }\n\n        if args.outputOnlyCount {\n            return io.out(\"\\(result.count)\")\n        } else {\n            let list = result.map { AeroObj.app($0) }\n            if args.json {\n                return switch list.formatToJson(args.format, ignoreRightPaddingVar: args._format.isEmpty) {\n                    case .success(let json): io.out(json)\n                    case .failure(let msg): io.err(msg)\n                }\n            } else {\n                return switch list.format(args.format) {\n                    case .success(let lines): io.out(lines)\n                    case .failure(let msg): io.err(msg)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ListExecEnvVarsCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ListExecEnvVarsCommand: Command {\n    let args: ListExecEnvVarsCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        for (key, value) in config.execConfig.envVariables {\n            io.out(\"\\(key)=\\(value)\")\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ListModesCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ListModesCommand: Command {\n    let args: ListModesCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        let modes: [String] = args.current ? [activeMode ?? mainModeId] : config.modes.keys.sorted()\n        return switch true {\n            case args.outputOnlyCount:\n                io.out(\"\\(modes.count)\")\n            case args.json:\n                JSONEncoder.aeroSpaceDefault.encodeToString(modes.map { [\"mode-id\": $0] }).map(io.out)\n                    ?? io.err(\"Failed to encode JSON\")\n            default:\n                io.out(modes)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ListMonitorsCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ListMonitorsCommand: Command {\n    let args: ListMonitorsCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        let focus = focus\n        var result = sortedMonitors\n        if let focused = args.focused {\n            result = result.filter { (monitor) in (monitor.activeWorkspace == focus.workspace) == focused }\n        }\n        if let mouse = args.mouse {\n            let mouseWorkspace = mouseLocation.monitorApproximation.activeWorkspace\n            result = result.filter { (monitor) in (monitor.activeWorkspace == mouseWorkspace) == mouse }\n        }\n\n        if args.outputOnlyCount {\n            return io.out(\"\\(result.count)\")\n        } else {\n            let list = result.map { AeroObj.monitor($0) }\n            if args.json {\n                return switch list.formatToJson(args.format, ignoreRightPaddingVar: args._format.isEmpty) {\n                    case .success(let json): io.out(json)\n                    case .failure(let msg): io.err(msg)\n                }\n            } else {\n                return switch list.format(args.format) {\n                    case .success(let lines): io.out(lines)\n                    case .failure(let msg): io.err(msg)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ListWindowsCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ListWindowsCommand: Command {\n    let args: ListWindowsCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        let focus = focus\n        var windows: [Window] = []\n\n        if args.filteringOptions.focused {\n            if let window = focus.windowOrNil {\n                windows = [window]\n            } else {\n                return io.err(noWindowIsFocused)\n            }\n        } else {\n            var workspaces: Set<Workspace> = args.filteringOptions.workspaces.isEmpty\n                ? Workspace.all.toSet()\n                : args.filteringOptions.workspaces\n                    .flatMap { filter in\n                        switch filter {\n                            case .focused: [focus.workspace]\n                            case .visible: Workspace.all.filter(\\.isVisible)\n                            case .name(let name): [Workspace.get(byName: name.raw)]\n                        }\n                    }\n                    .toSet()\n            if !args.filteringOptions.monitors.isEmpty {\n                let monitors: Set<CGPoint> = args.filteringOptions.monitors.resolveMonitors(io)\n                if monitors.isEmpty { return false }\n                workspaces = workspaces.filter { monitors.contains($0.workspaceMonitor.rect.topLeftCorner) }\n            }\n            windows = workspaces.flatMap(\\.allLeafWindowsRecursive)\n            if let pid = args.filteringOptions.pidFilter {\n                windows = windows.filter { $0.app.pid == pid }\n            }\n            if let appId = args.filteringOptions.appIdFilter {\n                windows = windows.filter { $0.app.rawAppBundleId == appId }\n            }\n        }\n\n        if args.outputOnlyCount {\n            return io.out(\"\\(windows.count)\")\n        } else {\n            var _list: [(window: Window, title: String)] = [] // todo cleanup\n            for window in windows {\n                _list.append((window, try await window.title))\n            }\n            _list = _list.filter { $0.window.isBound }\n            _list = _list.sortedBy([{ $0.window.app.name ?? \"\" }, \\.title])\n\n            let list = _list.map { AeroObj.window(window: $0.window, title: $0.title) }\n            if args.json {\n                return switch list.formatToJson(args.format, ignoreRightPaddingVar: args._format.isEmpty) {\n                    case .success(let json): io.out(json)\n                    case .failure(let msg): io.err(msg)\n                }\n            } else {\n                return switch list.format(args.format) {\n                    case .success(let lines): io.out(lines)\n                    case .failure(let msg): io.err(msg)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ListWorkspacesCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ListWorkspacesCommand: Command {\n    let args: ListWorkspacesCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        var result: [Workspace] = Workspace.all\n        if let visible = args.filteringOptions.visible {\n            result = result.filter { $0.isVisible == visible }\n        }\n        if !args.filteringOptions.onMonitors.isEmpty {\n            let monitors: Set<CGPoint> = args.filteringOptions.onMonitors.resolveMonitors(io)\n            if monitors.isEmpty { return false }\n            result = result.filter { monitors.contains($0.workspaceMonitor.rect.topLeftCorner) }\n        }\n        if let empty = args.filteringOptions.empty {\n            result = result.filter { $0.isEffectivelyEmpty == empty }\n        }\n\n        if args.outputOnlyCount {\n            return io.out(\"\\(result.count)\")\n        } else {\n            let list = result.map { AeroObj.workspace($0) }\n            if args.json {\n                return switch list.formatToJson(args.format, ignoreRightPaddingVar: args._format.isEmpty) {\n                    case .success(let json): io.out(json)\n                    case .failure(let msg): io.err(msg)\n                }\n            } else {\n                return switch list.format(args.format) {\n                    case .success(let lines): io.out(lines)\n                    case .failure(let msg): io.err(msg)\n                }\n            }\n        }\n    }\n}\n\nextension [MonitorId] {\n    @MainActor func resolveMonitors(_ io: CmdIo) -> Set<CGPoint> {\n        var requested: Set<CGPoint> = []\n        let sortedMonitors = sortedMonitors\n        for id in self {\n            let resolved = id.resolve(io, sortedMonitors: sortedMonitors)\n            if resolved.isEmpty {\n                return []\n            }\n            for monitor in resolved {\n                requested.insert(monitor.rect.topLeftCorner)\n            }\n        }\n        return requested\n    }\n}\n\nextension MonitorId {\n    @MainActor func resolve(_ io: CmdIo, sortedMonitors: [Monitor]) -> [Monitor] {\n        switch self {\n            case .focused:\n                return [focus.workspace.workspaceMonitor]\n            case .mouse:\n                return [mouseLocation.monitorApproximation]\n            case .all:\n                return monitors\n            case .index(let index):\n                if let monitor = sortedMonitors.getOrNil(atIndex: index) {\n                    return [monitor]\n                } else {\n                    io.err(\"Invalid monitor ID: \\(index + 1)\")\n                    return []\n                }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/MacosNativeFullscreenCommand.swift",
    "content": "import AppKit\nimport Common\n\n/// Problem ID-B6E178F2: It's not first-class citizen command in AeroSpace model, since it interacts with macOS API directly.\n/// Consecutive macos-native-fullscreen commands may not works as expected (because macOS may report correct state with a\n/// delay), or may flicker\n///\n/// The same applies to macos-native-minimize command\nstruct MacosNativeFullscreenCommand: Command {\n    let args: MacosNativeFullscreenCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let window = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n        let prevState = try await window.isMacosFullscreen\n        let newState: Bool = switch args.toggle {\n            case .on: true\n            case .off: false\n            case .toggle: !prevState\n        }\n        if newState == prevState {\n            if !args.failIfNoop {\n                io.err((newState ? \"Already fullscreen. \" : \"Already not fullscreen. \") +\n                    \"Tip: use --fail-if-noop to exit with non-zero exit code\")\n            }\n            return !args.failIfNoop\n        }\n        window.asMacWindow().setNativeFullscreen(newState)\n        guard let workspace = window.visualWorkspace else {\n            return io.err(windowIsntPartOfTree(window))\n        }\n        if newState { // Enter fullscreen\n            window.bind(to: workspace.macOsNativeFullscreenWindowsContainer, adaptiveWeight: 1, index: INDEX_BIND_LAST)\n        } else { // Exit fullscreen\n            switch window.layoutReason {\n                case .macos(let prevParentKind):\n                    try await exitMacOsNativeUnconventionalState(window: window, prevParentKind: prevParentKind, workspace: workspace)\n                default:\n                    try await window.relayoutWindow(on: workspace)\n            }\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/MacosNativeMinimizeCommand.swift",
    "content": "import AppKit\nimport Common\n\n/// See: MacosNativeFullscreenCommand. Problem ID-B6E178F2\nstruct MacosNativeMinimizeCommand: Command {\n    let args: MacosNativeMinimizeCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        // resolveTargetOrReportError on already minimized windows will always fail\n        // It would be easier if minimized windows were part of the workspace in tree hierarchy\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let window = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n        let newState: Bool = try await !window.isMacosMinimized\n        window.asMacWindow().setNativeMinimized(newState)\n        if newState { // minimize\n            window.bind(to: macosMinimizedWindowsContainer, adaptiveWeight: 1, index: INDEX_BIND_LAST)\n            return true\n        } else { // unminimize\n            return io.err(\"The command is uncapable of unminimizing windows yet. Sorry\") // dead code. should never be possible, see the comment above\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ModeCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ModeCommand: Command {\n    let args: ModeCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        try await activateMode(args.targetMode.val)\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/MoveCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct MoveCommand: Command {\n    let args: MoveCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        let direction = args.direction.val\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let currentWindow = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n        guard let parent = currentWindow.parent else { return false }\n        switch parent.cases {\n            case .tilingContainer(let parent):\n                let indexOfCurrent = currentWindow.ownIndex.orDie()\n                let indexOfSiblingTarget = indexOfCurrent + direction.focusOffset\n                if parent.orientation == direction.orientation && parent.children.indices.contains(indexOfSiblingTarget) {\n                    switch parent.children[indexOfSiblingTarget].tilingTreeNodeCasesOrDie() {\n                        case .tilingContainer(let topLevelSiblingTargetContainer):\n                            return deepMoveIn(window: currentWindow, into: topLevelSiblingTargetContainer, moveDirection: direction)\n                        case .window: // \"swap windows\"\n                            let prevBinding = currentWindow.unbindFromParent()\n                            currentWindow.bind(to: parent, adaptiveWeight: prevBinding.adaptiveWeight, index: indexOfSiblingTarget)\n                            return true\n                    }\n                } else {\n                    return moveOut(window: currentWindow, direction: direction, io, args, env)\n                }\n            case .workspace: // floating window\n                return io.err(\"moving floating windows isn't yet supported\") // todo\n            case .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer, .macosHiddenAppsWindowsContainer:\n                return io.err(moveOutMacosUnconventionalWindow)\n            case .macosPopupWindowsContainer:\n                return false // Impossible\n        }\n    }\n}\n\n@MainActor private func hitWorkspaceBoundaries(\n    _ window: Window,\n    _ workspace: Workspace,\n    _ io: CmdIo,\n    _ args: MoveCmdArgs,\n    _ direction: CardinalDirection,\n    _ env: CmdEnv,\n) -> Bool {\n    switch args.boundaries {\n        case .workspace:\n            switch args.boundariesAction {\n                case .stop: return true\n                case .fail: return false\n                case .createImplicitContainer:\n                    createImplicitContainerAndMoveWindow(window, workspace, direction)\n                    return true\n            }\n        case .allMonitorsOuterFrame:\n            guard let (monitors, index) = window.nodeMonitor?.findRelativeMonitor(inDirection: direction) else {\n                return io.err(\"Should never happen. Can't find the current monitor\")\n            }\n\n            if monitors.indices.contains(index) {\n                let moveNodeToMonitorArgs = MoveNodeToMonitorCmdArgs(target: .direction(direction))\n                    .copy(\\.windowId, window.windowId)\n                    .copy(\\.focusFollowsWindow, focus.windowOrNil == window)\n\n                return MoveNodeToMonitorCommand(args: moveNodeToMonitorArgs).run(env, io)\n            } else {\n                return hitAllMonitorsOuterFrameBoundaries(window, workspace, args, direction)\n            }\n    }\n}\n\n@MainActor private func hitAllMonitorsOuterFrameBoundaries(\n    _ window: Window,\n    _ workspace: Workspace,\n    _ args: MoveCmdArgs,\n    _ direction: CardinalDirection,\n) -> Bool {\n    switch args.boundariesAction {\n        case .stop: return true\n        case .fail: return false\n        case .createImplicitContainer:\n            createImplicitContainerAndMoveWindow(window, workspace, direction)\n            return true\n    }\n}\n\nprivate let moveOutMacosUnconventionalWindow = \"moving macOS fullscreen, minimized windows and windows of hidden apps isn't yet supported. This behavior is subject to change\"\n\n@MainActor private func moveOut(\n    window: Window,\n    direction: CardinalDirection,\n    _ io: CmdIo,\n    _ args: MoveCmdArgs,\n    _ env: CmdEnv,\n) -> Bool {\n    let innerMostChild = window.parents.first(where: {\n        return switch $0.parent?.cases {\n            case .tilingContainer(let parent): parent.orientation == direction.orientation\n            // Stop searching\n            case .workspace, .macosMinimizedWindowsContainer, nil, .macosFullscreenWindowsContainer,\n                 .macosHiddenAppsWindowsContainer, .macosPopupWindowsContainer: true\n        }\n    }) as? TilingContainer\n    guard let innerMostChild else { return false }\n    guard let parent = innerMostChild.parent else { return false }\n    switch parent.cases {\n        case .tilingContainer(let parent):\n            check(parent.orientation == direction.orientation)\n            guard let ownIndex = innerMostChild.ownIndex else { return false }\n            window.bind(to: parent, adaptiveWeight: WEIGHT_AUTO, index: ownIndex + direction.insertionOffset)\n            return true\n        case .workspace(let parent):\n            return hitWorkspaceBoundaries(window, parent, io, args, direction, env)\n        case .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer, .macosHiddenAppsWindowsContainer:\n            return io.err(moveOutMacosUnconventionalWindow)\n        case .macosPopupWindowsContainer:\n            return false // Impossible\n    }\n}\n\n@MainActor private func createImplicitContainerAndMoveWindow(\n    _ window: Window,\n    _ workspace: Workspace,\n    _ direction: CardinalDirection,\n) {\n    let prevRoot = workspace.rootTilingContainer\n    prevRoot.unbindFromParent()\n    // Force tiles layout\n    _ = TilingContainer(parent: workspace, adaptiveWeight: WEIGHT_AUTO, direction.orientation, .tiles, index: 0)\n    check(prevRoot != workspace.rootTilingContainer)\n    prevRoot.bind(to: workspace.rootTilingContainer, adaptiveWeight: WEIGHT_AUTO, index: 0)\n    window.bind(to: workspace.rootTilingContainer, adaptiveWeight: WEIGHT_AUTO, index: direction.insertionOffset)\n}\n\n@MainActor private func deepMoveIn(window: Window, into container: TilingContainer, moveDirection: CardinalDirection) -> Bool {\n    let deepTarget = container.tilingTreeNodeCasesOrDie().findDeepMoveInTargetRecursive(moveDirection.orientation)\n    switch deepTarget {\n        case .tilingContainer(let deepTarget):\n            window.bind(to: deepTarget, adaptiveWeight: WEIGHT_AUTO, index: 0)\n        case .window(let deepTarget):\n            guard let parent = deepTarget.parent as? TilingContainer else { return false }\n            window.bind(\n                to: parent,\n                adaptiveWeight: WEIGHT_AUTO,\n                index: deepTarget.ownIndex.orDie() + 1,\n            )\n    }\n    return true\n}\n\nextension TilingTreeNodeCases {\n    @MainActor fileprivate func findDeepMoveInTargetRecursive(_ orientation: Orientation) -> TilingTreeNodeCases {\n        return switch self {\n            case .window:\n                self\n            case .tilingContainer(let container):\n                if container.orientation == orientation {\n                    .tilingContainer(container)\n                } else {\n                    container.mostRecentChild.orDie(\"Empty containers must be detached during normalization\")\n                        .tilingTreeNodeCasesOrDie()\n                        .findDeepMoveInTargetRecursive(orientation)\n                }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/MoveMouseCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct MoveMouseCommand: Command {\n    let args: MoveMouseCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        let mouse = mouseLocation\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        switch args.mouseTarget.val {\n            case .windowLazyCenter:\n                guard let rect = try await windowSubjectRectOrReportError(target, io) else { return false }\n                if rect.contains(mouse) {\n                    if !args.failIfNoop {\n                        io.err(\"The mouse already belongs to the window. Tip: use --fail-if-noop to exit with non-zero code\")\n                    }\n                    return !args.failIfNoop\n                }\n                return moveMouse(io, rect.center)\n            case .windowForceCenter:\n                guard let rect = try await windowSubjectRectOrReportError(target, io) else { return false }\n                return moveMouse(io, rect.center)\n            case .monitorLazyCenter:\n                let rect = target.workspace.workspaceMonitor.rect\n                if rect.contains(mouse) {\n                    if !args.failIfNoop {\n                        io.err(\"The mouse already belongs to the monitor. Tip: use --fail-if-noop to exit with non-zero code\")\n                    }\n                    return !args.failIfNoop\n                }\n                return moveMouse(io, rect.center)\n            case .monitorForceCenter:\n                return moveMouse(io, target.workspace.workspaceMonitor.rect.center)\n        }\n    }\n}\n\nprivate func moveMouse(_ io: CmdIo, _ point: CGPoint) -> Bool {\n    let event = CGEvent(\n        mouseEventSource: nil,\n        mouseType: CGEventType.mouseMoved,\n        mouseCursorPosition: point,\n        mouseButton: CGMouseButton.left,\n    )\n    if let event {\n        event.post(tap: CGEventTapLocation.cghidEventTap)\n        return true\n    } else {\n        return io.err(\"Failed to move mouse\")\n    }\n}\n\n@MainActor\nprivate func windowSubjectRectOrReportError(_ target: LiveFocus, _ io: CmdIo) async throws -> Rect? {\n    // todo bug it's bad that we operate on the \"ax physical\" state directly. command seq won't work correctly\n    //      focus <direction> command has the similar problem\n    if let window: Window = target.windowOrNil {\n        if let rect = window.lastAppliedLayoutPhysicalRect {\n            return rect\n        } else if let rect = try await window.getAxRect() {\n            return rect\n        } else {\n            io.err(\"Failed to get rect of window '\\(window.windowId)'\")\n            return nil\n        }\n    } else {\n        io.err(noWindowIsFocused)\n        return nil\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/MoveNodeToMonitorCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct MoveNodeToMonitorCommand: Command {\n    let args: MoveNodeToMonitorCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let window = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n        guard let currentMonitor = window.nodeMonitor else {\n            return io.err(windowIsntPartOfTree(window))\n        }\n        switch args.target.val.resolve(currentMonitor, wrapAround: args.wrapAround) {\n            case .success(let targetMonitor):\n                let targetWs = targetMonitor.activeWorkspace\n                let index = true == args.target.val.directionOrNil\n                    .map { dir in dir.isPositive && targetWs.rootTilingContainer.orientation == dir.orientation }\n                    ? 0\n                    : INDEX_BIND_LAST\n                return moveWindowToWorkspace(\n                    window,\n                    targetWs,\n                    io,\n                    focusFollowsWindow: args.focusFollowsWindow,\n                    failIfNoop: args.failIfNoop,\n                    index: index,\n                )\n            case .failure(let msg):\n                return io.err(msg)\n        }\n    }\n}\n\nfunc windowIsntPartOfTree(_ window: Window) -> String {\n    \"Window \\(window.windowId) is not part of tree (minimized or hidden)\"\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/MoveNodeToWorkspaceCommand.swift",
    "content": "import Common\n\nstruct MoveNodeToWorkspaceCommand: Command {\n    let args: MoveNodeToWorkspaceCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache: Bool = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let window = target.windowOrNil else { return io.err(noWindowIsFocused) }\n        let subjectWs = window.nodeWorkspace\n        let targetWorkspace: Workspace\n        switch args.target.val {\n            case .relative(let nextPrev):\n                guard let subjectWs else { return io.err(\"Window \\(window.windowId) doesn't belong to any workspace\") }\n                let ws = getNextPrevWorkspace(\n                    current: subjectWs,\n                    isNext: nextPrev == .next,\n                    wrapAround: args.wrapAround,\n                    stdin: args.useStdin ? io.readStdin() : nil,\n                    target: target,\n                )\n                guard let ws else { return io.err(\"Can't resolve next or prev workspace\") }\n                targetWorkspace = ws\n            case .direct(let name):\n                targetWorkspace = Workspace.get(byName: name.raw)\n        }\n        return moveWindowToWorkspace(window, targetWorkspace, io, focusFollowsWindow: args.focusFollowsWindow, failIfNoop: args.failIfNoop)\n    }\n}\n\n@MainActor\nfunc moveWindowToWorkspace(_ window: Window, _ targetWorkspace: Workspace, _ io: CmdIo, focusFollowsWindow: Bool, failIfNoop: Bool, index: Int = INDEX_BIND_LAST) -> Bool {\n    if window.nodeWorkspace == targetWorkspace {\n        if !failIfNoop {\n            io.err(\"Window '\\(window.windowId)' already belongs to workspace '\\(targetWorkspace.name)'. Tip: use --fail-if-noop to exit with non-zero code\")\n        }\n        return !failIfNoop\n    }\n    let targetContainer: NonLeafTreeNodeObject = window.isFloating ? targetWorkspace : targetWorkspace.rootTilingContainer\n    window.bind(to: targetContainer, adaptiveWeight: WEIGHT_AUTO, index: index)\n    return focusFollowsWindow ? window.focusWindow() : true\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/MoveWorkspaceToMonitorCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct MoveWorkspaceToMonitorCommand: Command {\n    let args: MoveWorkspaceToMonitorCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        let focusedWorkspace = target.workspace\n        let prevMonitor = focusedWorkspace.workspaceMonitor\n\n        switch args.target.val.resolve(target.workspace.workspaceMonitor, wrapAround: args.wrapAround) {\n            case .success(let targetMonitor):\n                if targetMonitor.monitorId_oneBased == prevMonitor.monitorId_oneBased {\n                    return true\n                }\n                if targetMonitor.setActiveWorkspace(focusedWorkspace) {\n                    let stubWorkspace = getStubWorkspace(for: prevMonitor)\n                    check(\n                        prevMonitor.setActiveWorkspace(stubWorkspace),\n                        \"getStubWorkspace generated incompatible stub workspace (\\(stubWorkspace)) for the monitor (\\(prevMonitor)\",\n                    )\n                    return true\n                } else {\n                    return io.err(\n                        \"Can't move workspace '\\(focusedWorkspace.name)' to monitor '\\(targetMonitor.name)'. workspace-to-monitor-force-assignment doesn't allow it\",\n                    )\n                }\n            case .failure(let msg):\n                return io.err(msg)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ReloadConfigCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ReloadConfigCommand: Command {\n    let args: ReloadConfigCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        var stdout = \"\"\n        let isOk = try await reloadConfig(args: args, stdout: &stdout)\n        if !stdout.isEmpty {\n            io.out(stdout)\n        }\n        return isOk\n    }\n}\n\n@MainActor func reloadConfig(forceConfigUrl: URL? = nil) async throws -> Bool {\n    var devNull = \"\"\n    return try await reloadConfig(forceConfigUrl: forceConfigUrl, stdout: &devNull)\n}\n\n@MainActor func reloadConfig(\n    args: ReloadConfigCmdArgs = ReloadConfigCmdArgs(rawArgs: []),\n    forceConfigUrl: URL? = nil,\n    stdout: inout String,\n) async throws -> Bool {\n    let result: Bool\n    switch readConfig(forceConfigUrl: forceConfigUrl) {\n        case .success(let (parsedConfig, url)):\n            if !args.dryRun {\n                resetHotKeys()\n                config = parsedConfig\n                configUrl = url\n                try await activateMode(activeMode)\n                syncStartAtLogin()\n                MessageModel.shared.message = nil\n            }\n            result = true\n        case .failure(let msg):\n            stdout.append(msg)\n            if !args.noGui {\n                Task { @MainActor in\n                    MessageModel.shared.message = Message(description: \"AeroSpace Config Error\", body: msg)\n                }\n            }\n            result = false\n    }\n    if !args.dryRun {\n        syncConfigFileWatcher()\n    }\n    return result\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/ResizeCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct ResizeCommand: Command { // todo cover with tests\n    let args: ResizeCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n\n        let candidates = target.windowOrNil?.parentsWithSelf\n            .filter { ($0.parent as? TilingContainer)?.layout == .tiles }\n            ?? []\n\n        let orientation: Orientation?\n        let parent: TilingContainer?\n        let node: TreeNode?\n        switch args.dimension.val {\n            case .width:\n                orientation = .h\n                node = candidates.first(where: { ($0.parent as? TilingContainer)?.orientation == orientation })\n                parent = node?.parent as? TilingContainer\n            case .height:\n                orientation = .v\n                node = candidates.first(where: { ($0.parent as? TilingContainer)?.orientation == orientation })\n                parent = node?.parent as? TilingContainer\n            case .smart:\n                node = candidates.first\n                parent = node?.parent as? TilingContainer\n                orientation = parent?.orientation\n            case .smartOpposite:\n                orientation = (candidates.first?.parent as? TilingContainer)?.orientation.opposite\n                node = candidates.first(where: { ($0.parent as? TilingContainer)?.orientation == orientation })\n                parent = node?.parent as? TilingContainer\n        }\n        guard let parent else { return io.err(\"resize command doesn't support floating windows yet https://github.com/nikitabobko/AeroSpace/issues/9\") }\n        guard let orientation else { return false }\n        guard let node else { return false }\n        let diff: CGFloat = switch args.units.val {\n            case .set(let unit): CGFloat(unit) - node.getWeight(orientation)\n            case .add(let unit): CGFloat(unit)\n            case .subtract(let unit): -CGFloat(unit)\n        }\n\n        guard let childDiff = diff.div(parent.children.count - 1) else { return false }\n        parent.children.lazy\n            .filter { $0 != node }\n            .forEach { $0.setWeight(parent.orientation, $0.getWeight(parent.orientation) - childDiff) }\n\n        node.setWeight(orientation, node.getWeight(orientation) + diff)\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/SplitCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct SplitCommand: Command {\n    let args: SplitCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        if config.enableNormalizationFlattenContainers {\n            return io.err(\"'split' has no effect when 'enable-normalization-flatten-containers' normalization enabled. My recommendation: keep the normalizations enabled, and prefer 'join-with' over 'split'.\")\n        }\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        guard let window = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n        guard let parent = window.parent else { return false }\n        switch parent.cases {\n            case .workspace:\n                // Nothing to do for floating and macOS native fullscreen windows\n                return io.err(\"Can't split floating windows\")\n            case .tilingContainer(let parent):\n                let orientation: Orientation = switch args.arg.val {\n                    case .vertical: .v\n                    case .horizontal: .h\n                    case .opposite: parent.orientation.opposite\n                }\n                if parent.children.count == 1 {\n                    parent.changeOrientation(orientation)\n                } else {\n                    let data = window.unbindFromParent()\n                    let newParent = TilingContainer(\n                        parent: parent,\n                        adaptiveWeight: data.adaptiveWeight,\n                        orientation,\n                        .tiles,\n                        index: data.index,\n                    )\n                    window.bind(to: newParent, adaptiveWeight: WEIGHT_AUTO, index: 0)\n                }\n                return true\n            case .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer, .macosHiddenAppsWindowsContainer:\n                return io.err(\"Can't split macos fullscreen, minimized windows and windows of hidden apps. This behavior may change in the future\")\n            case .macosPopupWindowsContainer:\n                return false // Impossible\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/SummonWorkspaceCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct SummonWorkspaceCommand: Command {\n    let args: SummonWorkspaceCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        let workspace = Workspace.get(byName: args.target.val.raw)\n        let monitor = focus.workspace.workspaceMonitor\n        if monitor.activeWorkspace == workspace {\n            if !args.failIfNoop {\n                io.err(\"Workspace '\\(workspace.name)' is already visible on the focused monitor. Tip: use --fail-if-noop to exit with non-zero code\")\n            }\n            return !args.failIfNoop\n        }\n        if monitor.setActiveWorkspace(workspace) {\n            return workspace.focusWorkspace()\n        } else {\n            return io.err(\"Can't move workspace '\\(workspace.name)' to monitor '\\(monitor.name)'. workspace-to-monitor-force-assignment doesn't allow it\")\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/SwapCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct SwapCommand: Command {\n    let args: SwapCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache: Bool = true\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        guard let target = args.resolveTargetOrReportError(env, io) else {\n            return false\n        }\n\n        guard let currentWindow = target.windowOrNil else {\n            return io.err(noWindowIsFocused)\n        }\n\n        let targetWindow: Window?\n        switch args.target.val {\n            case .direction(let direction):\n                if let (parent, ownIndex) = currentWindow.closestParent(hasChildrenInDirection: direction, withLayout: nil) {\n                    targetWindow = parent.children[ownIndex + direction.focusOffset].findLeafWindowRecursive(snappedTo: direction.opposite)\n                } else if args.wrapAround {\n                    targetWindow = target.workspace.findLeafWindowRecursive(snappedTo: direction.opposite)\n                } else {\n                    return false\n                }\n            case .dfsRelative(let nextPrev):\n                let windows = target.workspace.rootTilingContainer.allLeafWindowsRecursive\n                guard let currentIndex = windows.firstIndex(where: { $0 == target.windowOrNil }) else {\n                    return false\n                }\n                var targetIndex = switch nextPrev {\n                    case .dfsNext: currentIndex + 1\n                    case .dfsPrev: currentIndex - 1\n                }\n                if !(0 ..< windows.count).contains(targetIndex) {\n                    if !args.wrapAround {\n                        return false\n                    }\n                    targetIndex = (targetIndex + windows.count) % windows.count\n                }\n                targetWindow = windows[targetIndex]\n        }\n\n        guard let targetWindow else {\n            return false\n        }\n\n        swapWindows(currentWindow, targetWindow)\n\n        if args.swapFocus {\n            return targetWindow.focusWindow()\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/TriggerBindingCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct TriggerBindingCommand: Command {\n    let args: TriggerBindingCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) async throws -> Bool {\n        return if let mode = config.modes[args.mode] {\n            if let binding = mode.bindings.values.first(where: { $0.descriptionWithKeyNotation == args.binding.val }) {\n                // refreshSession is not needed since commands are already run in refreshSession\n                try await binding.commands.runCmdSeq(env, io)\n            } else {\n                io.err(\"Binding '\\(args.binding.val)' is not presented in mode '\\(args.mode)'\")\n            }\n        } else {\n            io.err(\"Mode '\\(args.mode)' doesn't exist. \" +\n                \"Available modes: \\(config.modes.keys.joined(separator: \",\"))\")\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/VolumeCommand.swift",
    "content": "import AppKit\nimport Common\nimport ISSoundAdditions\n\nstruct VolumeCommand: Command {\n    let args: VolumeCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        switch args.action.val {\n            case .up:\n                Sound.output.increaseVolume(by: 0.0625, autoMuteUnmute: true)\n            case .down:\n                Sound.output.decreaseVolume(by: 0.0625, autoMuteUnmute: true)\n            case .muteToggle:\n                Sound.output.isMuted.toggle()\n            case .muteOn:\n                Sound.output.isMuted = true\n            case .muteOff:\n                Sound.output.isMuted = false\n            case .set(let int):\n                Sound.output.setVolume(Float(int) / 100, autoMuteUnmute: true)\n        }\n        if args.gui, let volume = try? Sound.output.readVolume() {\n            VolumePanel.shared.update(with: Sound.output.isMuted ? 0 : volume)\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/WorkspaceBackAndForthCommand.swift",
    "content": "import AppKit\nimport Common\n\nstruct WorkspaceBackAndForthCommand: Command {\n    let args: WorkspaceBackAndForthCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool {\n        return prevFocusedWorkspace?.focusWorkspace() != nil\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/impl/WorkspaceCommand.swift",
    "content": "import AppKit\nimport Common\nimport Foundation\n\nstruct WorkspaceCommand: Command {\n    let args: WorkspaceCmdArgs\n    /*conforms*/ let shouldResetClosedWindowsCache = false\n\n    func run(_ env: CmdEnv, _ io: CmdIo) -> Bool { // todo refactor\n        guard let target = args.resolveTargetOrReportError(env, io) else { return false }\n        let focusedWs = target.workspace\n        let workspaceName: String\n        switch args.target.val {\n            case .relative(let nextPrev):\n                let workspace = getNextPrevWorkspace(\n                    current: focusedWs,\n                    isNext: nextPrev == .next,\n                    wrapAround: args.wrapAround,\n                    stdin: args.useStdin ? io.readStdin() : nil,\n                    target: target,\n                )\n                guard let workspace else { return false }\n                workspaceName = workspace.name\n            case .direct(let name):\n                workspaceName = name.raw\n                if args.autoBackAndForth && focusedWs.name == workspaceName {\n                    return WorkspaceBackAndForthCommand(args: WorkspaceBackAndForthCmdArgs(rawArgs: [])).run(env, io)\n                }\n        }\n        if focusedWs.name == workspaceName {\n            if !args.failIfNoop {\n                io.err(\"Workspace '\\(workspaceName)' is already focused. Tip: use --fail-if-noop to exit with non-zero code\")\n            }\n            return !args.failIfNoop\n        } else {\n            return Workspace.get(byName: workspaceName).focusWorkspace()\n        }\n    }\n}\n\n@MainActor func getNextPrevWorkspace(current: Workspace, isNext: Bool, wrapAround: Bool, stdin: String?, target: LiveFocus) -> Workspace? {\n    let stdinWorkspaces: [String] = stdin?.split(separator: \"\\n\").map { String($0).trim() }.filter { !$0.isEmpty } ?? []\n    let currentMonitor = current.workspaceMonitor\n    let workspaces: [Workspace] = stdin != nil\n        ? stdinWorkspaces.map { Workspace.get(byName: $0) }\n        : Workspace.all.filter { $0.workspaceMonitor.rect.topLeftCorner == currentMonitor.rect.topLeftCorner }\n            .toSet()\n            .union([current])\n            .sorted()\n    let index = workspaces.firstIndex(where: { $0 == target.workspace }) ?? 0\n    let workspace: Workspace? = if wrapAround {\n        workspaces.get(wrappingIndex: isNext ? index + 1 : index - 1)\n    } else {\n        workspaces.getOrNil(atIndex: isNext ? index + 1 : index - 1)\n    }\n    return workspace\n}\n"
  },
  {
    "path": "Sources/AppBundle/command/parseCommand.swift",
    "content": "import Common\nimport TOMLKit\n\nfunc parseCommand(_ raw: String) -> ParsedCmd<any Command> {\n    if raw.starts(with: \"exec-and-forget\") {\n        return .cmd(ExecAndForgetCommand(args: ExecAndForgetCmdArgs(bashScript: raw.removePrefix(\"exec-and-forget\"))))\n    }\n    return switch raw.splitArgs() {\n        case .success(let args): parseCommand(args)\n        case .failure(let fail): .failure(fail)\n    }\n}\n\nfunc parseCommand(_ args: [String]) -> ParsedCmd<any Command> {\n    parseCmdArgs(args.slice).map { $0.toCommand() }\n}\n\nfunc expectedActualTypeError(expected: TOMLType, actual: TOMLType) -> String {\n    \"Expected type is '\\(expected)'. But actual type is '\\(actual)'\"\n}\n\nfunc expectedActualTypeError(expected: [TOMLType], actual: TOMLType) -> String {\n    if let single = expected.singleOrNil() {\n        return expectedActualTypeError(expected: single, actual: actual)\n    } else {\n        return \"Expected types are \\(expected.map { \"'\\($0.description)'\" }.joined(separator: \" or \")). But actual type is '\\(actual)'\"\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/Config.swift",
    "content": "import AppKit\nimport Common\nimport HotKey\nimport OrderedCollections\n\nfunc getDefaultConfigUrlFromProject() -> URL {\n    var url = URL(filePath: #filePath)\n    check(FileManager.default.fileExists(atPath: url.path))\n    while !FileManager.default.fileExists(atPath: url.appending(component: \".git\").path) {\n        url.deleteLastPathComponent()\n    }\n    let projectRoot: URL = url\n    return projectRoot.appending(component: \"docs/config-examples/default-config.toml\")\n}\n\nvar defaultConfigUrl: URL {\n    if isUnitTest {\n        return getDefaultConfigUrlFromProject()\n    } else {\n        return Bundle.main.url(forResource: \"default-config\", withExtension: \"toml\")\n            // Useful for debug builds that are not app bundles\n            ?? getDefaultConfigUrlFromProject()\n    }\n}\n@MainActor let defaultConfig: Config = {\n    let parsedConfig = parseConfig(Result { try String(contentsOf: defaultConfigUrl, encoding: .utf8) }.getOrDie())\n    if !parsedConfig.errors.isEmpty {\n        die(\"Can't parse default config: \\(parsedConfig.errors)\")\n    }\n    return parsedConfig.config\n}()\n@MainActor var config: Config = defaultConfig // todo move to Ctx?\n@MainActor var configUrl: URL = defaultConfigUrl\n\nstruct Config: ConvenienceCopyable {\n    var configVersion: Int = 1\n    var afterLoginCommand: [any Command] = []\n    var afterStartupCommand: [any Command] = []\n    var _indentForNestedContainersWithTheSameOrientation: Void = ()\n    var enableNormalizationFlattenContainers: Bool = true\n    var _nonEmptyWorkspacesRootContainersLayoutOnStartup: Void = ()\n    var defaultRootContainerLayout: Layout = .tiles\n    var defaultRootContainerOrientation: DefaultContainerOrientation = .auto\n    var startAtLogin: Bool = false\n    var autoReloadConfig: Bool = false\n    var automaticallyUnhideMacosHiddenApps: Bool = false\n    var accordionPadding: Int = 30\n    var enableNormalizationOppositeOrientationForNestedContainers: Bool = true\n    var persistentWorkspaces: OrderedSet<String> = []\n    var execOnWorkspaceChange: [String] = [] // todo deprecate\n    var keyMapping = KeyMapping()\n    var execConfig: ExecConfig = ExecConfig()\n\n    var onFocusChanged: [any Command] = []\n    // var onFocusedWorkspaceChanged: [any Command] = []\n    var onFocusedMonitorChanged: [any Command] = []\n\n    var gaps: Gaps = .zero\n    var workspaceToMonitorForceAssignment: [String: [MonitorDescription]] = [:]\n    var modes: [String: Mode] = [:]\n    var onWindowDetected: [WindowDetectedCallback] = []\n    var onModeChanged: [any Command] = []\n}\n\nenum DefaultContainerOrientation: String {\n    case horizontal, vertical, auto\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/ConfigFile.swift",
    "content": "import Common\nimport Foundation\n\nlet configDotfileName = \".aerospace.toml\"\nfunc findCustomConfigUrl() -> ConfigFile {\n    let xdgConfigHome = ProcessInfo.processInfo.environment[\"XDG_CONFIG_HOME\"].map { URL(filePath: $0) }\n        ?? FileManager.default.homeDirectoryForCurrentUser.appending(path: \".config/\")\n    let candidates: [URL] = if let configLocation = serverArgs.configLocation {\n        [URL(filePath: configLocation)]\n    } else {\n        [\n            FileManager.default.homeDirectoryForCurrentUser.appending(path: configDotfileName),\n            xdgConfigHome.appending(path: \"aerospace\").appending(path: \"aerospace.toml\"),\n        ]\n    }\n    let existingCandidates: [URL] = candidates.filter { (candidate: URL) in FileManager.default.fileExists(atPath: candidate.path) }\n    let count = existingCandidates.count\n    return switch count {\n        case 0: .noCustomConfigExists\n        case 1: .file(existingCandidates.first.orDie())\n        default: .ambiguousConfigError(existingCandidates)\n    }\n}\n\nenum ConfigFile {\n    case file(URL), ambiguousConfigError(_ candidates: [URL]), noCustomConfigExists\n\n    var urlOrNil: URL? {\n        return switch self {\n            case .file(let url): url\n            case .ambiguousConfigError, .noCustomConfigExists: nil\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/ConfigFileWatcher.swift",
    "content": "import Common\nimport Foundation\n\nprivate struct ConfigFileWatcher: ~Copyable {\n    private let source: DispatchSourceFileSystemObject\n    private let fd: Int32\n\n    init?(url: URL, onChange: @escaping @MainActor () -> Void) {\n        fd = open(url.path, O_EVTONLY)\n        if fd < 0 { return nil }\n        source = DispatchSource.makeFileSystemObjectSource(\n            fileDescriptor: fd,\n            eventMask: [.write, .delete, .rename, .revoke],\n            queue: .main,\n        )\n        source.setEventHandler { MainActor.checkIsolated { onChange() } }\n        source.setCancelHandler { [fd] in close(fd) }\n        source.activate()\n    }\n\n    deinit {\n        source.cancel()\n    }\n}\n\n@MainActor private var currentWatcher: ConfigFileWatcher? = nil\n@MainActor private var debounceTask: Task<Void, any Error>? = nil\n\nprivate let debounceDelay: Duration = .milliseconds(200)\n\n@MainActor func syncConfigFileWatcher() {\n    currentWatcher = nil\n    if !config.autoReloadConfig { return }\n    currentWatcher = ConfigFileWatcher(url: configUrl) {\n        debounceTask?.cancel()\n        debounceTask = Task {\n            try await Task.sleep(for: debounceDelay)\n            if let token: RunSessionGuard = .isServerEnabled {\n                try await runLightSession(.configAutoReload, token) {\n                    _ = try await reloadConfig()\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/DynamicConfigValue.swift",
    "content": "import Common\nimport TOMLKit\n\nstruct PerMonitorValue<Value: Equatable>: Equatable {\n    let description: MonitorDescription\n    let value: Value\n}\nextension PerMonitorValue: Sendable where Value: Sendable {}\n\nenum DynamicConfigValue<Value: Equatable>: Equatable {\n    case constant(Value)\n    case perMonitor([PerMonitorValue<Value>], default: Value)\n}\nextension DynamicConfigValue: Sendable where Value: Sendable {}\n\nextension DynamicConfigValue {\n    func getValue(for monitor: any Monitor) -> Value {\n        switch self {\n            case .constant(let value):\n                return value\n            case .perMonitor(let array, let defaultValue):\n                let sortedMonitors = sortedMonitors\n                return array\n                    .lazy\n                    .compactMap {\n                        $0.description.resolveMonitor(sortedMonitors: sortedMonitors)?.rect.topLeftCorner == monitor.rect.topLeftCorner\n                            ? $0.value\n                            : nil\n                    }\n                    .first ?? defaultValue\n        }\n    }\n}\n\nfunc parseDynamicValue<T>(\n    _ raw: TOMLValueConvertible,\n    _ valueType: T.Type,\n    _ fallback: T,\n    _ backtrace: TomlBacktrace,\n    _ errors: inout [TomlParseError],\n) -> DynamicConfigValue<T> {\n    if let simpleValue = parseSimpleType(raw) as T? {\n        return .constant(simpleValue)\n    } else if let array = raw.array {\n        if array.isEmpty {\n            errors.append(.semantic(backtrace, \"The array must not be empty\"))\n            return .constant(fallback)\n        }\n\n        guard let defaultValue = array.last.flatMap({ parseSimpleType($0) as T? }) else {\n            errors.append(.semantic(backtrace, \"The last item in the array must be of type \\(T.self)\"))\n            return .constant(fallback)\n        }\n\n        if array.dropLast().isEmpty {\n            errors.append(.semantic(backtrace, \"The array must contain at least one monitor pattern\"))\n            return .constant(fallback)\n        }\n\n        let rules: [PerMonitorValue<T>] = parsePerMonitorValues(TOMLArray(array.dropLast()), backtrace, &errors)\n\n        return .perMonitor(rules, default: defaultValue)\n    } else {\n        errors.append(.semantic(backtrace, \"Unsupported type: \\(raw.type), expected: \\(valueType) or array\"))\n        return .constant(fallback)\n    }\n}\n\nfunc parsePerMonitorValues<T>(_ array: TOMLArray, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> [PerMonitorValue<T>] {\n    array.enumerated().compactMap { (index: Int, raw: TOMLValueConvertible) -> PerMonitorValue<T>? in\n        var backtrace = backtrace + .index(index)\n\n        guard let (key, value) = raw.unwrapTableWithSingleKey(expectedKey: \"monitor\", &backtrace)\n            .flatMap({ $0.value.unwrapTableWithSingleKey(expectedKey: nil, &backtrace) })\n            .getOrNil(appendErrorTo: &errors)\n        else {\n            return nil\n        }\n\n        let monitorDescriptionResult = parseMonitorDescription(key, backtrace)\n\n        guard let monitorDescription = monitorDescriptionResult.getOrNil(appendErrorTo: &errors) else { return nil }\n\n        guard let value = parseSimpleType(value) as T? else {\n            errors.append(.semantic(backtrace, \"Expected type is '\\(T.self)'. But actual type is '\\(value.type)'\"))\n            return nil\n        }\n\n        return PerMonitorValue(description: monitorDescription, value: value)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/HotkeyBinding.swift",
    "content": "import AppKit\nimport Common\nimport Foundation\nimport HotKey\nimport TOMLKit\n\n@MainActor private var hotkeys: [String: HotKey] = [:]\n\n@MainActor func resetHotKeys() {\n    // Explicitly unregister all hotkeys. We cannot always rely on destruction of the HotKey object to trigger\n    // unregistration because we might be running inside a hotkey handler that is keeping its HotKey object alive.\n    for (_, key) in hotkeys {\n        key.isEnabled = false\n    }\n    hotkeys = [:]\n}\n\nextension HotKey {\n    var isEnabled: Bool {\n        get { !isPaused }\n        set {\n            if isEnabled != newValue {\n                isPaused = !newValue\n            }\n        }\n    }\n}\n\n@MainActor var activeMode: String? = mainModeId\n@MainActor func activateMode(_ targetMode: String?) async throws {\n    let targetBindings = targetMode.flatMap { config.modes[$0] }?.bindings ?? [:]\n    for binding in targetBindings.values where !hotkeys.keys.contains(binding.descriptionWithKeyCode) {\n        hotkeys[binding.descriptionWithKeyCode] = HotKey(key: binding.keyCode, modifiers: binding.modifiers, keyDownHandler: {\n            Task {\n                if let activeMode {\n                    broadcastEvent(.bindingTriggered(\n                        mode: activeMode,\n                        binding: binding.descriptionWithKeyNotation,\n                    ))\n                    try await runLightSession(.hotkeyBinding, .checkServerIsEnabledOrDie()) { () throws in\n                        _ = try await config.modes[activeMode]?.bindings[binding.descriptionWithKeyCode]?.commands\n                            .runCmdSeq(.defaultEnv, .emptyStdin)\n                    }\n                }\n            }\n        })\n    }\n    for (binding, key) in hotkeys {\n        if targetBindings.keys.contains(binding) {\n            key.isEnabled = true\n        } else {\n            key.isEnabled = false\n        }\n    }\n    let oldMode = activeMode\n    activeMode = targetMode\n    if oldMode != targetMode {\n        broadcastEvent(.modeChanged(mode: targetMode))\n        if !config.onModeChanged.isEmpty {\n            guard let token: RunSessionGuard = .isServerEnabled else { return }\n            try await runLightSession(.onModeChanged, token) {\n                _ = try await config.onModeChanged.runCmdSeq(.defaultEnv, .emptyStdin)\n            }\n        }\n    }\n}\n\nstruct HotkeyBinding: Equatable, Sendable {\n    let modifiers: NSEvent.ModifierFlags\n    let keyCode: Key\n    let commands: [any Command]\n    let descriptionWithKeyCode: String\n    let descriptionWithKeyNotation: String\n\n    init(_ modifiers: NSEvent.ModifierFlags, _ keyCode: Key, _ commands: [any Command], descriptionWithKeyNotation: String) {\n        self.modifiers = modifiers\n        self.keyCode = keyCode\n        self.commands = commands\n        self.descriptionWithKeyCode = modifiers.isEmpty\n            ? keyCode.toString()\n            : modifiers.toString() + \"-\" + keyCode.toString()\n        self.descriptionWithKeyNotation = descriptionWithKeyNotation\n    }\n\n    static func == (lhs: HotkeyBinding, rhs: HotkeyBinding) -> Bool {\n        lhs.modifiers == rhs.modifiers &&\n            lhs.keyCode == rhs.keyCode &&\n            lhs.descriptionWithKeyCode == rhs.descriptionWithKeyCode &&\n            zip(lhs.commands, rhs.commands).allSatisfy { $0.equals($1) }\n    }\n}\n\nfunc parseBindings(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError], _ mapping: [String: Key]) -> [String: HotkeyBinding] {\n    guard let rawTable = raw.table else {\n        errors += [expectedActualTypeError(expected: .table, actual: raw.type, backtrace)]\n        return [:]\n    }\n    var result: [String: HotkeyBinding] = [:]\n    for (binding, rawCommand): (String, TOMLValueConvertible) in rawTable {\n        let backtrace = backtrace + .key(binding)\n        let binding = parseBinding(binding, backtrace, mapping)\n            .flatMap { modifiers, key -> ParsedToml<HotkeyBinding> in\n                parseCommandOrCommands(rawCommand).toParsedToml(backtrace).map {\n                    HotkeyBinding(modifiers, key, $0, descriptionWithKeyNotation: binding)\n                }\n            }\n            .getOrNil(appendErrorTo: &errors)\n        if let binding {\n            if result.keys.contains(binding.descriptionWithKeyCode) {\n                errors.append(.semantic(backtrace, \"'\\(binding.descriptionWithKeyCode)' Binding redeclaration\"))\n            }\n            result[binding.descriptionWithKeyCode] = binding\n        }\n    }\n    return result\n}\n\nfunc parseBinding(_ raw: String, _ backtrace: TomlBacktrace, _ mapping: [String: Key]) -> ParsedToml<(NSEvent.ModifierFlags, Key)> {\n    let rawKeys = raw.split(separator: \"-\")\n    let modifiers: ParsedToml<NSEvent.ModifierFlags> = rawKeys.dropLast()\n        .mapAllOrFailure {\n            modifiersMap[String($0)].orFailure(.semantic(backtrace, \"Can't parse modifiers in '\\(raw)' binding\"))\n        }\n        .map { NSEvent.ModifierFlags($0) }\n    let key: ParsedToml<Key> = rawKeys.last.flatMap { mapping[String($0)] }\n        .orFailure(.semantic(backtrace, \"Can't parse the key in '\\(raw)' binding\"))\n    return modifiers.flatMap { modifiers -> ParsedToml<(NSEvent.ModifierFlags, Key)> in\n        key.flatMap { key -> ParsedToml<(NSEvent.ModifierFlags, Key)> in\n            .success((modifiers, key))\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/Mode.swift",
    "content": "import Common\nimport HotKey\nimport TOMLKit\n\nstruct Mode: ConvenienceCopyable, Equatable, Sendable {\n    var bindings: [String: HotkeyBinding]\n\n    static let zero = Mode(bindings: [:])\n}\n\nfunc parseModes(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError], _ mapping: [String: Key]) -> [String: Mode] {\n    guard let rawTable = raw.table else {\n        errors += [expectedActualTypeError(expected: .table, actual: raw.type, backtrace)]\n        return [:]\n    }\n    var result: [String: Mode] = [:]\n    for (key, value) in rawTable {\n        result[key] = parseMode(value, backtrace + .key(key), &errors, mapping)\n    }\n    if !result.keys.contains(mainModeId) {\n        errors += [.semantic(backtrace, \"Please specify '\\(mainModeId)' mode\")]\n    }\n    return result\n}\n\nfunc parseMode(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError], _ mapping: [String: Key]) -> Mode {\n    guard let rawTable: TOMLTable = raw.table else {\n        errors += [expectedActualTypeError(expected: .table, actual: raw.type, backtrace)]\n        return .zero\n    }\n\n    var result: Mode = .zero\n    for (key, value) in rawTable {\n        let backtrace = backtrace + .key(key)\n        switch key {\n            case \"binding\":\n                result.bindings = parseBindings(value, backtrace, &errors, mapping)\n            default:\n                errors += [unknownKeyError(backtrace)]\n        }\n    }\n    return result\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/keysMap.swift",
    "content": "import AppKit\nimport Common\nimport HotKey\n\nprivate let minus = \"minus\"\nprivate let equal = \"equal\"\n\nprivate let q = \"q\"\nprivate let w = \"w\"\nprivate let e = \"e\"\nprivate let r = \"r\"\nprivate let t = \"t\"\nprivate let y = \"y\"\nprivate let u = \"u\"\nprivate let i = \"i\"\nprivate let o = \"o\"\nprivate let p = \"p\"\nprivate let leftSquareBracket = \"leftSquareBracket\"\nprivate let rightSquareBracket = \"rightSquareBracket\"\nprivate let backslash = \"backslash\"\nprivate let sectionSign = \"sectionSign\"\n\nprivate let a = \"a\"\nprivate let s = \"s\"\nprivate let d = \"d\"\nprivate let f = \"f\"\nprivate let g = \"g\"\nprivate let h = \"h\"\nprivate let j = \"j\"\nprivate let k = \"k\"\nprivate let l = \"l\"\nprivate let semicolon = \"semicolon\"\nprivate let quote = \"quote\"\n\nprivate let z = \"z\"\nprivate let x = \"x\"\nprivate let c = \"c\"\nprivate let v = \"v\"\nprivate let b = \"b\"\nprivate let n = \"n\"\nprivate let m = \"m\"\nprivate let comma = \"comma\"\nprivate let period = \"period\"\nprivate let slash = \"slash\"\n\nfunc getKeysPreset(_ layout: KeyMapping.Preset) -> [String: Key] {\n    return switch layout {\n        case .qwerty: keyNotationToKeyCode\n        case .dvorak: dvorakMap\n        case .colemak: colemakMap\n    }\n}\n\nextension Key: @unchecked @retroactive Sendable {}\n\nlet keyNotationToKeyCode: [String: Key] = [\n    sectionSign: .section,\n    \"0\": .zero,\n    \"1\": .one,\n    \"2\": .two,\n    \"3\": .three,\n    \"4\": .four,\n    \"5\": .five,\n    \"6\": .six,\n    \"7\": .seven,\n    \"8\": .eight,\n    \"9\": .nine,\n    minus: .minus,\n    equal: .equal,\n\n    q: .q,\n    w: .w,\n    e: .e,\n    r: .r,\n    t: .t,\n    y: .y,\n    u: .u,\n    i: .i,\n    o: .o,\n    p: .p,\n    leftSquareBracket: .leftBracket,\n    rightSquareBracket: .rightBracket,\n    backslash: .backslash,\n\n    a: .a,\n    s: .s,\n    d: .d,\n    f: .f,\n    g: .g,\n    h: .h,\n    j: .j,\n    k: .k,\n    l: .l,\n    semicolon: .semicolon,\n    quote: .quote,\n\n    z: .z,\n    x: .x,\n    c: .c,\n    v: .v,\n    b: .b,\n    n: .n,\n    m: .m,\n    comma: .comma,\n    period: .period,\n    slash: .slash,\n\n    \"keypad0\": .keypad0,\n    \"keypad1\": .keypad1,\n    \"keypad2\": .keypad2,\n    \"keypad3\": .keypad3,\n    \"keypad4\": .keypad4,\n    \"keypad5\": .keypad5,\n    \"keypad6\": .keypad6,\n    \"keypad7\": .keypad7,\n    \"keypad8\": .keypad8,\n    \"keypad9\": .keypad9,\n    \"keypadClear\": .keypadClear,\n    \"keypadDecimalMark\": .keypadDecimal,\n    \"keypadDivide\": .keypadDivide,\n    \"keypadEnter\": .keypadEnter,\n    \"keypadEqual\": .keypadEquals,\n    \"keypadMinus\": .keypadMinus,\n    \"keypadMultiply\": .keypadMultiply,\n    \"keypadPlus\": .keypadPlus,\n\n    \"pageUp\": .pageUp,\n    \"pageDown\": .pageDown,\n    \"home\": .home,\n    \"end\": .end,\n    \"forwardDelete\": .forwardDelete,\n\n    \"f1\": .f1,\n    \"f2\": .f2,\n    \"f3\": .f3,\n    \"f4\": .f4,\n    \"f5\": .f5,\n    \"f6\": .f6,\n    \"f7\": .f7,\n    \"f8\": .f8,\n    \"f9\": .f9,\n    \"f10\": .f10,\n    \"f11\": .f11,\n    \"f12\": .f12,\n    \"f13\": .f13,\n    \"f14\": .f14,\n    \"f15\": .f15,\n    \"f16\": .f16,\n    \"f17\": .f17,\n    \"f18\": .f18,\n    \"f19\": .f19,\n    \"f20\": .f20,\n\n    \"backtick\": .grave,\n    \"space\": .space,\n    \"enter\": .return,\n    \"esc\": .escape,\n    \"backspace\": .delete,\n    \"tab\": .tab,\n\n    \"left\": .leftArrow,\n    \"down\": .downArrow,\n    \"up\": .upArrow,\n    \"right\": .rightArrow,\n]\n\nprivate let dvorakMap: [String: Key] = keyNotationToKeyCode + [\n    leftSquareBracket: .minus,\n    rightSquareBracket: .equal,\n\n    quote: .q,\n    comma: .w,\n    period: .e,\n    p: .r,\n    y: .t,\n    f: .y,\n    g: .u,\n    c: .i,\n    r: .o,\n    l: .p,\n    slash: .leftBracket, // leftBracket -> leftSquareBracket\n    equal: .rightBracket, // rightBracket -> rightSquareBracket\n    backslash: .backslash,\n\n    a: .a,\n    o: .s,\n    e: .d,\n    u: .f,\n    i: .g,\n    d: .h,\n    h: .j,\n    t: .k,\n    n: .l,\n    s: .semicolon,\n    minus: .quote,\n\n    semicolon: .z,\n    q: .x,\n    j: .c,\n    k: .v,\n    x: .b,\n    b: .n,\n    m: .m,\n    w: .comma,\n    v: .period,\n    z: .slash,\n]\n\nprivate let colemakMap: [String: Key] = keyNotationToKeyCode + [\n    q: .q,\n    w: .w,\n    f: .e,\n    p: .r,\n    g: .t,\n    j: .y,\n    l: .u,\n    u: .i,\n    y: .o,\n    semicolon: .p,\n    leftSquareBracket: .leftBracket,\n    rightSquareBracket: .rightBracket,\n    backslash: .backslash,\n\n    a: .a,\n    r: .s,\n    s: .d,\n    t: .f,\n    d: .g,\n    h: .h,\n    n: .j,\n    e: .k,\n    i: .l,\n    o: .semicolon,\n    quote: .quote,\n\n    z: .z,\n    x: .x,\n    c: .c,\n    v: .v,\n    b: .b,\n    k: .n,\n    m: .m,\n    comma: .comma,\n    period: .period,\n    slash: .slash,\n]\n\nlet modifiersMap: [String: NSEvent.ModifierFlags] = [\n    \"shift\": .shift,\n    \"alt\": .option,\n    \"ctrl\": .control,\n    \"cmd\": .command,\n]\n\nextension NSEvent.ModifierFlags {\n    func toString() -> String {\n        var result: [String] = []\n        if contains(.option) { result.append(\"alt\") }\n        if contains(.control) { result.append(\"ctrl\") }\n        if contains(.command) { result.append(\"cmd\") }\n        if contains(.shift) { result.append(\"shift\") }\n        return result.joined(separator: \"-\")\n    }\n}\n\nextension Key {\n    func toString() -> String {\n        switch self {\n            case .a: \"a\"\n            case .b: \"b\"\n            case .c: \"c\"\n            case .d: \"d\"\n            case .e: \"e\"\n            case .f: \"f\"\n            case .g: \"g\"\n            case .h: \"h\"\n            case .i: \"i\"\n            case .j: \"j\"\n            case .k: \"k\"\n            case .l: \"l\"\n            case .m: \"m\"\n            case .n: \"n\"\n            case .o: \"o\"\n            case .p: \"p\"\n            case .q: \"q\"\n            case .r: \"r\"\n            case .s: \"s\"\n            case .t: \"t\"\n            case .u: \"u\"\n            case .v: \"v\"\n            case .w: \"w\"\n            case .x: \"x\"\n            case .y: \"y\"\n            case .z: \"z\"\n\n            case .zero: \"0\"\n            case .one: \"1\"\n            case .two: \"2\"\n            case .three: \"3\"\n            case .four: \"4\"\n            case .five: \"5\"\n            case .six: \"6\"\n            case .seven: \"7\"\n            case .eight: \"8\"\n            case .nine: \"9\"\n\n            case .period: \"period\"\n            case .quote: \"quote\"\n            case .leftBracket: \"leftSquareBracket\"\n            case .rightBracket: \"rightSquareBracket\"\n            case .semicolon: \"semicolon\"\n            case .slash: \"slash\"\n            case .backslash: \"backslash\"\n            case .comma: \"comma\"\n            case .equal: \"equal\"\n            case .grave: \"backtick\"\n            case .minus: \"minus\"\n            case .space: \"space\"\n            case .tab: \"tab\"\n            case .return: \"enter\"\n            case .pageUp: \"pageUp\"\n            case .pageDown: \"pageDown\"\n            case .home: \"home\"\n            case .end: \"end\"\n            case .leftArrow: \"left\"\n            case .downArrow: \"down\"\n            case .upArrow: \"up\"\n            case .rightArrow: \"right\"\n            case .escape: \"esc\"\n            case .delete: \"backspace\"\n            case .section: \"sectionSign\"\n\n            case .f1: \"f1\"\n            case .f2: \"f2\"\n            case .f3: \"f3\"\n            case .f4: \"f4\"\n            case .f5: \"f5\"\n            case .f6: \"f6\"\n            case .f7: \"f7\"\n            case .f8: \"f8\"\n            case .f9: \"f9\"\n            case .f10: \"f10\"\n            case .f11: \"f11\"\n            case .f12: \"f12\"\n            case .f13: \"f13\"\n            case .f14: \"f14\"\n            case .f15: \"f15\"\n            case .f16: \"f16\"\n            case .f17: \"f17\"\n            case .f18: \"f18\"\n            case .f19: \"f19\"\n            case .f20: \"f20\"\n\n            case .keypad0: \"keypad0\"\n            case .keypad1: \"keypad1\"\n            case .keypad2: \"keypad2\"\n            case .keypad3: \"keypad3\"\n            case .keypad4: \"keypad4\"\n            case .keypad5: \"keypad5\"\n            case .keypad6: \"keypad6\"\n            case .keypad7: \"keypad7\"\n            case .keypad8: \"keypad8\"\n            case .keypad9: \"keypad9\"\n            case .keypadClear: \"keypadClear\"\n            case .keypadDecimal: \"keypadDecimalMark\"\n            case .keypadDivide: \"keypadDivide\"\n            case .keypadEnter: \"keypadEnter\"\n            case .keypadEquals: \"keypadEqual\"\n            case .keypadMinus: \"keypadMinus\"\n            case .keypadMultiply: \"keypadMultiply\"\n            case .keypadPlus: \"keypadPlus\"\n\n            // wtf\n            case .command: \"cmd\"\n            case .rightCommand: \"rCmd\"\n            case .option: \"alt\"\n            case .rightOption: \"rAlt\"\n            case .control: \"ctrl\"\n            case .rightControl: \"rCtrl\"\n            case .shift: \"shift\"\n            case .rightShift: \"rShift\"\n            case .function: \"function\"\n            case .capsLock: \"capsLock\"\n            case .forwardDelete: \"forwardDelete\"\n            case .help: \"help\"\n            case .volumeUp: \"volumeUp\"\n            case .volumeDown: \"volumeDown\"\n            case .mute: \"mute\"\n        }\n    }\n}\n\n// doesn't work :(\n//extension NSEvent.ModifierFlags {\n//    static let lOption = NSEvent.ModifierFlags(rawValue: 1 << 1)\n//    static let rOption = NSEvent.ModifierFlags(rawValue: 1 << 2)\n//    static let lShift = NSEvent.ModifierFlags(rawValue: 0x00000002)\n//    static let rShift = NSEvent.ModifierFlags(rawValue: 0x00000004)\n//    static let lCommand = NSEvent.ModifierFlags(rawValue: 1 << 7)\n//    static let rCommand = NSEvent.ModifierFlags(rawValue: 0x00000010)\n//}\n\n// NSEvent.ModifierFlags.command.rawValue // 1 << 20\n// NSEvent.ModifierFlags.option.rawValue // 1 << 19\n// NSEvent.ModifierFlags.control.rawValue // 1 << 18\n// NSEvent.ModifierFlags.shift.rawValue // 1 << 17\n// https://github.com/koekeishiya/skhd/blob/master/src/hotkey.h\n"
  },
  {
    "path": "Sources/AppBundle/config/parseConfig.swift",
    "content": "import AppKit\nimport Common\nimport HotKey\nimport TOMLKit\nimport OrderedCollections\n\n@MainActor\nfunc readConfig(forceConfigUrl: URL? = nil) -> Result<(Config, URL), String> {\n    let configUrl: URL\n    if let forceConfigUrl {\n        configUrl = forceConfigUrl\n    } else {\n        switch findCustomConfigUrl() {\n            case .file(let url): configUrl = url\n            case .noCustomConfigExists: configUrl = defaultConfigUrl\n            case .ambiguousConfigError(let candidates):\n                let msg = \"\"\"\n                    Ambiguous config error. Several configs found:\n                    \\(candidates.map(\\.path).joined(separator: \"\\n\"))\n                    \"\"\"\n                return .failure(msg)\n        }\n    }\n    let (parsedConfig, errors) = (try? String(contentsOf: configUrl, encoding: .utf8)).map { parseConfig($0) } ?? (defaultConfig, [])\n\n    if errors.isEmpty {\n        return .success((parsedConfig, configUrl))\n    } else {\n        let msg = \"\"\"\n            Failed to parse \\(configUrl.absoluteURL.path)\n\n            \\(errors.map(\\.description).joined(separator: \"\\n\\n\"))\n            \"\"\"\n        return .failure(msg)\n    }\n}\n\nenum TomlParseError: Error, CustomStringConvertible, Equatable {\n    case semantic(_ backtrace: TomlBacktrace, _ message: String)\n    case syntax(_ message: String)\n\n    var description: String {\n        return switch self {\n            // todo Make 'split' + flatten normalization prettier\n            case .semantic(let backtrace, let message) where backtrace.description.isEmpty: message\n            case .semantic(let backtrace, let message): \"\\(backtrace): \\(message)\"\n            case .syntax(let message): message\n        }\n    }\n}\n\ntypealias ParsedToml<T> = Result<T, TomlParseError>\n\nextension ParserProtocol {\n    func transformRawConfig(_ raw: S,\n                            _ value: TOMLValueConvertible,\n                            _ backtrace: TomlBacktrace,\n                            _ errors: inout [TomlParseError]) -> S\n    {\n        if let value = parse(value, backtrace, &errors).getOrNil(appendErrorTo: &errors) {\n            return raw.copy(keyPath, value)\n        }\n        return raw\n    }\n}\n\nprotocol ParserProtocol<S>: Sendable {\n    associatedtype T\n    associatedtype S where S: ConvenienceCopyable\n    var keyPath: SendableWritableKeyPath<S, T> { get }\n    var parse: @Sendable (TOMLValueConvertible, TomlBacktrace, inout [TomlParseError]) -> ParsedToml<T> { get }\n}\n\nstruct Parser<S: ConvenienceCopyable, T>: ParserProtocol {\n    let keyPath: SendableWritableKeyPath<S, T>\n    let parse: @Sendable (TOMLValueConvertible, TomlBacktrace, inout [TomlParseError]) -> ParsedToml<T>\n\n    init(_ keyPath: SendableWritableKeyPath<S, T>, _ parse: @escaping @Sendable (TOMLValueConvertible, TomlBacktrace, inout [TomlParseError]) -> T) {\n        self.keyPath = keyPath\n        self.parse = { raw, backtrace, errors -> ParsedToml<T> in .success(parse(raw, backtrace, &errors)) }\n    }\n\n    init(_ keyPath: SendableWritableKeyPath<S, T>, _ parse: @escaping @Sendable (TOMLValueConvertible, TomlBacktrace) -> ParsedToml<T>) {\n        self.keyPath = keyPath\n        self.parse = { raw, backtrace, _ -> ParsedToml<T> in parse(raw, backtrace) }\n    }\n}\n\nprivate let keyMappingConfigRootKey = \"key-mapping\"\nprivate let modeConfigRootKey = \"mode\"\nprivate let persistentWorkspacesKey = \"persistent-workspaces\"\n\n// For every new config option you add, think:\n// 1. Does it make sense to have different value\n// 2. Prefer commands and commands flags over toml options if possible\nprivate let configParser: [String: any ParserProtocol<Config>] = [\n    \"config-version\": Parser(\\.configVersion, parseConfigVersion),\n\n    \"after-login-command\": Parser(\\.afterLoginCommand, parseAfterLoginCommand),\n    \"after-startup-command\": Parser(\\.afterStartupCommand) { parseCommandOrCommands($0).toParsedToml($1) },\n\n    \"on-focus-changed\": Parser(\\.onFocusChanged) { parseCommandOrCommands($0).toParsedToml($1) },\n    \"on-mode-changed\": Parser(\\.onModeChanged) { parseCommandOrCommands($0).toParsedToml($1) },\n    \"on-focused-monitor-changed\": Parser(\\.onFocusedMonitorChanged) { parseCommandOrCommands($0).toParsedToml($1) },\n    // \"on-focused-workspace-changed\": Parser(\\.onFocusedWorkspaceChanged, { parseCommandOrCommands($0).toParsedToml($1) }),\n\n    \"enable-normalization-flatten-containers\": Parser(\\.enableNormalizationFlattenContainers, parseBool),\n    \"enable-normalization-opposite-orientation-for-nested-containers\": Parser(\\.enableNormalizationOppositeOrientationForNestedContainers, parseBool),\n\n    \"default-root-container-layout\": Parser(\\.defaultRootContainerLayout, parseLayout),\n    \"default-root-container-orientation\": Parser(\\.defaultRootContainerOrientation, parseDefaultContainerOrientation),\n\n    \"start-at-login\": Parser(\\.startAtLogin, parseBool),\n    \"auto-reload-config\": Parser(\\.autoReloadConfig, parseBool),\n    \"automatically-unhide-macos-hidden-apps\": Parser(\\.automaticallyUnhideMacosHiddenApps, parseBool),\n    \"accordion-padding\": Parser(\\.accordionPadding, parseInt),\n    persistentWorkspacesKey: Parser(\\.persistentWorkspaces, parsePersistentWorkspaces),\n    \"exec-on-workspace-change\": Parser(\\.execOnWorkspaceChange, parseArrayOfStrings),\n    \"exec\": Parser(\\.execConfig, parseExecConfig),\n\n    keyMappingConfigRootKey: Parser(\\.keyMapping, skipParsing(Config().keyMapping)), // Parsed manually\n    modeConfigRootKey: Parser(\\.modes, skipParsing(Config().modes)), // Parsed manually\n\n    \"gaps\": Parser(\\.gaps, parseGaps),\n    \"workspace-to-monitor-force-assignment\": Parser(\\.workspaceToMonitorForceAssignment, parseWorkspaceToMonitorAssignment),\n    \"on-window-detected\": Parser(\\.onWindowDetected, parseOnWindowDetectedArray),\n\n    // Deprecated\n    \"non-empty-workspaces-root-containers-layout-on-startup\": Parser(\\._nonEmptyWorkspacesRootContainersLayoutOnStartup, parseStartupRootContainerLayout),\n    \"indent-for-nested-containers-with-the-same-orientation\": Parser(\\._indentForNestedContainersWithTheSameOrientation, parseIndentForNestedContainersWithTheSameOrientation),\n]\n\nextension ParsedCmd where T == any Command {\n    fileprivate func toEither() -> Parsed<T> {\n        return switch self {\n            case .cmd(let a):\n                a.info.allowInConfig\n                    ? .success(a)\n                    : .failure(\"Command '\\(a.info.kind.rawValue)' cannot be used in config\")\n            case .help(let a): .failure(a)\n            case .failure(let a): .failure(a)\n        }\n    }\n}\n\nextension Command {\n    fileprivate var isMacOsNativeCommand: Bool { // Problem ID-B6E178F2\n        self is MacosNativeMinimizeCommand || self is MacosNativeFullscreenCommand\n    }\n}\n\nfunc parseAfterLoginCommand(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<[any Command]> {\n    if let array = raw.array, array.count == 0 {\n        return .success([])\n    }\n    let msg = \"after-login-command is deprecated since AeroSpace 0.19.0. https://github.com/nikitabobko/AeroSpace/issues/1482\"\n    return .failure(.semantic(backtrace, msg))\n}\n\nfunc parseCommandOrCommands(_ raw: TOMLValueConvertible) -> Parsed<[any Command]> {\n    if let rawString = raw.string {\n        return parseCommand(rawString).toEither().map { [$0] }\n    } else if let rawArray = raw.array {\n        let commands: Parsed<[any Command]> = (0 ..< rawArray.count).mapAllOrFailure { index in\n            let rawString: String = rawArray[index].string ?? expectedActualTypeError(expected: .string, actual: rawArray[index].type)\n            return parseCommand(rawString).toEither()\n        }\n        return commands.filter(\"macos-native-* commands are only allowed to be the last commands in the list\") {\n            !$0.dropLast().contains(where: { $0.isMacOsNativeCommand })\n        }\n    } else {\n        return .failure(expectedActualTypeError(expected: [.string, .array], actual: raw.type))\n    }\n}\n\n@MainActor func parseConfig(_ rawToml: String) -> (config: Config, errors: [TomlParseError]) { // todo change return value to Result\n    let rawTable: TOMLTable\n    do {\n        rawTable = try TOMLTable(string: rawToml)\n    } catch let e as TOMLParseError {\n        return (defaultConfig, [.syntax(e.debugDescription)])\n    } catch let e {\n        return (defaultConfig, [.syntax(e.localizedDescription)])\n    }\n\n    var errors: [TomlParseError] = []\n\n    var config = rawTable.parseTable(Config(), configParser, .emptyRoot, &errors)\n\n    if let mapping = rawTable[keyMappingConfigRootKey].flatMap({ parseKeyMapping($0, .rootKey(keyMappingConfigRootKey), &errors) }) {\n        config.keyMapping = mapping\n    }\n\n    // Parse modeConfigRootKey after keyMappingConfigRootKey\n    if let modes = rawTable[modeConfigRootKey].flatMap({ parseModes($0, .rootKey(modeConfigRootKey), &errors, config.keyMapping.resolve()) }) {\n        config.modes = modes\n    }\n\n    if config.configVersion <= 1 {\n        if rawTable.contains(key: persistentWorkspacesKey) {\n            errors += [.semantic(.rootKey(persistentWorkspacesKey), \"This config option is only available since 'config-version = 2'\")]\n        }\n        config.persistentWorkspaces = (config.modes.values.lazy\n            .flatMap { (mode: Mode) -> [HotkeyBinding] in Array(mode.bindings.values) }\n            .flatMap { (binding: HotkeyBinding) -> [String] in\n                binding.commands.filterIsInstance(of: WorkspaceCommand.self).compactMap { $0.args.target.val.workspaceNameOrNil()?.raw } +\n                    binding.commands.filterIsInstance(of: MoveNodeToWorkspaceCommand.self).compactMap { $0.args.target.val.workspaceNameOrNil()?.raw }\n            }\n            + (config.workspaceToMonitorForceAssignment).keys)\n            .toOrderedSet()\n    }\n\n    if config.enableNormalizationFlattenContainers {\n        let containsSplitCommand = config.modes.values.lazy.flatMap { $0.bindings.values }\n            .flatMap { $0.commands }\n            .contains { $0 is SplitCommand }\n        if containsSplitCommand {\n            errors += [.semantic(\n                .emptyRoot, // todo Make 'split' + flatten normalization prettier\n                \"\"\"\n                The config contains:\n                1. usage of 'split' command\n                2. enable-normalization-flatten-containers = true\n                These two settings don't play nicely together. 'split' command has no effect when enable-normalization-flatten-containers is disabled.\n\n                My recommendation: keep the normalizations enabled, and prefer 'join-with' over 'split'.\n                \"\"\",\n            )]\n        }\n    }\n    return (config, errors)\n}\n\nfunc parseIndentForNestedContainersWithTheSameOrientation(\n    _ _: TOMLValueConvertible,\n    _ backtrace: TomlBacktrace,\n) -> ParsedToml<Void> {\n    let msg = \"Deprecated. Please drop it from the config. See https://github.com/nikitabobko/AeroSpace/issues/96\"\n    return .failure(.semantic(backtrace, msg))\n}\n\nfunc parseConfigVersion(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<Int> {\n    let min = 1\n    let max = 2\n    return parseInt(raw, backtrace)\n        .filter(.semantic(backtrace, \"Must be in [\\(min), \\(max)] range\")) { (min ... max).contains($0) }\n}\n\nfunc parseInt(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<Int> {\n    raw.int.orFailure(expectedActualTypeError(expected: .int, actual: raw.type, backtrace))\n}\n\nfunc parseString(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<String> {\n    raw.string.orFailure(expectedActualTypeError(expected: .string, actual: raw.type, backtrace))\n}\n\nfunc parseSimpleType<T>(_ raw: TOMLValueConvertible) -> T? {\n    (raw.int as? T) ?? (raw.string as? T) ?? (raw.bool as? T)\n}\n\nextension TOMLValueConvertible {\n    func unwrapTableWithSingleKey(expectedKey: String? = nil, _ backtrace: inout TomlBacktrace) -> ParsedToml<(key: String, value: TOMLValueConvertible)> {\n        guard let table else {\n            return .failure(expectedActualTypeError(expected: .table, actual: type, backtrace))\n        }\n        let singleKeyError: TomlParseError = .semantic(\n            backtrace,\n            expectedKey != nil\n                ? \"The table is expected to have a single key '\\(expectedKey.orDie())'\"\n                : \"The table is expected to have a single key\",\n        )\n        guard let (actualKey, value): (String, TOMLValueConvertible) = table.count == 1 ? table.first : nil else {\n            return .failure(singleKeyError)\n        }\n        if expectedKey != nil && expectedKey != actualKey {\n            return .failure(singleKeyError)\n        }\n        backtrace = backtrace + .key(actualKey)\n        return .success((actualKey, value))\n    }\n}\n\nfunc parseTomlArray(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<TOMLArray> {\n    raw.array.orFailure(expectedActualTypeError(expected: .array, actual: raw.type, backtrace))\n}\n\nfunc parseTable<T: ConvenienceCopyable>(\n    _ raw: TOMLValueConvertible,\n    _ initial: T,\n    _ fieldsParser: [String: any ParserProtocol<T>],\n    _ backtrace: TomlBacktrace,\n    _ errors: inout [TomlParseError],\n) -> T {\n    guard let table = raw.table else {\n        errors.append(expectedActualTypeError(expected: .table, actual: raw.type, backtrace))\n        return initial\n    }\n    return table.parseTable(initial, fieldsParser, backtrace, &errors)\n}\n\nprivate func parseStartupRootContainerLayout(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<Void> {\n    parseString(raw, backtrace)\n        .filter(.semantic(backtrace, \"'non-empty-workspaces-root-containers-layout-on-startup' is deprecated. Please drop it from your config\")) { raw in raw == \"smart\" }\n        .map { _ in () }\n}\n\nprivate func parseLayout(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<Layout> {\n    parseString(raw, backtrace)\n        .flatMap { $0.parseLayout().orFailure(.semantic(backtrace, \"Can't parse layout '\\($0)'\")) }\n}\n\nprivate func skipParsing<T: Sendable>(_ value: T) -> @Sendable (_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<T> {\n    { _, _ in .success(value) }\n}\n\nprivate func parsePersistentWorkspaces(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<OrderedSet<String>> {\n    parseArrayOfStrings(raw, backtrace)\n        .flatMap { arr in\n            let set = arr.toOrderedSet()\n            return set.count == arr.count ? .success(set) : .failure(.semantic(backtrace, \"Contains duplicated workspace names\"))\n        }\n}\n\nprivate func parseArrayOfStrings(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<[String]> {\n    parseTomlArray(raw, backtrace)\n        .flatMap { arr in\n            arr.enumerated().mapAllOrFailure { (index, elem) in\n                parseString(elem, backtrace + .index(index))\n            }\n        }\n}\n\nprivate func parseDefaultContainerOrientation(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<DefaultContainerOrientation> {\n    parseString(raw, backtrace).flatMap {\n        DefaultContainerOrientation(rawValue: $0)\n            .orFailure(.semantic(backtrace, \"Can't parse default container orientation '\\($0)'\"))\n    }\n}\n\nextension Parsed where Failure == String {\n    func toParsedToml(_ backtrace: TomlBacktrace) -> ParsedToml<Success> {\n        mapError { .semantic(backtrace, $0) }\n    }\n}\n\nfunc parseBool(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<Bool> {\n    raw.bool.orFailure(expectedActualTypeError(expected: .bool, actual: raw.type, backtrace))\n}\n\nstruct TomlBacktrace: CustomStringConvertible, Equatable {\n    private var path: [TomlBacktraceItem] = []\n    private init(_ path: [TomlBacktraceItem]) {\n        check(path.first?.isKey != false, \"Tried to construct invalid TOML path: \\(path)\")\n        self.path = path\n    }\n\n    static func rootKey(_ key: String) -> Self { .init([.key(key)]) }\n    static let emptyRoot: Self = .init([])\n\n    var description: String {\n        var result = \"\"\n        for (i, elem) in path.enumerated() {\n            switch elem {\n                case .key(let rootKey) where i == 0: result += rootKey\n                case .key(let key): result += \".\\(key)\"\n                case .index(let index): result += \"[\\(index)]\"\n            }\n        }\n        return result\n    }\n\n    var isRootKey: Bool { path.singleOrNil().map(\\.isKey) == true }\n\n    static func + (lhs: Self, rhs: TomlBacktraceItem) -> Self {\n        var result = lhs\n        result.path += [rhs]\n        return result\n    }\n}\n\nenum TomlBacktraceItem: Equatable {\n    case key(String)\n    case index(Int)\n\n    var isKey: Bool {\n        switch self {\n            case .key: true\n            case .index: false\n        }\n    }\n}\n\nextension TOMLTable {\n    func parseTable<T: ConvenienceCopyable>(\n        _ initial: T,\n        _ fieldsParser: [String: any ParserProtocol<T>],\n        _ backtrace: TomlBacktrace,\n        _ errors: inout [TomlParseError],\n    ) -> T {\n        var raw = initial\n\n        for (key, value) in self {\n            let backtrace: TomlBacktrace = backtrace + .key(key)\n            if let parser = fieldsParser[key] {\n                raw = parser.transformRawConfig(raw, value, backtrace, &errors)\n            } else {\n                errors.append(unknownKeyError(backtrace))\n            }\n        }\n\n        return raw\n    }\n}\n\nfunc unknownKeyError(_ backtrace: TomlBacktrace) -> TomlParseError {\n    .semantic(backtrace, backtrace.isRootKey ? \"Unknown top-level key\" : \"Unknown key\")\n}\n\nfunc expectedActualTypeError(expected: TOMLType, actual: TOMLType, _ backtrace: TomlBacktrace) -> TomlParseError {\n    .semantic(backtrace, expectedActualTypeError(expected: expected, actual: actual))\n}\n\nfunc expectedActualTypeError(expected: [TOMLType], actual: TOMLType, _ backtrace: TomlBacktrace) -> TomlParseError {\n    .semantic(backtrace, expectedActualTypeError(expected: expected, actual: actual))\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/parseExecEnvVariables.swift",
    "content": "import AppKit\nimport Common\nimport TOMLKit\n\nlet testEnv = [\"PATH\": \"AEROSPACE_TEST_PATH\", \"AEROSPACE_INHERITED_TEST_ENV\": \"inherited\"]\nprivate var env: [String: String] {\n    isUnitTest ? testEnv : ProcessInfo.processInfo.environment\n}\n\nprivate let rawExecConfigParser: [String: any ParserProtocol<RawExecConfig>] = [\n    \"inherit-env-vars\": Parser(\\.inheritEnvVariables, parseBool),\n    \"env-vars\": Parser(\\.overriddenVars, parseEnvVariables),\n]\n\nlet defaultOverriddenEnvVars = [\"PATH\": \"/opt/homebrew/bin:/opt/homebrew/sbin:\\(env[\"PATH\"] ?? \"\")\"]\n\nstruct ExecConfig: Equatable {\n    var envVariables: [String: String] = env + defaultOverriddenEnvVars\n}\n\nstruct RawExecConfig: ConvenienceCopyable, Equatable {\n    var inheritEnvVariables = true\n    // Already interpolated value of overridden vars\n    var overriddenVars: [String: String] = [:]\n\n    func expand() -> ExecConfig {\n        let base: [String: String] = inheritEnvVariables ? env : [:]\n        return ExecConfig(envVariables: base + overriddenVars)\n    }\n}\n\nfunc parseExecConfig(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> ExecConfig {\n    parseTable(raw, RawExecConfig(), rawExecConfigParser, backtrace, &errors).expand()\n}\n\nprivate func parseEnvVariables(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> [String: String] {\n    guard let table = raw.table else {\n        errors.append(expectedActualTypeError(expected: .array, actual: raw.type, backtrace))\n        return [:]\n    }\n    let mutated = table.keys\n    let fullEnv: [String: String] = env\n    let baseEnv: [String: String] = fullEnv.filter { (key, _) -> Bool in !mutated.contains(key) }\n    var result: [String: String] = [:]\n    for (key, value) in table {\n        let backtrace = backtrace + .key(key)\n        if key == \"PWD\" { errors.append(.semantic(backtrace, \"Changing 'PWD' is not allowed\")) }\n        guard let rawStr = parseString(value, backtrace).getOrNil(appendErrorTo: &errors) else { continue }\n        var env = baseEnv\n        if let add: String = fullEnv[key] {\n            env[key] = add\n        }\n        switch rawStr.interpolate(with: env) {\n            case .success(let interpolated): result[key] = interpolated\n            case .failure(let _errros): errors += _errros.map { .semantic(backtrace, $0) }\n        }\n    }\n    return result\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/parseGaps.swift",
    "content": "import Common\nimport TOMLKit\n\nstruct Gaps: ConvenienceCopyable, Equatable, Sendable {\n    var inner: Inner\n    var outer: Outer\n\n    static let zero = Gaps(inner: .zero, outer: .zero)\n\n    struct Inner: ConvenienceCopyable, Equatable, Sendable {\n        var vertical: DynamicConfigValue<Int>\n        var horizontal: DynamicConfigValue<Int>\n\n        static let zero = Inner(vertical: 0, horizontal: 0)\n\n        init(vertical: Int, horizontal: Int) {\n            self.vertical = .constant(vertical)\n            self.horizontal = .constant(horizontal)\n        }\n\n        init(vertical: DynamicConfigValue<Int>, horizontal: DynamicConfigValue<Int>) {\n            self.vertical = vertical\n            self.horizontal = horizontal\n        }\n    }\n\n    struct Outer: ConvenienceCopyable, Equatable, Sendable {\n        var left: DynamicConfigValue<Int>\n        var bottom: DynamicConfigValue<Int>\n        var top: DynamicConfigValue<Int>\n        var right: DynamicConfigValue<Int>\n\n        static let zero = Outer(left: 0, bottom: 0, top: 0, right: 0)\n\n        init(left: Int, bottom: Int, top: Int, right: Int) {\n            self.left = .constant(left)\n            self.bottom = .constant(bottom)\n            self.top = .constant(top)\n            self.right = .constant(right)\n        }\n\n        init(left: DynamicConfigValue<Int>, bottom: DynamicConfigValue<Int>, top: DynamicConfigValue<Int>, right: DynamicConfigValue<Int>) {\n            self.left = left\n            self.bottom = bottom\n            self.top = top\n            self.right = right\n        }\n    }\n}\n\nstruct ResolvedGaps {\n    let inner: Inner\n    let outer: Outer\n\n    struct Inner {\n        let vertical: Int\n        let horizontal: Int\n\n        func get(_ orientation: Orientation) -> Int {\n            orientation == .h ? horizontal : vertical\n        }\n    }\n\n    struct Outer {\n        let left: Int\n        let bottom: Int\n        let top: Int\n        let right: Int\n    }\n\n    init(gaps: Gaps, monitor: any Monitor) {\n        inner = .init(\n            vertical: gaps.inner.vertical.getValue(for: monitor),\n            horizontal: gaps.inner.horizontal.getValue(for: monitor),\n        )\n\n        outer = .init(\n            left: gaps.outer.left.getValue(for: monitor),\n            bottom: gaps.outer.bottom.getValue(for: monitor),\n            top: gaps.outer.top.getValue(for: monitor),\n            right: gaps.outer.right.getValue(for: monitor),\n        )\n    }\n}\n\nprivate let gapsParser: [String: any ParserProtocol<Gaps>] = [\n    \"inner\": Parser(\\.inner, parseInner),\n    \"outer\": Parser(\\.outer, parseOuter),\n]\n\nprivate let innerParser: [String: any ParserProtocol<Gaps.Inner>] = [\n    \"vertical\": Parser(\\.vertical) { value, backtrace, errors in parseDynamicValue(value, Int.self, 0, backtrace, &errors) },\n    \"horizontal\": Parser(\\.horizontal) { value, backtrace, errors in parseDynamicValue(value, Int.self, 0, backtrace, &errors) },\n]\n\nprivate let outerParser: [String: any ParserProtocol<Gaps.Outer>] = [\n    \"left\": Parser(\\.left) { value, backtrace, errors in parseDynamicValue(value, Int.self, 0, backtrace, &errors) },\n    \"bottom\": Parser(\\.bottom) { value, backtrace, errors in parseDynamicValue(value, Int.self, 0, backtrace, &errors) },\n    \"top\": Parser(\\.top) { value, backtrace, errors in parseDynamicValue(value, Int.self, 0, backtrace, &errors) },\n    \"right\": Parser(\\.right) { value, backtrace, errors in parseDynamicValue(value, Int.self, 0, backtrace, &errors) },\n]\n\nfunc parseGaps(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> Gaps {\n    parseTable(raw, .zero, gapsParser, backtrace, &errors)\n}\n\nfunc parseInner(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> Gaps.Inner {\n    parseTable(raw, Gaps.Inner.zero, innerParser, backtrace, &errors)\n}\n\nfunc parseOuter(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> Gaps.Outer {\n    parseTable(raw, Gaps.Outer.zero, outerParser, backtrace, &errors)\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/parseKeyMapping.swift",
    "content": "import Common\nimport HotKey\nimport TOMLKit\n\nprivate let keyMappingParser: [String: any ParserProtocol<KeyMapping>] = [\n    \"preset\": Parser(\\.preset, parsePreset),\n    \"key-notation-to-key-code\": Parser(\\.rawKeyNotationToKeyCode, parseKeyNotationToKeyCode),\n]\n\nstruct KeyMapping: ConvenienceCopyable, Equatable, Sendable {\n    enum Preset: String, CaseIterable, Sendable {\n        case qwerty, dvorak, colemak\n    }\n\n    init(\n        preset: Preset = .qwerty,\n        rawKeyNotationToKeyCode: [String: Key] = [:],\n    ) {\n        self.preset = preset\n        self.rawKeyNotationToKeyCode = rawKeyNotationToKeyCode\n    }\n\n    fileprivate var preset: Preset = .qwerty\n    fileprivate var rawKeyNotationToKeyCode: [String: Key] = [:]\n\n    func resolve() -> [String: Key] {\n        getKeysPreset(preset) + rawKeyNotationToKeyCode\n    }\n}\n\nfunc parseKeyMapping(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> KeyMapping {\n    parseTable(raw, KeyMapping(), keyMappingParser, backtrace, &errors)\n}\n\nprivate func parsePreset(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<KeyMapping.Preset> {\n    parseString(raw, backtrace).flatMap { parseEnum($0, KeyMapping.Preset.self).toParsedToml(backtrace) }\n}\n\nprivate func parseKeyNotationToKeyCode(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> [String: Key] {\n    var result: [String: Key] = [:]\n    guard let table = raw.table else {\n        errors.append(expectedActualTypeError(expected: .table, actual: raw.type, backtrace))\n        return result\n    }\n    for (key, value): (String, TOMLValueConvertible) in table {\n        if isValidKeyNotation(key) {\n            let backtrace = backtrace + .key(key)\n            if let value = parseString(value, backtrace).getOrNil(appendErrorTo: &errors) {\n                if let value = keyNotationToKeyCode[value] {\n                    result[key] = value\n                } else {\n                    errors.append(.semantic(backtrace, \"'\\(value)' is invalid key code\"))\n                }\n            }\n        } else {\n            errors.append(.semantic(backtrace, \"'\\(key)' is invalid key notation\"))\n        }\n    }\n    return result\n}\n\nprivate func isValidKeyNotation(_ str: String) -> Bool {\n    str.rangeOfCharacter(from: .whitespacesAndNewlines) == nil && !str.contains(\"-\")\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/parseOnWindowDetected.swift",
    "content": "import Common\nimport TOMLKit\n\nstruct WindowDetectedCallback: ConvenienceCopyable, Equatable {\n    var matcher: WindowDetectedCallbackMatcher = WindowDetectedCallbackMatcher()\n    var checkFurtherCallbacks: Bool = false\n    var rawRun: [any Command]? = nil\n\n    var run: [any Command] {\n        rawRun ?? dieT(\"ID-46D063B2 should have discarded nil\")\n    }\n\n    var debugJson: Json {\n        var result: [String: Json] = [:]\n        result[\"matcher\"] = matcher.debugJson\n        if let commands = rawRun {\n            result[\"commands\"] = .string(commands.prettyDescription)\n        }\n        return .dict(result)\n    }\n\n    static func == (lhs: WindowDetectedCallback, rhs: WindowDetectedCallback) -> Bool {\n        return lhs.matcher == rhs.matcher && lhs.checkFurtherCallbacks == rhs.checkFurtherCallbacks &&\n            zip(lhs.run, rhs.run).allSatisfy { $0.equals($1) }\n    }\n}\n\nstruct WindowDetectedCallbackMatcher: ConvenienceCopyable, Equatable {\n    var appId: String?\n    var appNameRegexSubstring: Regex<AnyRegexOutput>?\n    var windowTitleRegexSubstring: Regex<AnyRegexOutput>?\n    var workspace: String?\n    var duringAeroSpaceStartup: Bool?\n\n    var debugJson: Json {\n        var resultParts: [String] = []\n        if let appId {\n            resultParts.append(\"appId=\\\"\\(appId)\\\"\")\n        }\n        if appNameRegexSubstring != nil {\n            resultParts.append(\"appNameRegexSubstrin=Regex\")\n        }\n        if windowTitleRegexSubstring != nil {\n            resultParts.append(\"windowTitleRegexSubstring=Regex\")\n        }\n        if let workspace {\n            resultParts.append(\"workspace=\\\"\\(workspace)\\\"\")\n        }\n        if let duringAeroSpaceStartup {\n            resultParts.append(\"duringAeroSpaceStartup=\\(duringAeroSpaceStartup)\")\n        }\n        return .string(resultParts.joined(separator: \", \"))\n    }\n\n    static func == (lhs: WindowDetectedCallbackMatcher, rhs: WindowDetectedCallbackMatcher) -> Bool {\n        check(\n            lhs.appNameRegexSubstring == nil &&\n                lhs.windowTitleRegexSubstring == nil &&\n                rhs.appNameRegexSubstring == nil &&\n                rhs.windowTitleRegexSubstring == nil,\n        )\n        return lhs.appId == rhs.appId\n    }\n}\n\nprivate let windowDetectedParser: [String: any ParserProtocol<WindowDetectedCallback>] = [\n    \"if\": Parser(\\.matcher, parseMatcher),\n    \"check-further-callbacks\": Parser(\\.checkFurtherCallbacks, parseBool),\n    \"run\": Parser(\\.rawRun, upcast { parseCommandOrCommands($0).toParsedToml($1) }),\n]\n\nprivate let matcherParsers: [String: any ParserProtocol<WindowDetectedCallbackMatcher>] = [\n    \"app-id\": Parser(\\.appId, upcast(parseString)),\n    \"workspace\": Parser(\\.workspace, upcast(parseString)),\n    \"app-name-regex-substring\": Parser(\\.appNameRegexSubstring, upcast(parseCasInsensitiveRegex)),\n    \"window-title-regex-substring\": Parser(\\.windowTitleRegexSubstring, upcast(parseCasInsensitiveRegex)),\n    \"during-aerospace-startup\": Parser(\\.duringAeroSpaceStartup, upcast(parseBool)),\n]\n\nprivate func upcast<T>(_ fun: @escaping @Sendable (TOMLValueConvertible, TomlBacktrace) -> ParsedToml<T>) -> @Sendable (TOMLValueConvertible, TomlBacktrace) -> ParsedToml<T?> {\n    { fun($0, $1).map { $0 } }\n}\n\nfunc parseOnWindowDetectedArray(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> [WindowDetectedCallback] {\n    if let array = raw.array {\n        return array.enumerated().map { (index, raw) in parseWindowDetectedCallback(raw, backtrace + .index(index), &errors) }.filterNotNil()\n    } else {\n        errors += [expectedActualTypeError(expected: .array, actual: raw.type, backtrace)]\n        return []\n    }\n}\n\nprivate func parseCasInsensitiveRegex(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<Regex<AnyRegexOutput>> {\n    parseString(raw, backtrace).flatMap { parseCaseInsensitiveRegex($0).toParsedToml(backtrace) }\n}\n\nprivate func parseMatcher(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> WindowDetectedCallbackMatcher {\n    parseTable(raw, WindowDetectedCallbackMatcher(), matcherParsers, backtrace, &errors)\n}\n\nprivate func parseWindowDetectedCallback(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> WindowDetectedCallback? {\n    var myErrors: [TomlParseError] = []\n    let callback = parseTable(raw, WindowDetectedCallback(), windowDetectedParser, backtrace, &myErrors)\n\n    if callback.rawRun == nil { // ID-46D063B2\n        myErrors.append(.semantic(backtrace, \"'run' is mandatory key\"))\n    }\n\n    if !myErrors.isEmpty {\n        errors += myErrors\n        return nil\n    }\n\n    return callback\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/parseWorkspaceToMonitorAssignment.swift",
    "content": "import Common\nimport TOMLKit\n\nfunc parseWorkspaceToMonitorAssignment(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> [String: [MonitorDescription]] {\n    guard let rawTable = raw.table else {\n        errors += [expectedActualTypeError(expected: .table, actual: raw.type, backtrace)]\n        return [:]\n    }\n    var result: [String: [MonitorDescription]] = [:]\n    for (workspaceName, rawMonitorDescription) in rawTable {\n        result[workspaceName] = parseMonitorDescriptions(rawMonitorDescription, backtrace + .key(workspaceName), &errors)\n    }\n    return result\n}\n\nfunc parseMonitorDescriptions(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace, _ errors: inout [TomlParseError]) -> [MonitorDescription] {\n    if let array = raw.array {\n        return array.enumerated()\n            .map { (index, rawDesc) in parseMonitorDescription(rawDesc, backtrace + .index(index)).getOrNil(appendErrorTo: &errors) }\n            .filterNotNil()\n    } else {\n        return parseMonitorDescription(raw, backtrace).getOrNil(appendErrorTo: &errors).asList()\n    }\n}\n\nfunc parseMonitorDescription(_ raw: TOMLValueConvertible, _ backtrace: TomlBacktrace) -> ParsedToml<MonitorDescription> {\n    let rawString: String\n    if let string = raw.string {\n        rawString = string\n    } else if let int = raw.int {\n        rawString = String(int)\n    } else {\n        return .failure(expectedActualTypeError(expected: [.string, .int], actual: raw.type, backtrace))\n    }\n\n    return parseMonitorDescription(rawString).toParsedToml(backtrace)\n}\n"
  },
  {
    "path": "Sources/AppBundle/config/startAtLogin.swift",
    "content": "import AppKit\nimport Common\nimport ServiceManagement\n\n@MainActor\nfunc syncStartAtLogin() {\n    cleanupPlistFromPrevVersions()\n    let service = SMAppService.mainApp\n    if config.startAtLogin {\n        if isDebug {\n            print(\"'start-at-login = true' has no effect in debug builds\")\n        } else {\n            _ = try? service.register()\n        }\n    } else {\n        _ = try? service.unregister()\n    }\n}\n\nprivate func cleanupPlistFromPrevVersions() { // todo Drop after a couple of versions\n    let launchAgentsDir = FileManager.default.homeDirectoryForCurrentUser.appending(component: \"Library/LaunchAgents/\")\n    Result { try FileManager.default.createDirectory(at: launchAgentsDir, withIntermediateDirectories: true) }.getOrDie()\n    let url: URL = launchAgentsDir.appending(path: \"bobko.aerospace.plist\")\n    try? FileManager.default.removeItem(at: url)\n}\n"
  },
  {
    "path": "Sources/AppBundle/focus.swift",
    "content": "import AppKit\nimport Common\n\nenum EffectiveLeaf {\n    case window(Window)\n    case emptyWorkspace(Workspace)\n}\nextension LiveFocus {\n    var asLeaf: EffectiveLeaf {\n        if let windowOrNil { .window(windowOrNil) } else { .emptyWorkspace(workspace) }\n    }\n}\n\n/// This object should be only passed around but never memorized\n/// Alternative name: ResolvedFocus\nstruct LiveFocus: AeroAny, Equatable {\n    let windowOrNil: Window?\n    var workspace: Workspace\n\n    @MainActor fileprivate var frozen: FrozenFocus {\n        return FrozenFocus(\n            windowId: windowOrNil?.windowId,\n            workspaceName: workspace.name,\n            monitorId_oneBased: workspace.workspaceMonitor.monitorId_oneBased ?? 0,\n        )\n    }\n}\n\n/// \"old\", \"captured\", \"frozen in time\" Focus\n/// It's safe to keep a hard reference to this object.\n/// Unlike in LiveFocus, information inside FrozenFocus isn't guaranteed to be self-consistent.\n/// window - workspace - monitor relation could change since the moment object was created\nprivate struct FrozenFocus: AeroAny, Equatable, Sendable {\n    let windowId: UInt32?\n    let workspaceName: String\n    // monitorId is not part of the focus. We keep it here only for 'on-focused-monitor-changed' to work\n    let monitorId_oneBased: Int\n\n    @MainActor var live: LiveFocus { // Important: don't access focus.monitorId here. monitorId is not part of the focus. Always prefer workspace\n        let window: Window? = windowId.flatMap { Window.get(byId: $0) }\n        let workspace = Workspace.get(byName: workspaceName)\n\n        let workspaceFocus = workspace.toLiveFocus()\n        let windowFocus = window?.toLiveFocusOrNil() ?? workspaceFocus\n\n        return workspaceFocus.workspace != windowFocus.workspace\n            ? workspaceFocus // If window and workspace become separated prefer workspace\n            : windowFocus\n    }\n}\n\n@MainActor private var _focus: FrozenFocus = {\n    let monitor = mainMonitor\n    return FrozenFocus(windowId: nil, workspaceName: monitor.activeWorkspace.name, monitorId_oneBased: monitor.monitorId_oneBased ?? 0)\n}()\n\n/// Global focus.\n/// Commands must be cautious about accessing this property directly. There are legitimate cases.\n/// But, in general, commands must firstly check --window-id, --workspace, AEROSPACE_WINDOW_ID env and\n/// AEROSPACE_WORKSPACE env before accessing the global focus.\n@MainActor var focus: LiveFocus { _focus.live }\n\n@MainActor func setFocus(to newFocus: LiveFocus) -> Bool {\n    if _focus == newFocus.frozen { return true }\n    let oldFocus = focus\n    // Normalize mruWindow when focus away from a workspace\n    if oldFocus.workspace != newFocus.workspace {\n        oldFocus.windowOrNil?.markAsMostRecentChild()\n    }\n\n    _focus = newFocus.frozen\n    let status = newFocus.workspace.workspaceMonitor.setActiveWorkspace(newFocus.workspace)\n\n    newFocus.windowOrNil?.markAsMostRecentChild()\n    return status\n}\nextension Window {\n    @MainActor func focusWindow() -> Bool {\n        if let focus = toLiveFocusOrNil() {\n            return setFocus(to: focus)\n        } else {\n            // todo We should also exit-native-hidden/unminimize[/exit-native-fullscreen?] window if we want to fix ID-B6E178F2\n            //      and retry to focus the window. Otherwise, it's not possible to focus minimized/hidden windows\n            return false\n        }\n    }\n\n    @MainActor func toLiveFocusOrNil() -> LiveFocus? { visualWorkspace.map { LiveFocus(windowOrNil: self, workspace: $0) } }\n}\nextension Workspace {\n    @MainActor func focusWorkspace() -> Bool { setFocus(to: toLiveFocus()) }\n\n    func toLiveFocus() -> LiveFocus {\n        // todo unfortunately mostRecentWindowRecursive may recursively reach empty rootTilingContainer\n        //      while floating or macos unconventional windows might be presented\n        if let wd = mostRecentWindowRecursive ?? anyLeafWindowRecursive {\n            LiveFocus(windowOrNil: wd, workspace: self)\n        } else {\n            LiveFocus(windowOrNil: nil, workspace: self) // emptyWorkspace\n        }\n    }\n}\n\n@MainActor private var _lastKnownFocus: FrozenFocus = _focus\n\n// Used by workspace-back-and-forth\n@MainActor var _prevFocusedWorkspaceName: String? = nil {\n    didSet {\n        prevFocusedWorkspaceDate = .now\n    }\n}\n@MainActor var prevFocusedWorkspaceDate: Date = .distantPast\n@MainActor var prevFocusedWorkspace: Workspace? { _prevFocusedWorkspaceName.map { Workspace.get(byName: $0) } }\n\n// Used by focus-back-and-forth\n@MainActor private var _prevFocus: FrozenFocus? = nil\n@MainActor var prevFocus: LiveFocus? { _prevFocus?.live.takeIf { $0 != focus } }\n\n@MainActor private var onFocusChangedRecursionGuard = false\n// Should be called in refreshSession\n@MainActor func checkOnFocusChangedCallbacks() {\n    if refreshSessionEvent?.isStartup == true {\n        return\n    }\n    let focus = focus\n    let frozenFocus = focus.frozen\n    var hasFocusChanged = false\n    var hasFocusedWorkspaceChanged = false\n    var hasFocusedMonitorChanged = false\n    if frozenFocus != _lastKnownFocus {\n        _prevFocus = _lastKnownFocus\n        hasFocusChanged = true\n    }\n    if frozenFocus.workspaceName != _lastKnownFocus.workspaceName {\n        _prevFocusedWorkspaceName = _lastKnownFocus.workspaceName\n        hasFocusedWorkspaceChanged = true\n    }\n    if frozenFocus.monitorId_oneBased != _lastKnownFocus.monitorId_oneBased {\n        hasFocusedMonitorChanged = true\n    }\n    _lastKnownFocus = frozenFocus\n\n    if onFocusChangedRecursionGuard { return }\n    onFocusChangedRecursionGuard = true\n    defer { onFocusChangedRecursionGuard = false }\n    if hasFocusChanged {\n        onFocusChanged(focus)\n    }\n    if let _prevFocusedWorkspaceName, hasFocusedWorkspaceChanged {\n        onWorkspaceChanged(_prevFocusedWorkspaceName, frozenFocus.workspaceName)\n    }\n    if hasFocusedMonitorChanged {\n        onFocusedMonitorChanged(focus)\n    }\n}\n\n@MainActor private func onFocusedMonitorChanged(_ focus: LiveFocus) {\n    broadcastEvent(.focusedMonitorChanged(\n        workspace: focus.workspace.name,\n        monitorId_oneBased: focus.workspace.workspaceMonitor.monitorId_oneBased ?? 0,\n    ))\n    if config.onFocusedMonitorChanged.isEmpty { return }\n    guard let token: RunSessionGuard = .isServerEnabled else { return }\n    // todo potential optimization: don't run runSession if we are already in runSession\n    Task {\n        try await runLightSession(.onFocusedMonitorChanged, token) {\n            _ = try await config.onFocusedMonitorChanged.runCmdSeq(.defaultEnv.withFocus(focus), .emptyStdin)\n        }\n    }\n}\n@MainActor private func onFocusChanged(_ focus: LiveFocus) {\n    broadcastEvent(.focusChanged(\n        windowId: focus.windowOrNil?.windowId,\n        workspace: focus.workspace.name,\n    ))\n    if config.onFocusChanged.isEmpty { return }\n    guard let token: RunSessionGuard = .isServerEnabled else { return }\n    // todo potential optimization: don't run runSession if we are already in runSession\n    Task {\n        try await runLightSession(.onFocusChanged, token) {\n            _ = try await config.onFocusChanged.runCmdSeq(.defaultEnv.withFocus(focus), .emptyStdin)\n        }\n    }\n}\n\n@MainActor private func onWorkspaceChanged(_ oldWorkspace: String, _ newWorkspace: String) {\n    broadcastEvent(.workspaceChanged(\n        workspace: newWorkspace,\n        prevWorkspace: oldWorkspace,\n    ))\n    if let exec = config.execOnWorkspaceChange.first {\n        let process = Process()\n        process.executableURL = URL(filePath: exec)\n        process.arguments = Array(config.execOnWorkspaceChange.dropFirst())\n        var environment = config.execConfig.envVariables\n        environment[\"AEROSPACE_FOCUSED_WORKSPACE\"] = newWorkspace\n        environment[\"AEROSPACE_PREV_WORKSPACE\"] = oldWorkspace\n        environment[AEROSPACE_WORKSPACE] = newWorkspace\n        process.environment = environment\n        _ = Result { try process.run() }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/focusCache.swift",
    "content": "@MainActor private var lastKnownNativeFocusedWindowId: UInt32? = nil\n\n/// The data should flow (from nativeFocused to focused) and\n///                      (from nativeFocused to lastKnownNativeFocusedWindowId)\n/// Alternative names: takeFocusFromMacOs, syncFocusFromMacOs\n@MainActor func updateFocusCache(_ nativeFocused: Window?) {\n    if nativeFocused?.parent is MacosPopupWindowsContainer {\n        return\n    }\n    if nativeFocused?.windowId != lastKnownNativeFocusedWindowId {\n        _ = nativeFocused?.focusWindow()\n        lastKnownNativeFocusedWindowId = nativeFocused?.windowId\n    }\n    nativeFocused?.macAppUnsafe.lastNativeFocusedWindowId = nativeFocused?.windowId\n}\n"
  },
  {
    "path": "Sources/AppBundle/getNativeFocusedWindow.swift",
    "content": "import AppKit\nimport Common\n\n@MainActor\nvar appForTests: (any AbstractApp)? = nil\n\n@MainActor\nprivate var focusedApp: (any AbstractApp)? {\n    get async throws {\n        if isUnitTest {\n            return appForTests\n        } else {\n            check(appForTests == nil)\n            return try await NSWorkspace.shared.frontmostApplication.flatMapAsync { @MainActor @Sendable in\n                try await MacApp.getOrRegister($0)\n            }\n        }\n    }\n}\n\n@MainActor\nfunc getNativeFocusedWindow() async throws -> Window? {\n    try await focusedApp?.getFocusedWindow()\n}\n"
  },
  {
    "path": "Sources/AppBundle/initAppBundle.swift",
    "content": "import AppKit\nimport Common\nimport Foundation\n\n@MainActor public func initAppBundle() {\n    Task {\n        initTerminationHandler()\n        isCli = false\n        initServerArgs()\n        if isDebug {\n            await toggleReleaseServerIfDebug(.off)\n            interceptTermination(SIGINT)\n            interceptTermination(SIGKILL)\n        }\n        if try await !reloadConfig() {\n            var out = \"\"\n            check(\n                try await reloadConfig(forceConfigUrl: defaultConfigUrl, stdout: &out),\n                \"\"\"\n                Can't load default config. Your installation is probably corrupted.\n                Please don't modify '\\(defaultConfigUrl)'\n\n                \\(out)\n                \"\"\",\n            )\n        }\n\n        checkAccessibilityPermissions()\n        startUnixSocketServer()\n        GlobalObserver.initObserver()\n        Workspace.garbageCollectUnusedWorkspaces() // init workspaces\n        _ = Workspace.all.first?.focusWorkspace()\n        try await runRefreshSessionBlocking(.startup, layoutWorkspaces: false)\n        try await runLightSession(.startup, .forceRun) {\n            smartLayoutAtStartup()\n            _ = try await config.afterStartupCommand.runCmdSeq(.defaultEnv, .emptyStdin)\n        }\n    }\n}\n\n@MainActor\nprivate func smartLayoutAtStartup() {\n    let workspace = focus.workspace\n    let root = workspace.rootTilingContainer\n    if root.children.count <= 3 {\n        root.layout = .tiles\n    } else {\n        root.layout = .accordion\n    }\n}\n\n@TaskLocal\nvar _isStartup: Bool? = false\nvar isStartup: Bool { _isStartup ?? dieT(\"isStartup is not initialized\") }\n\nstruct ServerArgs: Sendable {\n    var configLocation: String? = nil\n    var isReadOnly: Bool = false\n}\n\nprivate let serverHelp = \"\"\"\n    USAGE: \\(CommandLine.arguments.first ?? \"AeroSpace.app/Contents/MacOS/AeroSpace\") [<options>]\n\n    OPTIONS:\n      -h, --help              Print help\n      -v, --version           Print AeroSpace.app version\n      --config-path <path>    Config path. It will take priority over ~/.aerospace.toml\n                              and ${XDG_CONFIG_HOME}/aerospace/aerospace.toml\n      --read-only             Disable window management.\n                              Useful if you want to use only debug-windows or other query commands.\n    \"\"\"\n\nnonisolated(unsafe) private var _serverArgs = ServerArgs()\nvar serverArgs: ServerArgs { _serverArgs }\nprivate func initServerArgs() {\n    let args = CommandLine.arguments.slice(1...) ?? []\n    if args.contains(where: { $0 == \"-h\" || $0 == \"--help\" }) {\n        exit(0, out: serverHelp)\n    }\n    var index = 0\n    while index < args.count {\n        let current = args[index]\n        index += 1\n        switch current {\n            case \"--version\", \"-v\":\n                exit(0, out: \"\\(aeroSpaceAppVersion) \\(gitHash)\")\n            case \"--config-path\":\n                if let arg = args.getOrNil(atIndex: index) {\n                    _serverArgs.configLocation = arg\n                } else {\n                    exit(1, err: \"Missing <path> in --config-path flag\")\n                }\n                index += 1\n            case \"--read-only\": // todo rename to '--disabled' and unite with disabled feature\n                _serverArgs.isReadOnly = true\n            case \"-NSDocumentRevisionsDebugMode\" where isDebug:\n                // Skip Xcode CLI args.\n                // Usually it's '-NSDocumentRevisionsDebugMode NO'/'-NSDocumentRevisionsDebugMode YES'\n                while args.getOrNil(atIndex: index)?.starts(with: \"-\") == false { index += 1 }\n            default:\n                exit(1, err: \"Unrecognized flag '\\(args.first.orDie())'\")\n        }\n    }\n    if let path = serverArgs.configLocation, !FileManager.default.fileExists(atPath: path) {\n        exit(1, err: \"\\(path) doesn't exist\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/layout/layoutRecursive.swift",
    "content": "import AppKit\n\nextension Workspace {\n    @MainActor\n    func layoutWorkspace() async throws {\n        if isEffectivelyEmpty { return }\n        let rect = workspaceMonitor.visibleRectPaddedByOuterGaps\n        // If monitors are aligned vertically and the monitor below has smaller width, then macOS may not allow the\n        // window on the upper monitor to take full width. rect.height - 1 resolves this problem\n        // But I also faced this problem in monitors horizontal configuration. ¯\\_(ツ)_/¯\n        try await layoutRecursive(rect.topLeftCorner, width: rect.width, height: rect.height - 1, virtual: rect, LayoutContext(self))\n    }\n}\n\nextension TreeNode {\n    @MainActor\n    fileprivate func layoutRecursive(_ point: CGPoint, width: CGFloat, height: CGFloat, virtual: Rect, _ context: LayoutContext) async throws {\n        let physicalRect = Rect(topLeftX: point.x, topLeftY: point.y, width: width, height: height)\n        switch nodeCases {\n            case .workspace(let workspace):\n                lastAppliedLayoutPhysicalRect = physicalRect\n                lastAppliedLayoutVirtualRect = virtual\n                try await workspace.rootTilingContainer.layoutRecursive(point, width: width, height: height, virtual: virtual, context)\n                for window in workspace.children.filterIsInstance(of: Window.self) {\n                    window.lastAppliedLayoutPhysicalRect = nil\n                    window.lastAppliedLayoutVirtualRect = nil\n                    try await window.layoutFloatingWindow(context)\n                }\n            case .window(let window):\n                if window.windowId != currentlyManipulatedWithMouseWindowId {\n                    lastAppliedLayoutVirtualRect = virtual\n                    if window.isFullscreen && window == context.workspace.rootTilingContainer.mostRecentWindowRecursive {\n                        lastAppliedLayoutPhysicalRect = nil\n                        window.layoutFullscreen(context)\n                    } else {\n                        lastAppliedLayoutPhysicalRect = physicalRect\n                        window.isFullscreen = false\n                        window.setAxFrame(point, CGSize(width: width, height: height))\n                    }\n                }\n            case .tilingContainer(let container):\n                lastAppliedLayoutPhysicalRect = physicalRect\n                lastAppliedLayoutVirtualRect = virtual\n                switch container.layout {\n                    case .tiles:\n                        try await container.layoutTiles(point, width: width, height: height, virtual: virtual, context)\n                    case .accordion:\n                        try await container.layoutAccordion(point, width: width, height: height, virtual: virtual, context)\n                }\n            case .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer,\n                 .macosPopupWindowsContainer, .macosHiddenAppsWindowsContainer:\n                return // Nothing to do for weirdos\n        }\n    }\n}\n\nprivate struct LayoutContext {\n    let workspace: Workspace\n    let resolvedGaps: ResolvedGaps\n\n    @MainActor\n    init(_ workspace: Workspace) {\n        self.workspace = workspace\n        self.resolvedGaps = ResolvedGaps(gaps: config.gaps, monitor: workspace.workspaceMonitor)\n    }\n}\n\nextension Window {\n    @MainActor\n    fileprivate func layoutFloatingWindow(_ context: LayoutContext) async throws {\n        let workspace = context.workspace\n        let windowRect = try await getAxRect() // Probably not idempotent\n        let currentMonitor = windowRect?.center.monitorApproximation\n        if let currentMonitor, let windowRect, workspace != currentMonitor.activeWorkspace {\n            let windowTopLeftCorner = windowRect.topLeftCorner\n            let xProportion = (windowTopLeftCorner.x - currentMonitor.visibleRect.topLeftX) / currentMonitor.visibleRect.width\n            let yProportion = (windowTopLeftCorner.y - currentMonitor.visibleRect.topLeftY) / currentMonitor.visibleRect.height\n\n            let workspaceRect = workspace.workspaceMonitor.visibleRect\n            var newX = workspaceRect.topLeftX + xProportion * workspaceRect.width\n            var newY = workspaceRect.topLeftY + yProportion * workspaceRect.height\n\n            let windowWidth = windowRect.width\n            let windowHeight = windowRect.height\n            newX = newX.coerce(in: workspaceRect.minX ... max(workspaceRect.minX, workspaceRect.maxX - windowWidth))\n            newY = newY.coerce(in: workspaceRect.minY ... max(workspaceRect.minY, workspaceRect.maxY - windowHeight))\n\n            setAxFrame(CGPoint(x: newX, y: newY), nil)\n        }\n        if isFullscreen {\n            layoutFullscreen(context)\n            isFullscreen = false\n        }\n    }\n\n    @MainActor\n    fileprivate func layoutFullscreen(_ context: LayoutContext) {\n        let monitorRect = noOuterGapsInFullscreen\n            ? context.workspace.workspaceMonitor.visibleRect\n            : context.workspace.workspaceMonitor.visibleRectPaddedByOuterGaps\n        setAxFrame(monitorRect.topLeftCorner, CGSize(width: monitorRect.width, height: monitorRect.height))\n    }\n}\n\nextension TilingContainer {\n    @MainActor\n    fileprivate func layoutTiles(_ point: CGPoint, width: CGFloat, height: CGFloat, virtual: Rect, _ context: LayoutContext) async throws {\n        var point = point\n        var virtualPoint = virtual.topLeftCorner\n\n        guard let delta = ((orientation == .h ? width : height) - CGFloat(children.sumOfDouble { $0.getWeight(orientation) }))\n            .div(children.count) else { return }\n\n        let lastIndex = children.indices.last\n        for (i, child) in children.enumerated() {\n            child.setWeight(orientation, child.getWeight(orientation) + delta)\n            let rawGap = context.resolvedGaps.inner.get(orientation).toDouble()\n            // Gaps. Consider 4 cases:\n            // 1. Multiple children. Layout first child\n            // 2. Multiple children. Layout last child\n            // 3. Multiple children. Layout child in the middle\n            // 4. Single child   let rawGap = gaps.inner.get(orientation).toDouble()\n            let gap = rawGap - (i == 0 ? rawGap / 2 : 0) - (i == lastIndex ? rawGap / 2 : 0)\n            try await child.layoutRecursive(\n                i == 0 ? point : point.addingOffset(orientation, rawGap / 2),\n                width: orientation == .h ? child.hWeight - gap : width,\n                height: orientation == .v ? child.vWeight - gap : height,\n                virtual: Rect(\n                    topLeftX: virtualPoint.x,\n                    topLeftY: virtualPoint.y,\n                    width: orientation == .h ? child.hWeight : width,\n                    height: orientation == .v ? child.vWeight : height,\n                ),\n                context,\n            )\n            virtualPoint = orientation == .h ? virtualPoint.addingXOffset(child.hWeight) : virtualPoint.addingYOffset(child.vWeight)\n            point = orientation == .h ? point.addingXOffset(child.hWeight) : point.addingYOffset(child.vWeight)\n        }\n    }\n\n    @MainActor\n    fileprivate func layoutAccordion(_ point: CGPoint, width: CGFloat, height: CGFloat, virtual: Rect, _ context: LayoutContext) async throws {\n        guard let mruIndex: Int = mostRecentChild?.ownIndex else { return }\n        for (index, child) in children.enumerated() {\n            let padding = CGFloat(config.accordionPadding)\n            let (lPadding, rPadding): (CGFloat, CGFloat) = switch index {\n                case 0 where children.count == 1: (0, 0)\n                case 0:                           (0, padding)\n                case children.indices.last:       (padding, 0)\n                case mruIndex - 1:                (0, 2 * padding)\n                case mruIndex + 1:                (2 * padding, 0)\n                default:                          (padding, padding)\n            }\n            switch orientation {\n                case .h:\n                    try await child.layoutRecursive(\n                        point + CGPoint(x: lPadding, y: 0),\n                        width: width - rPadding - lPadding,\n                        height: height,\n                        virtual: virtual,\n                        context,\n                    )\n                case .v:\n                    try await child.layoutRecursive(\n                        point + CGPoint(x: 0, y: lPadding),\n                        width: width,\n                        height: height - lPadding - rPadding,\n                        virtual: virtual,\n                        context,\n                    )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/layout/refresh.swift",
    "content": "import AppKit\nimport Common\n\n@MainActor\nprivate var activeRefreshTask: Task<(), any Error>? = nil\n\n@MainActor\nfunc scheduleRefreshSession(\n    _ event: RefreshSessionEvent,\n    optimisticallyPreLayoutWorkspaces: Bool = false,\n) {\n    activeRefreshTask?.cancel()\n    activeRefreshTask = Task { @MainActor in\n        try checkCancellation()\n        try await runRefreshSessionBlocking(event, optimisticallyPreLayoutWorkspaces: optimisticallyPreLayoutWorkspaces)\n    }\n}\n\n@MainActor\nfunc runRefreshSessionBlocking(\n    _ event: RefreshSessionEvent,\n    layoutWorkspaces shouldLayoutWorkspaces: Bool = true,\n    optimisticallyPreLayoutWorkspaces: Bool = false,\n) async throws {\n    let state = signposter.beginInterval(#function, \"event: \\(event) axTaskLocalAppThreadToken: \\(axTaskLocalAppThreadToken?.idForDebug)\")\n    defer { signposter.endInterval(#function, state) }\n    if !TrayMenuModel.shared.isEnabled { return }\n    try await $refreshSessionEvent.withValue(event) {\n        try await $_isStartup.withValue(event.isStartup) {\n            let nativeFocused = try await getNativeFocusedWindow()\n            if let nativeFocused { try await debugWindowsIfRecording(nativeFocused) }\n            updateFocusCache(nativeFocused)\n\n            if shouldLayoutWorkspaces && optimisticallyPreLayoutWorkspaces { try await layoutWorkspaces() }\n\n            refreshModel()\n            try await refresh()\n            gcMonitors()\n\n            updateTrayText()\n            SecureInputPanel.shared.refresh()\n            try await normalizeLayoutReason()\n            if shouldLayoutWorkspaces { try await layoutWorkspaces() }\n        }\n    }\n}\n\n@MainActor\nfunc runLightSession<T>(\n    _ event: RefreshSessionEvent,\n    _: RunSessionGuard,\n    body: @MainActor () async throws -> T,\n) async throws -> T {\n    let state = signposter.beginInterval(#function, \"event: \\(event) axTaskLocalAppThreadToken: \\(axTaskLocalAppThreadToken?.idForDebug)\")\n    defer { signposter.endInterval(#function, state) }\n    activeRefreshTask?.cancel() // Give priority to runSession\n    activeRefreshTask = nil\n    return try await $refreshSessionEvent.withValue(event) {\n        try await $_isStartup.withValue(event.isStartup) {\n            let nativeFocused = try await getNativeFocusedWindow()\n            if let nativeFocused { try await debugWindowsIfRecording(nativeFocused) }\n            updateFocusCache(nativeFocused)\n            let focusBefore = focus.windowOrNil\n\n            refreshModel()\n            let result = try await body()\n            refreshModel()\n\n            let focusAfter = focus.windowOrNil\n\n            updateTrayText()\n            SecureInputPanel.shared.refresh()\n            try await layoutWorkspaces()\n            if focusBefore != focusAfter {\n                focusAfter?.nativeFocus() // syncFocusToMacOs\n            }\n            scheduleRefreshSession(event)\n            return result\n        }\n    }\n}\n\nstruct RunSessionGuard: Sendable {\n    @MainActor\n    static var isServerEnabled: RunSessionGuard? { TrayMenuModel.shared.isEnabled ? forceRun : nil }\n    @MainActor\n    static func isServerEnabled(orIsEnableCommand command: (any Command)?) -> RunSessionGuard? {\n        command is EnableCommand ? .forceRun : .isServerEnabled\n    }\n    @MainActor\n    static func checkServerIsEnabledOrDie(\n        file: StaticString = #fileID,\n        line: Int = #line,\n        column: Int = #column,\n        function: String = #function,\n    ) -> RunSessionGuard {\n        .isServerEnabled ?? dieT(\"server is disabled\", file: file, line: line, column: column, function: function)\n    }\n    static let forceRun = RunSessionGuard()\n    private init() {}\n}\n\n@MainActor\nfunc refreshModel() {\n    Workspace.garbageCollectUnusedWorkspaces()\n    checkOnFocusChangedCallbacks()\n    normalizeContainers()\n}\n\n@MainActor\nprivate func refresh() async throws {\n    // Garbage collect terminated apps and windows before working with all windows\n    let mapping = try await MacApp.refreshAllAndGetAliveWindowIds(frontmostAppBundleId: NSWorkspace.shared.frontmostApplication?.bundleIdentifier)\n    let aliveWindowIds = mapping.values.flatMap { $0 }.toSet()\n\n    for window in MacWindow.allWindows {\n        if !aliveWindowIds.contains(window.windowId) {\n            window.garbageCollect(skipClosedWindowsCache: false)\n        }\n    }\n    for (app, windowIds) in mapping {\n        for windowId in windowIds {\n            try await MacWindow.getOrRegister(windowId: windowId, macApp: app)\n        }\n    }\n\n    // Garbage collect workspaces after apps, because workspaces contain apps.\n    Workspace.garbageCollectUnusedWorkspaces()\n}\n\nfunc refreshObs(_: AXObserver, _: AXUIElement, notif: CFString, _: UnsafeMutableRawPointer?) {\n    let notif = notif as String\n    Task { @MainActor in\n        if !TrayMenuModel.shared.isEnabled { return }\n        scheduleRefreshSession(.ax(notif))\n    }\n}\n\nenum OptimalHideCorner {\n    case bottomLeftCorner, bottomRightCorner\n}\n\n@MainActor\nprivate func layoutWorkspaces() async throws {\n    if !TrayMenuModel.shared.isEnabled {\n        for workspace in Workspace.all {\n            workspace.allLeafWindowsRecursive.forEach { ($0 as! MacWindow).unhideFromCorner() } // todo as!\n            try await workspace.layoutWorkspace() // Unhide tiling windows from corner\n        }\n        return\n    }\n    let monitors = monitors\n    var monitorToOptimalHideCorner: [CGPoint: OptimalHideCorner] = [:]\n    for monitor in monitors {\n        let xOff = monitor.width * 0.1\n        let yOff = monitor.height * 0.1\n        // brc = bottomRightCorner\n        let brc1 = monitor.rect.bottomRightCorner + CGPoint(x: 2, y: -yOff)\n        let brc2 = monitor.rect.bottomRightCorner + CGPoint(x: -xOff, y: 2)\n        let brc3 = monitor.rect.bottomRightCorner + CGPoint(x: 2, y: 2)\n\n        // blc = bottomLeftCorner\n        let blc1 = monitor.rect.bottomLeftCorner + CGPoint(x: -2, y: -yOff)\n        let blc2 = monitor.rect.bottomLeftCorner + CGPoint(x: xOff, y: 2)\n        let blc3 = monitor.rect.bottomLeftCorner + CGPoint(x: -2, y: 2)\n\n        func contains(_ monitor: Monitor, _ point: CGPoint) -> Int { monitor.rect.contains(point) ? 1 : 0 }\n        let important = 10\n\n        let corner: OptimalHideCorner =\n            monitors.sumOfInt { contains($0, blc1) + contains($0, blc2) + important * contains($0, blc3) } <\n            monitors.sumOfInt { contains($0, brc1) + contains($0, brc2) + important * contains($0, brc3) }\n            ? .bottomLeftCorner\n            : .bottomRightCorner\n        monitorToOptimalHideCorner[monitor.rect.topLeftCorner] = corner\n    }\n\n    // to reduce flicker, first unhide visible workspaces, then hide invisible ones\n    for monitor in monitors {\n        let workspace = monitor.activeWorkspace\n        workspace.allLeafWindowsRecursive.forEach { ($0 as! MacWindow).unhideFromCorner() } // todo as!\n        try await workspace.layoutWorkspace()\n    }\n    for workspace in Workspace.all where !workspace.isVisible {\n        let corner = monitorToOptimalHideCorner[workspace.workspaceMonitor.rect.topLeftCorner] ?? .bottomRightCorner\n        for window in workspace.allLeafWindowsRecursive {\n            try await (window as! MacWindow).hideInCorner(corner) // todo as!\n        }\n    }\n}\n\n@MainActor\nprivate func normalizeContainers() {\n    // Can't do it only for visible workspace because most of the commands support --window-id and --workspace flags\n    for workspace in Workspace.all {\n        workspace.normalizeContainers()\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/model/AxUiElementWindowType.swift",
    "content": "import AppKit\n\nenum AxUiElementWindowType: String {\n    case window\n    case dialog\n    /// Not even a real window\n    case popup\n\n    static func new(isWindow: Bool, isDialog: () -> Bool) -> AxUiElementWindowType {\n        switch true {\n            case !isWindow: .popup\n            case isDialog(): .dialog\n            default: .window\n        }\n    }\n}\n\n// Covered by tests in ./axDumps in the repo root\nextension AxUiElementMock {\n    // 'isDialogHeuristic' function name is referenced in the guide\n    func isDialogHeuristic(\n        _ id: KnownBundleId?,\n        _ windowLevel: MacOsWindowLevel?,\n    ) -> Bool {\n        // Note: a lot of windows don't have title on startup. So please don't rely on the title\n\n        if id == ._1password && windowLevel != .normalWindow {\n            return true\n        }\n\n        if id == .iphonesimulator {\n            return true\n        }\n\n        // Don't tile:\n        // - Chrome cmd+f window (\"AXUnknown\" value)\n        // - login screen (Yes fuck, it's also a window from Apple's API perspective) (\"AXUnknown\" value)\n        // - XCode \"Build succeeded\" popup\n        // - IntelliJ tooltips, context menus, drop downs\n        // - macOS native file picker (IntelliJ -> \"Open...\") (kAXDialogSubrole value)\n        //\n        // Minimized windows or windows of a hidden app have subrole \"AXDialog\"\n        if get(Ax.subroleAttr) != kAXStandardWindowSubrole &&\n            id != .qutebrowser // qutebrowser regular window has AXDialog subrole when decorations are disabled\n        {\n            return true\n        }\n        // Firefox: Picture in Picture window doesn't have minimize button.\n        // todo. bug: when firefox shows non-native fullscreen, minimize button is disabled for all other non-fullscreen windows\n        if id?.isFirefox == true && get(Ax.minimizeButtonAttr)?.get(Ax.enabledAttr) != true {\n            return true\n        }\n        if id == .photoBooth { return true }\n        if id == .ghostty {\n            return get(Ax.fullscreenButtonAttr)?.get(Ax.enabledAttr) != true &&\n                get(Ax.closeButtonAttr)?.get(Ax.enabledAttr) == true\n        }\n        // Heuristic: float windows without fullscreen button (such windows are not designed to be big)\n        // - IntelliJ various dialogs (Rebase..., Edit commit message, Settings, Project structure)\n        // - Finder copy file dialog\n        // - System Settings\n        // - Apple logo -> About this Mac\n        // - Calculator\n        // - Battle.net login dialog\n        // Fullscreen button is presented but disabled:\n        // - Safari -> Pinterest -> Log in with Google\n        // - Kap screen recorder https://github.com/wulkano/Kap\n        // - flameshot? https://github.com/nikitabobko/AeroSpace/issues/112\n        // - Drata Agent https://github.com/nikitabobko/AeroSpace/issues/134\n        if get(Ax.fullscreenButtonAttr)?.get(Ax.enabledAttr) != true &&\n            id != .gimp && // Gimp doesn't show fullscreen button\n\n            // \"Drag out\" a tab out of Chrome window. Technically, it shouldn't be necessary, but\n            // apparently there is some sort of race condition between users releasing mouse up and\n            // Chrome reactivating the fullscreen button\n            // todo: consider checking for fullscreen cirteria periodically (downside: will affect performance)\n            id != .chrome &&\n\n            id != .activityMonitor && // Activity Monitor doesn't show fullscreen button\n\n            // Terminal apps and Emacs have an option to hide their title bars\n            id != .alacritty && // ~/.alacritty.toml: window.decorations = \"Buttonless\"\n            id != .kitty && // ~/.config/kitty/kitty.conf: hide_window_decorations titlebar-and-corners\n            id != .wezterm &&\n            id != .qutebrowser && // :set window.hide_decoration\n            id != .iterm2 &&\n            id != .emacs &&\n            id?.isVscode != true && // \"window.nativeFullScreen\": false\n            id != .steam\n        {\n            return true\n        }\n        return false\n    }\n\n    /// Alternative name: !isPopup\n    ///\n    /// Why do we need to filter out non-windows?\n    /// - \"floating by default\" workflow\n    /// - It's annoying that the focus command treats these popups as floating windows\n    func isWindowHeuristic(\n        axApp: AxUiElementMock,\n        _ id: KnownBundleId?,\n        _ activationPolicy: NSApplication.ActivationPolicy,\n        _ windowLevel: MacOsWindowLevel?,\n    ) -> Bool {\n        if windowLevel != .normalWindow &&\n            // Slowly roll out windowLevel for applications for which we have the appropriate dumps\n            (id == .slack || id == .chrome || id?.isFirefox == true || id == .braveBrowser || id == .screenstudio || id == .cleanshotx || id == .iterm2)\n        {\n            return false\n        }\n\n        // Just don't do anything with \"Ghostty Quick Terminal\" windows.\n        // Its position and size are managed by the Ghostty itself\n        // https://github.com/nikitabobko/AeroSpace/issues/103\n        // https://github.com/ghostty-org/ghostty/discussions/3512\n        if id == .ghostty && get(Ax.identifierAttr) == \"com.mitchellh.ghostty.quickTerminal\" {\n            return false\n        }\n\n        lazy var fullscreenButton = get(Ax.fullscreenButtonAttr)\n\n        if id == .xcode && get(Ax.identifierAttr) == \"open_quickly\" {\n            return false\n        }\n\n        if id == .iterm2 && fullscreenButton == nil {\n            return false\n        }\n\n        if activationPolicy == .accessory && get(Ax.closeButtonAttr) == nil && id != .steam {\n            return false\n        }\n\n        if id?.isFirefox != true {\n            return isWindowHeuristicOld(axApp: axApp, id)\n        }\n\n        // Try to filter out incredibly weird popup like AXWindows without any buttons.\n        // E.g.\n        // - Sonoma (macOS 14) keyboard layout switch (AXSubrole == AXDialog)\n        // - IntelliJ context menu (right mouse click)\n        // - Telegram context menu (right mouse click)\n        // - Share window purple \"pill\" indicator https://github.com/nikitabobko/AeroSpace/issues/1101. Title is not empty\n        // - Tooltips on links mouse hover in browsers (Chrome, Firefox)\n        // - Tooltips on buttons (e.g. new tab, Extensions) mouse hover in browsers (Chrome, Firefox). Title is not empty\n        // Make sure that the following AXWindow remain windows:\n        // - macOS native file picker (\"Open...\" menu) (subrole == kAXDialogSubrole)\n        // - telegram image viewer (subrole == kAXFloatingWindowSubrole)\n        // - Finder preview (hit space) (subrole == \"Quick Look\")\n        // - Firefox non-native video fullscreen (about:config -> full-screen-api.macos-native-full-screen -> false, subrole == AXUnknown)\n        return get(Ax.closeButtonAttr) != nil ||\n            fullscreenButton != nil ||\n            get(Ax.zoomButtonAttr) != nil ||\n            get(Ax.minimizeButtonAttr) != nil ||\n\n            get(Ax.isFocused) == true ||  // 3 different ways to detect if the window is focused\n            get(Ax.isMainAttr) == true ||\n            axApp.get(Ax.focusedWindowAttr)?.windowId == self.containingWindowId() ||\n\n            get(Ax.subroleAttr) == kAXStandardWindowSubrole\n    }\n\n    private func isWindowHeuristicOld(axApp: AxUiElementMock, _ id: KnownBundleId?) -> Bool { // 0.18.3 hotfix\n        lazy var subrole = get(Ax.subroleAttr)\n        lazy var title = get(Ax.titleAttr) ?? \"\"\n\n        // Try to filter out incredibly weird popup like AXWindows without any buttons.\n        // E.g.\n        // - Sonoma (macOS 14) keyboard layout switch\n        // - IntelliJ context menu (right mouse click)\n        // - Telegram context menu (right mouse click)\n        if get(Ax.closeButtonAttr) == nil &&\n            get(Ax.fullscreenButtonAttr) == nil &&\n            get(Ax.zoomButtonAttr) == nil &&\n            get(Ax.minimizeButtonAttr) == nil &&\n\n            get(Ax.isFocused) == false &&  // Three different ways to detect if the window is not focused\n            get(Ax.isMainAttr) == false &&\n            axApp.get(Ax.focusedWindowAttr)?.windowId != containingWindowId() &&\n\n            subrole != kAXStandardWindowSubrole &&\n            // Share window purple \"pill\" indicator has \"Window\" title https://github.com/nikitabobko/AeroSpace/issues/1101\n            (title.isEmpty || title == \"Window\") // Maybe it doesn't work in non-English locale\n        {\n            return false\n        }\n        return subrole == kAXStandardWindowSubrole ||\n            subrole == kAXDialogSubrole || // macOS native file picker (\"Open...\" menu) (kAXDialogSubrole value)\n            subrole == kAXFloatingWindowSubrole || // telegram image viewer\n            id == .finder && subrole == \"Quick Look\" // Finder preview (hit space) is a floating window\n    }\n\n    func getWindowType(\n        axApp: AxUiElementMock,\n        _ id: KnownBundleId?,\n        _ activationPolicy: NSApplication.ActivationPolicy,\n        _ windowLevel: MacOsWindowLevel?,\n    ) -> AxUiElementWindowType {\n        .new(\n            isWindow: isWindowHeuristic(axApp: axApp, id, activationPolicy, windowLevel),\n            isDialog: { isDialogHeuristic(id, windowLevel) },\n        )\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/model/Json.swift",
    "content": "import AppKit\nimport Common\n\nenum Json: Encodable, Equatable {\n    // vector\n    case dict([String: Json])\n    case array([Json])\n\n    // scalar\n    case null\n    case string(String)\n    case int(Int)\n    case uint32(UInt32)\n    case bool(Bool)\n\n    func encode(to encoder: any Encoder) throws {\n        switch self {\n            case .array(let value): try value.encode(to: encoder)\n            case .dict(let value): try value.encode(to: encoder)\n            case .string(let value): try value.encode(to: encoder)\n            case .int(let value): try value.encode(to: encoder)\n            case .uint32(let value): try value.encode(to: encoder)\n            case .bool(let value): try value.encode(to: encoder)\n            case .null: try (nil as String?).encode(to: encoder)\n        }\n    }\n\n    static func newOrDie(_ value: Any?) -> Json {\n        if let value = value as? [String: Any?] {\n            return .dict(value.mapValues(newOrDie))\n        } else if let value = value as? [Any?] {\n            return .array(value.map(newOrDie))\n        } else if let value = value as? Int {\n            return .int(value)\n        } else if let value = value as? UInt32 {\n            return .uint32(value)\n        } else if let value = value as? Bool {\n            return .bool(value)\n        } else if let value = value as? String {\n            return .string(value)\n        } else if value == nil || value is NSNull {\n            return .null\n        } else {\n            die(\"Can't parse \\(String(describing: value)) (\\(type(of: value))) to JSON\")\n        }\n    }\n\n    static func stringOrNull(_ str: String?) -> Json { str.map(Json.string) ?? .null }\n\n    var rawValue: Any? {\n        switch self {\n            case .null: nil\n\n            case .array(let x): x\n            case .dict(let x): x\n\n            case .bool(let x): x\n            case .int(let x): x\n            case .string(let x): x\n            case .uint32(let x): x\n        }\n    }\n\n    var asDictOrDie: [String: Json] {\n        if case .dict(let dict) = self {\n            dict\n        } else {\n            dieT(\"\\(self) is not a dict\")\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/model/KnownBundleId.swift",
    "content": "enum KnownBundleId: String, Equatable {\n\n    case _1password = \"com.1password.1password\"\n    case activityMonitor = \"com.apple.ActivityMonitor\"\n    case alacritty = \"org.alacritty\"\n    case braveBrowser = \"com.brave.Browser\"\n    case chrome = \"com.google.Chrome\"\n    case cleanshotx = \"pl.maketheweb.cleanshotx\"\n    case emacs = \"org.gnu.Emacs\"\n    case finder = \"com.apple.finder\"\n    case ghostty = \"com.mitchellh.ghostty\"\n    case gimp = \"org.gimp.gimp-2.10\"\n    case iphonesimulator = \"com.apple.iphonesimulator\"\n    case iterm2 = \"com.googlecode.iterm2\"\n    case kitty = \"net.kovidgoyal.kitty\"\n    case photoBooth = \"com.apple.PhotoBooth\"\n    case qutebrowser = \"org.qutebrowser.qutebrowser\"\n    case screenstudio = \"com.timpler.screenstudio\"\n    case slack = \"com.tinyspeck.slackmacgap\"\n    case steam = \"com.valvesoftware.steam.helper\"\n    case wezterm = \"com.github.wez.wezterm\"\n    case xcode = \"com.apple.dt.Xcode\"\n    case zenBrowser = \"app.zen-browser.zen\"\n    case zoom = \"us.zoom.xos\"\n\n    case mozillaFirefox = \"org.mozilla.firefox\"\n    case mozillaFirefoxDeveloperEdition = \"org.mozilla.firefoxdeveloperedition\"\n    case mozillaFirefoxNightly = \"org.mozilla.nightly\"\n\n    case vscode = \"com.microsoft.VSCode\"\n    case vscodium = \"com.vscodium\"\n\n    var isFirefox: Bool {\n        self == .mozillaFirefox\n            || self == .mozillaFirefoxDeveloperEdition\n            || self == .mozillaFirefoxNightly\n            || self == .zenBrowser\n    }\n\n    var isVscode: Bool {\n        self == .vscode || self == .vscodium\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/model/Monitor.swift",
    "content": "import AppKit\nimport Common\n\nprivate struct MonitorImpl {\n    let monitorAppKitNsScreenScreensId: Int\n    let name: String\n    let rect: Rect\n    let visibleRect: Rect\n    let isMain: Bool\n}\n\nextension MonitorImpl: Monitor {\n    var height: CGFloat { rect.height }\n    var width: CGFloat { rect.width }\n}\n\n/// Use it instead of NSScreen because it can be mocked in tests\nprotocol Monitor: AeroAny {\n    /// The index in NSScreen.screens array. 1-based index\n    var monitorAppKitNsScreenScreensId: Int { get }\n    var name: String { get }\n    var rect: Rect { get }\n    var visibleRect: Rect { get }\n    var width: CGFloat { get }\n    var height: CGFloat { get }\n    var isMain: Bool { get }\n}\n\nfinal class LazyMonitor: Monitor {\n    private let screen: NSScreen\n    let monitorAppKitNsScreenScreensId: Int\n    let name: String\n    let width: CGFloat\n    let height: CGFloat\n    let isMain: Bool\n    private var _rect: Rect?\n    private var _visibleRect: Rect?\n\n    init(monitorAppKitNsScreenScreensId: Int, isMain: Bool, _ screen: NSScreen) {\n        self.monitorAppKitNsScreenScreensId = monitorAppKitNsScreenScreensId\n        self.name = screen.localizedName\n        self.width = screen.frame.width // Don't call rect because it would cause recursion during mainMonitor init\n        self.height = screen.frame.height // Don't call rect because it would cause recursion during mainMonitor init\n        self.screen = screen\n        self.isMain = isMain\n    }\n\n    var rect: Rect {\n        _rect ?? screen.rect.also { _rect = $0 }\n    }\n\n    var visibleRect: Rect {\n        _visibleRect ?? screen.visibleRect.also { _visibleRect = $0 }\n    }\n}\n\n// Note to myself: Don't use NSScreen.main, it's garbage\n// 1. The name is misleading, it's supposed to be called \"focusedScreen\"\n// 2. It's inaccurate because NSScreen.main doesn't work correctly from NSWorkspace.didActivateApplicationNotification &\n//    kAXFocusedWindowChangedNotification callbacks.\nextension NSScreen {\n    fileprivate func toMonitor(monitorAppKitNsScreenScreensId: Int) -> Monitor {\n        MonitorImpl(\n            monitorAppKitNsScreenScreensId: monitorAppKitNsScreenScreensId,\n            name: localizedName,\n            rect: rect,\n            visibleRect: visibleRect,\n            isMain: isMainScreen,\n        )\n    }\n\n    fileprivate var isMainScreen: Bool {\n        frame.minX == 0 && frame.minY == 0\n    }\n\n    /// The property is a replacement for Apple's crazy ``frame``\n    ///\n    /// - For ``MacWindow.topLeftCorner``, (0, 0) is main screen top left corner, and positive y-axis goes down.\n    /// - For ``frame``, (0, 0) is main screen bottom left corner, and positive y-axis goes up (which is crazy).\n    ///\n    /// The property \"normalizes\" ``frame``\n    fileprivate var rect: Rect { frame.monitorFrameNormalized() }\n\n    /// Same as ``rect`` but for ``visibleFrame``\n    fileprivate var visibleRect: Rect { visibleFrame.monitorFrameNormalized() }\n}\n\nprivate let testMonitorRect = Rect(topLeftX: 0, topLeftY: 0, width: 1920, height: 1080)\nprivate let testMonitor = MonitorImpl(\n    monitorAppKitNsScreenScreensId: 1,\n    name: \"Test Monitor\",\n    rect: testMonitorRect,\n    visibleRect: testMonitorRect,\n    isMain: true,\n)\n\nvar mainMonitor: Monitor {\n    if isUnitTest { return testMonitor }\n    let screens = NSScreen.screens\n    // Fallback: If main screen can't be found (e.g., during display reconfiguration),\n    // return screens.first or testMonitor to avoid crash\n    let screen = screens.withIndex.singleOrNil(where: \\.value.isMainScreen) ?? screens.first.map { (0, $0) }\n    guard let screen else { return testMonitor }\n    return LazyMonitor(monitorAppKitNsScreenScreensId: screen.index + 1, isMain: true, screen.value)\n}\n\nvar monitors: [Monitor] {\n    isUnitTest\n        ? [testMonitor]\n        : NSScreen.screens.enumerated().map { $0.element.toMonitor(monitorAppKitNsScreenScreensId: $0.offset + 1) }\n}\n\nvar sortedMonitors: [Monitor] {\n    monitors.sortedBy([\\.rect.minX, \\.rect.minY])\n}\n"
  },
  {
    "path": "Sources/AppBundle/model/MonitorDescriptionEx.swift",
    "content": "import Common\n\nextension MonitorDescription {\n    func resolveMonitor(sortedMonitors: [Monitor]) -> Monitor? {\n        return switch self {\n            case .sequenceNumber(let number): sortedMonitors.getOrNil(atIndex: number - 1)\n            case .main: mainMonitor\n            case .pattern(_, let regex): sortedMonitors.first { monitor in monitor.name.contains(regex.val) }\n            case .secondary:\n                sortedMonitors.takeIf { $0.count == 2 }?\n                    .first { $0.rect.topLeftCorner != mainMonitor.rect.topLeftCorner }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/model/MonitorEx.swift",
    "content": "extension Monitor {\n    @MainActor\n    var visibleRectPaddedByOuterGaps: Rect {\n        let topLeft = visibleRect.topLeftCorner\n        let gaps = ResolvedGaps(gaps: config.gaps, monitor: self)\n        return Rect(\n            topLeftX: topLeft.x + gaps.outer.left.toDouble(),\n            topLeftY: topLeft.y + gaps.outer.top.toDouble(),\n            width: visibleRect.width - gaps.outer.left.toDouble() - gaps.outer.right.toDouble(),\n            height: visibleRect.height - gaps.outer.top.toDouble() - gaps.outer.bottom.toDouble(),\n        )\n    }\n\n    var monitorId_oneBased: Int? {\n        let sorted = sortedMonitors\n        let origin = self.rect.topLeftCorner\n        return sorted.firstIndex { $0.rect.topLeftCorner == origin }.map { $0 + 1 }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/model/Rect.swift",
    "content": "import AppKit\nimport Common\n\nstruct Rect: ConvenienceCopyable, AeroAny {\n    var topLeftX: CGFloat\n    var topLeftY: CGFloat\n\n    private var _width: CGFloat\n    var width: CGFloat {\n        get { max(_width, 0) }\n        set(newValue) { _width = newValue }\n    }\n\n    private var _height: CGFloat\n    var height: CGFloat {\n        get { max(_height, 0) }\n        set(newValue) { _height = newValue }\n    }\n\n    init(topLeftX: CGFloat, topLeftY: CGFloat, width: CGFloat, height: CGFloat) {\n        self.topLeftX = topLeftX\n        self.topLeftY = topLeftY\n        self._width = width\n        self._height = height\n    }\n}\n\nextension CGRect {\n    func monitorFrameNormalized() -> Rect {\n        let mainMonitorHeight: CGFloat = mainMonitor.height\n        let rect = toRect()\n        return rect.copy(\\.topLeftY, mainMonitorHeight - rect.topLeftY)\n    }\n}\n\nextension CGRect {\n    func toRect() -> Rect {\n        Rect(topLeftX: minX, topLeftY: maxY, width: width, height: height)\n    }\n}\n\nextension Rect {\n    func contains(_ point: CGPoint) -> Bool {\n        minX.until(excl: maxX)?.contains(point.x) == true && minY.until(excl: maxY)?.contains(point.y) == true\n    }\n\n    var center: CGPoint {\n        CGPoint(x: topLeftX + width / 2, y: topLeftY + height / 2)\n    }\n\n    var topLeftCorner: CGPoint { CGPoint(x: topLeftX, y: topLeftY) }\n    var topRightCorner: CGPoint { CGPoint(x: maxX, y: minY) }\n    var bottomRightCorner: CGPoint { CGPoint(x: maxX, y: maxY) }\n    var bottomLeftCorner: CGPoint { CGPoint(x: minX, y: maxY) }\n\n    var minY: CGFloat { topLeftY }\n    var maxY: CGFloat { topLeftY + height }\n    var minX: CGFloat { topLeftX }\n    var maxX: CGFloat { topLeftX + width }\n\n    var size: CGSize { CGSize(width: width, height: height) }\n\n    func getDimension(_ orientation: Orientation) -> CGFloat { orientation == .h ? width : height }\n}\n"
  },
  {
    "path": "Sources/AppBundle/model/ServerEvent.swift",
    "content": "import Common\n\npublic struct ServerEvent: Codable, Sendable {\n    private let _event: ServerEventType\n\n    // periphery:ignore - false positive unused warning. The var properties are serialized to JSON\n    private var windowId: UInt32?\n    // periphery:ignore - false positive unused warning. The var properties are serialized to JSON\n    private var workspace: String?\n    // periphery:ignore - false positive unused warning. The var properties are serialized to JSON\n    private var prevWorkspace: String?\n    // periphery:ignore - false positive unused warning. The var properties are serialized to JSON\n    private var monitorId: Int? // 1-based\n    // periphery:ignore - false positive unused warning. The var properties are serialized to JSON\n    private var appBundleId: String?\n    // periphery:ignore - false positive unused warning. The var properties are serialized to JSON\n    private var appName: String?\n    // periphery:ignore - false positive unused warning. The var properties are serialized to JSON\n    private var mode: String?\n    // periphery:ignore - false positive unused warning. The var properties are serialized to JSON\n    private var binding: String?\n\n    public var eventType: ServerEventType { _event }\n\n    public static func focusChanged(windowId: UInt32?, workspace: String) -> ServerEvent {\n        ServerEvent(_event: .focusChanged, windowId: windowId, workspace: workspace)\n    }\n\n    public static func focusedMonitorChanged(workspace: String, monitorId_oneBased: Int) -> ServerEvent {\n        ServerEvent(_event: .focusedMonitorChanged, workspace: workspace, monitorId: monitorId_oneBased)\n    }\n\n    public static func workspaceChanged(workspace: String, prevWorkspace: String) -> ServerEvent {\n        ServerEvent(_event: .workspaceChanged, workspace: workspace, prevWorkspace: prevWorkspace)\n    }\n\n    public static func modeChanged(mode: String?) -> ServerEvent {\n        ServerEvent(_event: .modeChanged, mode: mode)\n    }\n\n    public static func windowDetected(windowId: UInt32, workspace: String?, appBundleId: String?, appName: String?) -> ServerEvent {\n        ServerEvent(_event: .windowDetected, windowId: windowId, workspace: workspace, appBundleId: appBundleId, appName: appName)\n    }\n\n    public static func bindingTriggered(mode: String, binding: String) -> ServerEvent {\n        ServerEvent(_event: .bindingTriggered, mode: mode, binding: binding)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/mouse/mouse.swift",
    "content": "import AppKit\n\n@MainActor var currentlyManipulatedWithMouseWindowId: UInt32? = nil\nvar isLeftMouseButtonDown: Bool { NSEvent.pressedMouseButtons == 1 }\n\n@MainActor\nfunc isManipulatedWithMouse(_ window: Window) async throws -> Bool {\n    try await (!window.isHiddenInCorner && // Don't allow to resize/move windows of hidden workspaces\n        isLeftMouseButtonDown &&\n        (currentlyManipulatedWithMouseWindowId == nil || window.windowId == currentlyManipulatedWithMouseWindowId))\n        .andAsync { @Sendable @MainActor in try await getNativeFocusedWindow() == window }\n}\n\n/// Same motivation as in monitorFrameNormalized\nvar mouseLocation: CGPoint {\n    let mainMonitorHeight: CGFloat = mainMonitor.height\n    let location = NSEvent.mouseLocation\n    return location.copy(\\.y, mainMonitorHeight - location.y)\n}\n"
  },
  {
    "path": "Sources/AppBundle/mouse/moveWithMouse.swift",
    "content": "import AppKit\nimport Common\n\n@MainActor\nprivate var moveWithMouseTask: Task<(), any Error>? = nil\n\nfunc movedObs(_: AXObserver, ax: AXUIElement, notif: CFString, _: UnsafeMutableRawPointer?) {\n    let windowId = ax.containingWindowId()\n    let notif = notif as String\n    Task { @MainActor in\n        guard let token: RunSessionGuard = .isServerEnabled else { return }\n        guard let windowId, let window = Window.get(byId: windowId), try await isManipulatedWithMouse(window) else {\n            scheduleRefreshSession(.ax(notif))\n            return\n        }\n        moveWithMouseTask?.cancel()\n        moveWithMouseTask = Task {\n            try checkCancellation()\n            try await runLightSession(.ax(notif), token) {\n                try await moveWithMouse(window)\n            }\n        }\n    }\n}\n\n@MainActor\nprivate func moveWithMouse(_ window: Window) async throws { // todo cover with tests\n    resetClosedWindowsCache()\n    guard let parent = window.parent else { return }\n    switch parent.cases {\n        case .workspace:\n            try await moveFloatingWindow(window)\n        case .tilingContainer:\n            moveTilingWindow(window)\n        case .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer,\n             .macosPopupWindowsContainer, .macosHiddenAppsWindowsContainer:\n            return // Unconventional windows can't be moved with mouse\n    }\n}\n\n@MainActor\nprivate func moveFloatingWindow(_ window: Window) async throws {\n    guard let targetWorkspace = try await window.getCenter()?.monitorApproximation.activeWorkspace else { return }\n    guard let parent = window.parent else { return }\n    if targetWorkspace != parent {\n        window.bindAsFloatingWindow(to: targetWorkspace)\n    }\n}\n\n@MainActor\nprivate func moveTilingWindow(_ window: Window) {\n    currentlyManipulatedWithMouseWindowId = window.windowId\n    window.lastAppliedLayoutPhysicalRect = nil\n    let mouseLocation = mouseLocation\n    let targetWorkspace = mouseLocation.monitorApproximation.activeWorkspace\n    let swapTarget = mouseLocation.findIn(tree: targetWorkspace.rootTilingContainer, virtual: false)?.takeIf { $0 != window }\n    if targetWorkspace != window.nodeWorkspace { // Move window to a different monitor\n        let index: Int = if let swapTarget, let parent = swapTarget.parent as? TilingContainer, let targetRect = swapTarget.lastAppliedLayoutPhysicalRect {\n            mouseLocation.getProjection(parent.orientation) >= targetRect.center.getProjection(parent.orientation)\n                ? swapTarget.ownIndex.orDie() + 1\n                : swapTarget.ownIndex.orDie()\n        } else {\n            0\n        }\n        window.bind(\n            to: swapTarget?.parent ?? targetWorkspace.rootTilingContainer,\n            adaptiveWeight: WEIGHT_AUTO,\n            index: index,\n        )\n    } else if let swapTarget {\n        swapWindows(window, swapTarget)\n    }\n}\n\n@MainActor\nfunc swapWindows(_ window1: Window, _ window2: Window) {\n    if window1 == window2 { return }\n    guard let index1 = window1.ownIndex else { return }\n    guard let index2 = window1.ownIndex else { return }\n\n    if index1 < index2 {\n        let binding2 = window2.unbindFromParent()\n        let binding1 = window1.unbindFromParent()\n\n        window2.bind(to: binding1.parent, adaptiveWeight: binding1.adaptiveWeight, index: binding1.index)\n        window1.bind(to: binding2.parent, adaptiveWeight: binding2.adaptiveWeight, index: binding2.index)\n    } else {\n        let binding1 = window1.unbindFromParent()\n        let binding2 = window2.unbindFromParent()\n\n        window1.bind(to: binding2.parent, adaptiveWeight: binding2.adaptiveWeight, index: binding2.index)\n        window2.bind(to: binding1.parent, adaptiveWeight: binding1.adaptiveWeight, index: binding1.index)\n    }\n}\n\nextension CGPoint {\n    @MainActor\n    func findIn(tree: TilingContainer, virtual: Bool) -> Window? {\n        let point = self\n        let target: TreeNode? = switch tree.layout {\n            case .tiles:\n                tree.children.first(where: {\n                    (virtual ? $0.lastAppliedLayoutVirtualRect : $0.lastAppliedLayoutPhysicalRect)?.contains(point) == true\n                })\n            case .accordion:\n                tree.mostRecentChild\n        }\n        guard let target else { return nil }\n        return switch target.tilingTreeNodeCasesOrDie() {\n            case .window(let window): window\n            case .tilingContainer(let container): findIn(tree: container, virtual: virtual)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/mouse/resizeWithMouse.swift",
    "content": "import AppKit\nimport Common\n\n@MainActor\nprivate var resizeWithMouseTask: Task<(), any Error>? = nil\n\nfunc resizedObs(_: AXObserver, ax: AXUIElement, notif: CFString, _: UnsafeMutableRawPointer?) {\n    let notif = notif as String\n    let windowId = ax.containingWindowId()\n    Task { @MainActor in\n        guard let token: RunSessionGuard = .isServerEnabled else { return }\n        guard let windowId, let window = Window.get(byId: windowId), try await isManipulatedWithMouse(window) else {\n            scheduleRefreshSession(.ax(notif))\n            return\n        }\n        resizeWithMouseTask?.cancel()\n        resizeWithMouseTask = Task {\n            try checkCancellation()\n            try await runLightSession(.ax(notif), token) {\n                try await resizeWithMouse(window)\n            }\n        }\n    }\n}\n\n@MainActor\nfunc resetManipulatedWithMouseIfPossible() async throws {\n    if currentlyManipulatedWithMouseWindowId != nil {\n        currentlyManipulatedWithMouseWindowId = nil\n        for workspace in Workspace.all {\n            workspace.resetResizeWeightBeforeResizeRecursive()\n        }\n        scheduleRefreshSession(.resetManipulatedWithMouse, optimisticallyPreLayoutWorkspaces: true)\n    }\n}\n\nprivate let adaptiveWeightBeforeResizeWithMouseKey = TreeNodeUserDataKey<CGFloat>(key: \"adaptiveWeightBeforeResizeWithMouseKey\")\n\n@MainActor\nprivate func resizeWithMouse(_ window: Window) async throws { // todo cover with tests\n    resetClosedWindowsCache()\n    guard let parent = window.parent else { return }\n    switch parent.cases {\n        case .workspace, .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer,\n             .macosPopupWindowsContainer, .macosHiddenAppsWindowsContainer:\n            return // Nothing to do for floating, or unconventional windows\n        case .tilingContainer:\n            guard let rect = try await window.getAxRect() else { return }\n            guard let lastAppliedLayoutRect = window.lastAppliedLayoutPhysicalRect else { return }\n            let (lParent, lOwnIndex) = window.closestParent(hasChildrenInDirection: .left, withLayout: .tiles) ?? (nil, nil)\n            let (dParent, dOwnIndex) = window.closestParent(hasChildrenInDirection: .down, withLayout: .tiles) ?? (nil, nil)\n            let (uParent, uOwnIndex) = window.closestParent(hasChildrenInDirection: .up, withLayout: .tiles) ?? (nil, nil)\n            let (rParent, rOwnIndex) = window.closestParent(hasChildrenInDirection: .right, withLayout: .tiles) ?? (nil, nil)\n            let table: [(CGFloat, TilingContainer?, Int?, Int?)] = [\n                (lastAppliedLayoutRect.minX - rect.minX, lParent, 0,                        lOwnIndex),               // Horizontal, to the left of the window\n                (rect.maxY - lastAppliedLayoutRect.maxY, dParent, dOwnIndex.map { $0 + 1 }, dParent?.children.count), // Vertical, to the down of the window\n                (lastAppliedLayoutRect.minY - rect.minY, uParent, 0,                        uOwnIndex),               // Vertical, to the up of the window\n                (rect.maxX - lastAppliedLayoutRect.maxX, rParent, rOwnIndex.map { $0 + 1 }, rParent?.children.count), // Horizontal, to the right of the window\n            ]\n            for (diff, parent, startIndex, pastTheEndIndex) in table {\n                if let parent, let startIndex, let pastTheEndIndex, pastTheEndIndex - startIndex > 0 && abs(diff) > 5 { // 5 pixels should be enough to fight with accumulated floating precision error\n                    let siblingDiff = diff.div(pastTheEndIndex - startIndex).orDie()\n                    let orientation = parent.orientation\n\n                    window.parentsWithSelf.lazy\n                        .prefix(while: { $0 != parent })\n                        .filter {\n                            let parent = $0.parent as? TilingContainer\n                            return parent?.orientation == orientation && parent?.layout == .tiles\n                        }\n                        .forEach { $0.setWeight(orientation, $0.getWeightBeforeResize(orientation) + diff) }\n                    for sibling in parent.children[startIndex ..< pastTheEndIndex] {\n                        sibling.setWeight(orientation, sibling.getWeightBeforeResize(orientation) - siblingDiff)\n                    }\n                }\n            }\n            currentlyManipulatedWithMouseWindowId = window.windowId\n    }\n}\n\nextension TreeNode {\n    @MainActor\n    fileprivate func getWeightBeforeResize(_ orientation: Orientation) -> CGFloat {\n        let currentWeight = getWeight(orientation) // Check assertions\n        return getUserData(key: adaptiveWeightBeforeResizeWithMouseKey)\n            ?? (lastAppliedLayoutVirtualRect?.getDimension(orientation) ?? currentWeight)\n            .also { putUserData(key: adaptiveWeightBeforeResizeWithMouseKey, data: $0) }\n    }\n\n    fileprivate func resetResizeWeightBeforeResizeRecursive() {\n        cleanUserData(key: adaptiveWeightBeforeResizeWithMouseKey)\n        for child in children {\n            child.resetResizeWeightBeforeResizeRecursive()\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/normalizeLayoutReason.swift",
    "content": "@MainActor\nfunc normalizeLayoutReason() async throws {\n    for workspace in Workspace.all {\n        let windows: [Window] = workspace.allLeafWindowsRecursive\n        try await _normalizeLayoutReason(workspace: workspace, windows: windows)\n    }\n    try await _normalizeLayoutReason(workspace: focus.workspace, windows: macosMinimizedWindowsContainer.children.filterIsInstance(of: Window.self))\n    try await validateStillPopups()\n}\n\n@MainActor\nprivate func validateStillPopups() async throws {\n    for node in macosPopupWindowsContainer.children {\n        let popup = (node as! MacWindow)\n        let windowLevel = getWindowLevel(for: popup.windowId)\n        if try await popup.isWindowHeuristic(windowLevel) {\n            try await popup.relayoutWindow(on: focus.workspace)\n            try await tryOnWindowDetected(popup)\n        }\n    }\n}\n\n@MainActor\nprivate func _normalizeLayoutReason(workspace: Workspace, windows: [Window]) async throws {\n    for window in windows {\n        let isMacosFullscreen = try await window.isMacosFullscreen\n        let isMacosMinimized = try await (!isMacosFullscreen).andAsync { @MainActor @Sendable in try await window.isMacosMinimized }\n        let isMacosWindowOfHiddenApp = !isMacosFullscreen && !isMacosMinimized &&\n            !config.automaticallyUnhideMacosHiddenApps && window.macAppUnsafe.nsApp.isHidden\n        switch window.layoutReason {\n            case .standard:\n                guard let parent = window.parent else { continue }\n                switch true {\n                    case isMacosFullscreen:\n                        window.layoutReason = .macos(prevParentKind: parent.kind)\n                        window.bind(to: workspace.macOsNativeFullscreenWindowsContainer, adaptiveWeight: WEIGHT_DOESNT_MATTER, index: INDEX_BIND_LAST)\n                    case isMacosMinimized:\n                        window.layoutReason = .macos(prevParentKind: parent.kind)\n                        window.bind(to: macosMinimizedWindowsContainer, adaptiveWeight: 1, index: INDEX_BIND_LAST)\n                    case isMacosWindowOfHiddenApp:\n                        window.layoutReason = .macos(prevParentKind: parent.kind)\n                        window.bind(to: workspace.macOsNativeHiddenAppsWindowsContainer, adaptiveWeight: WEIGHT_DOESNT_MATTER, index: INDEX_BIND_LAST)\n                    default: break\n                }\n            case .macos(let prevParentKind):\n                if !isMacosFullscreen && !isMacosMinimized && !isMacosWindowOfHiddenApp {\n                    try await exitMacOsNativeUnconventionalState(window: window, prevParentKind: prevParentKind, workspace: workspace)\n                }\n        }\n    }\n}\n\n@MainActor\nfunc exitMacOsNativeUnconventionalState(window: Window, prevParentKind: NonLeafTreeNodeKind, workspace: Workspace) async throws {\n    window.layoutReason = .standard\n    switch prevParentKind {\n        case .workspace:\n            window.bindAsFloatingWindow(to: workspace)\n        case .tilingContainer:\n            try await window.relayoutWindow(on: workspace, forceTile: true)\n        case .macosPopupWindowsContainer: // Since the window was minimized/fullscreened it was mistakenly detected as popup. Relayout the window\n            try await window.relayoutWindow(on: workspace)\n        case .macosMinimizedWindowsContainer, .macosFullscreenWindowsContainer, .macosHiddenAppsWindowsContainer: // wtf case, should never be possible. But If encounter it, let's just re-layout window\n            try await window.relayoutWindow(on: workspace)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/runLoop.swift",
    "content": "import Common\nimport Foundation\n\nextension Thread {\n    @discardableResult\n    func runInLoopAsync(\n        job: RunLoopJob = RunLoopJob(),\n        autoCheckCancelled: Bool = true,\n        _ body: @Sendable @escaping (RunLoopJob) -> (),\n    ) -> RunLoopJob {\n        let action = RunLoopAction(job: job, autoCheckCancelled: autoCheckCancelled, body)\n        // Alternative: CFRunLoopPerformBlock + CFRunLoopWakeUp\n        action.perform(#selector(action.action), on: self, with: nil, waitUntilDone: false)\n        return job\n    }\n\n    func runInLoop<T>(_ body: @Sendable @escaping (RunLoopJob) throws -> T) async throws -> T { // todo try to convert to typed throws\n        try checkCancellation()\n        let job = RunLoopJob()\n        return try await withTaskCancellationHandler {\n            try await withCheckedThrowingContinuation { cont in\n                // It's unsafe to implicitly cancel because cont.resume should be invoked exactly once\n                self.runInLoopAsync(job: job, autoCheckCancelled: false) { job in\n                    do {\n                        try job.checkCancellation()\n                        cont.resume(returning: try body(job))\n                    } catch {\n                        cont.resume(throwing: error)\n                    }\n                }\n            }\n        } onCancel: {\n            job.cancel()\n        }\n    }\n}\n\nprivate final class RunLoopAction: NSObject, Sendable {\n    private let _action: @Sendable (RunLoopJob) -> ()\n    let job: RunLoopJob\n    private let autoCheckCancelled: Bool\n    private let _refreshSessionEvent: RefreshSessionEvent?\n    init(job: RunLoopJob, autoCheckCancelled: Bool, _ action: @escaping @Sendable (RunLoopJob) -> ()) {\n        self.job = job\n        self.autoCheckCancelled = autoCheckCancelled\n        _action = action\n        _refreshSessionEvent = refreshSessionEvent\n    }\n    @objc func action() {\n        if autoCheckCancelled && job.isCancelled { return }\n        $refreshSessionEvent.withValue(_refreshSessionEvent) {\n            _action(job)\n        }\n    }\n}\n\nfinal class RunLoopJob: Sendable, AeroAny {\n    // Alternative 1. In macOS 15, it's possible to use `Atomic<Bool>` from `Synchronization` module\n    // Alternative 2. https://github.com/apple/swift-atomics/tree/main but I don't want to add one more dependency just for\n    //                AtomicBool\n    nonisolated(unsafe) private var _isCancelled: Int32 = 0\n    var isCancelled: Bool { _isCancelled == 1 }\n    func cancel() {\n        while !isCancelled {\n            OSAtomicCompareAndSwapInt(0, 1, &_isCancelled)\n        }\n    }\n\n    static let cancelled: RunLoopJob = RunLoopJob().also { $0.cancel() }\n\n    func checkCancellation() throws {\n        if isCancelled {\n            throw CancellationError()\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/server.swift",
    "content": "import AppKit\nimport Common\nimport Network\n\nfunc startUnixSocketServer() {\n    try? FileManager.default.removeItem(atPath: socketPath)\n    let params = NWParameters.tcp\n    params.requiredLocalEndpoint = .unix(path: socketPath)\n    let listener = Result { try NWListener(using: params) }.getOrDie()\n    listener.newConnectionHandler = { connection in\n        Task {\n            defer { connection.cancel() }\n            connection.start(queue: .global())\n            await newConnection(connection)\n        }\n    }\n    listener.start(queue: .global())\n}\n\nfunc toggleReleaseServerIfDebug(_ state: EnableCmdArgs.State) async {\n    if serverArgs.isReadOnly { return }\n    if !isDebug { return }\n    let socketFile = \"/tmp/\\(stableAeroSpaceAppId)-\\(unixUserName).sock\"\n    let connection = NWConnection(to: NWEndpoint.unix(path: socketFile), using: .tcp)\n    defer { connection.cancel() }\n    if await connection.startBlocking().error != nil { // Can't connect, AeroSpace.app is not running\n        return\n    }\n\n    let req = ClientRequest(args: [\"enable\", state.rawValue], stdin: \"\", windowId: nil, workspace: nil)\n    _ = await connection.writeAtomic(req)\n    _ = await connection.readNonAtomic()\n}\n\nprivate let serverVersionAndHash = \"\\(aeroSpaceAppVersion) \\(gitHash)\"\n\nprivate func newConnection(_ connection: NWConnection) async { // todo add exit codes\n    func answerToClient(exitCode: Int32, stdout: String = \"\", stderr: String = \"\") async {\n        let ans = ServerAnswer(exitCode: exitCode, stdout: stdout, stderr: stderr, serverVersionAndHash: serverVersionAndHash)\n        await answerToClient(ans)\n    }\n    func answerToClient(_ ans: ServerAnswer) async {\n        _ = await connection.writeAtomic(ans)\n    }\n    while true {\n        let rawRequest: Data\n        switch await connection.readNonAtomic() {\n            case .success(let _rawRequest): rawRequest = _rawRequest\n            case .failure(let error):\n                await answerToClient(exitCode: 1, stderr: \"Error: \\(error)\")\n                return\n        }\n        let request: ClientRequest\n        switch ClientRequest.decodeJson(rawRequest) {\n            case .success(let _request): request = _request\n            case .failure(let error):\n                await answerToClient(\n                    exitCode: 1,\n                    stderr: \"\"\"\n                        Can't parse request '\\(String(describing: String(data: rawRequest, encoding: .utf8)).singleQuoted)'.\n                        Error: \\(error)\n                        \"\"\",\n                )\n                continue\n        }\n        // Handle subscribe before parseCommand (subscribe doesn't have a Command impl)\n        if request.args.first == \"subscribe\" {\n            switch parseSubscribeCmdArgs(request.args.slice(1...).orDie()) {\n                case .cmd(let subscribeArgs): await handleSubscribeAndWaitTillError(connection, subscribeArgs)\n                case .help(let help): await answerToClient(exitCode: 0, stdout: help)\n                case .failure(let err): await answerToClient(exitCode: 1, stderr: err)\n            }\n            continue\n        }\n        let (command, help, err) = parseCommand(request.args).unwrap()\n        guard let token: RunSessionGuard = await .isServerEnabled(orIsEnableCommand: command) else {\n            await answerToClient(\n                exitCode: 1,\n                stderr: \"\\(aeroSpaceAppName) server is disabled and doesn't accept commands. \" +\n                    \"You can use 'aerospace enable on' to enable the server\",\n            )\n            continue\n        }\n        if let help {\n            await answerToClient(exitCode: 0, stdout: help)\n            continue\n        }\n        if let err {\n            await answerToClient(exitCode: 1, stderr: err)\n            continue\n        }\n        if command?.isExec == true {\n            await answerToClient(exitCode: 1, stderr: \"exec-and-forget is prohibited in CLI\")\n            continue\n        }\n        if let command {\n            let _answer: Result<ServerAnswer, Error> = await Result {\n                try await runLightSession(.socketServer(command.args), token) { () throws in\n                    let env = CmdEnv.init(\n                        windowId: request.windowId.flatMap { $0 },\n                        workspaceName: request.workspace.flatMap { $0 },\n                    )\n                    let cmdResult = try await command.run(env, CmdStdin(request.stdin))\n                    return ServerAnswer(\n                        exitCode: cmdResult.exitCode,\n                        stdout: cmdResult.stdout.joined(separator: \"\\n\"),\n                        stderr: cmdResult.stderr.joined(separator: \"\\n\"),\n                        serverVersionAndHash: serverVersionAndHash,\n                    )\n                }\n            }\n            var answer = _answer.getOrNil() ??\n                ServerAnswer(\n                    exitCode: 1,\n                    stderr: \"Fail to await main thread. \\(_answer.failureOrNil?.localizedDescription ?? \"\")\",\n                    serverVersionAndHash: serverVersionAndHash,\n                )\n            if request.windowId == nil || request.workspace == nil {\n                answer.stderr += \"\\n\\nAeroSpace client has sent incomplete JSON request. 'windowId' or/and 'workspace' fields are missing. Please forward your AEROSPACE_WINDOW_ID and AEROSPACE_WORKSPACE environment variables to these JSON fields. If the appropriate environment variables are empty, pass explict 'null' in the JSON.\"\n            }\n            await answerToClient(answer)\n            continue\n        }\n        die(\"Unreachable\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/shell/Shell.swift",
    "content": "// periphery:ignore:all - This is WIP file todo\nimport Antlr4\nimport Common\nimport ShellParserGenerated\n\ntypealias TK = ShellParser.Tokens\n\n/// Use the following technique for quick grammar testing:\n///     source .deps/python-venv/bin/activate.fish\n///     echo \"foo bar\" | antlr4-parse ./grammar/ShellLexer.g4 ./grammar/ShellParser.g4 root -gui\nextension String {\n    func parseShell() -> Result<RawShell, String> {\n        let stream = ANTLRInputStream(self)\n        let lexer = ShellLexer(stream)\n        let errorsCollector = ErrorListenerCollector()\n        lexer.addErrorListener(errorsCollector)\n        let tokenStream = CommonTokenStream(lexer)\n        let parser: ShellParser\n        switch Result(catching: { try ShellParser(tokenStream) }) {\n            case .success(let x): parser = x\n            case .failure(let msg):\n                return .failure(msg.localizedDescription)\n        }\n        parser.addErrorListener(errorsCollector)\n        let root: ShellParser.RootContext\n        switch Result(catching: { try parser.root() }) {\n            case .success(let x): root = x\n            case .failure(let msg):\n                return .failure(msg.localizedDescription)\n        }\n        if !errorsCollector.errors.isEmpty {\n            return .failure(errorsCollector.errors.joinErrors())\n        }\n        return root.cmds().map { $0.toTyped() } ?? .success(.empty)\n    }\n}\n\nlet keywords = [TK.DO, TK.THEN, TK.IF, TK.END, TK.ELSE, TK.SWITCH, TK.IN, TK.CASE, TK.WHILE, TK.DEFER, TK.FOR, TK.CATCH].map(\\.rawValue)\n\nfinal class ErrorListenerCollector: BaseErrorListener {\n    var errors: [String] = []\n    override func syntaxError(\n        _ recognizer: Recognizer<some Any>,\n        _ offendingSymbol: AnyObject?,\n        _ line: Int,\n        _ charPositionInLine: Int,\n        _ msg: String,\n        _ e: AnyObject?,\n    ) {\n        let offendingToken = (offendingSymbol as? Token)?.getType()\n        if offendingToken == TK.TRIPLE_QUOTE.rawValue {\n            errors.append(\"Triple quotes are reserved for future use. Please put spaces in between if you meant separate args\")\n            return\n        }\n        let helper = if let offendingToken, keywords.contains(offendingToken),\n                        let name = ShellParser.VOCABULARY.getSymbolicName(offendingToken)\n        {\n            \". \\(name) is a reserved keyword. Please, put quotes around it, if you want to use it as an argument\"\n        } else if offendingToken == TK.ANY.rawValue {\n            \". Please put the character/word in quotes, if you want to use it as an argument\"\n        } else {\n            \"\"\n        }\n        errors.append(\"Syntax error at \\(line):\\(charPositionInLine) \\(msg)\\(helper)\")\n    }\n}\n\nextension ShellParser.CmdsContext {\n    func toTyped() -> Result<RawShell, String> {\n        if let x = self as? ShellParser.SeqContext {\n            return x.cmd().toTyped(\"seq node: nil cmd\")\n                .combine { x.cmds().mapAllOrFailures { $0.toTyped() }.mapError { $0.joinErrors() } }\n                .flatMap {\n                    let seq = [$0.0] + $0.1\n                    return switch seq.count {\n                        case 0: .failure(\"seq node: 0 children\")\n                        case 1: .success(seq.first.orDie())\n                        default: .success(Shell.seq(seq))\n                    }\n                }\n        }\n        if let x = self as? ShellParser.IfElseContext {\n            return Result { try parseIfElse(x) }.mapError { $0 as! String }\n        }\n        return .failure(\"Unknown node type: \\(self)\")\n    }\n}\n\nprivate func parseIfElse(_ ifElse: ShellParser.IfElseContext) throws -> Shell<String> {\n    var lastCond: Shell<String>? = nil\n    var branches: [Branch<String>] = []\n    var elseVisited = false\n    guard let children = ifElse.children else { throw \"switch if: nil children\" }\n    for child in children {\n        if let child = child as? ShellParser.CmdContext {\n            if let lastCond { branches.append(Branch(cond: lastCond, then: nil)) }\n            lastCond = try child.toTyped().get()\n        } else if let child = child as? ShellParser.CmdsContext {\n            if elseVisited {\n                return .ifElse(IfElse(branches: branches, elseBranch: try child.toTyped().get()))\n            } else {\n                try branches.append(Branch(cond: lastCond ?? throwT(\"nil lastCond\"), then: child.toTyped().get()))\n                lastCond = nil\n            }\n        } else if let child = child as? TerminalNode,\n                  child.getSymbol()?.getType() == TK.ELSE.rawValue\n        {\n            elseVisited = true\n            if let lastCond { branches.append(Branch(cond: lastCond, then: nil)) }\n            lastCond = nil\n        }\n    }\n    if let lastCond {\n        if elseVisited { throw \"ifElse node: wtf\" }\n        return .ifElse(IfElse(branches: [Branch(cond: lastCond, then: nil)], elseBranch: nil))\n    }\n    return .ifElse(IfElse(branches: branches, elseBranch: nil))\n}\n\nextension ShellParser.CmdContext {\n    func toTyped() -> Result<RawShell, String> {\n        if let x = self as? ShellParser.PipeContext {\n            return binaryNode(Shell.pipe, x.cmd(0), x.cmd(1))\n        }\n        if let x = self as? ShellParser.AndContext {\n            return binaryNode(Shell.and, x.cmd(0), x.cmd(1))\n        }\n        if let x = self as? ShellParser.OrContext {\n            return binaryNode(Shell.or, x.cmd(0), x.cmd(1))\n        }\n        if let x = self as? ShellParser.ParensContext {\n            return x.cmds().toTyped(\"parens node: nil childe\")\n        }\n        if let x = self as? ShellParser.ArgsContext {\n            return (x.WORD()?.getText()).orFailure(\"args node: nil first word\").map(ShellString.text)\n                .combine { x.arg().mapAllOrFailures { $0.toTyped() }.mapError { $0.joinErrors() } }\n                .map { [$0.0] + $0.1 }\n                .map(Shell.args)\n        }\n        return .failure(\"Unknown node type: \\(self)\")\n    }\n}\n\nextension ShellParser.ArgContext {\n    func toTyped() -> Result<ShellString<String>, String> {\n        if let x = self as? ShellParser.WordContext {\n            return .success(.text(x.getText()))\n        }\n        if let x = self as? ShellParser.DQuotedStringContext {\n            return x.dStringFragment().mapAllOrFailures { $0.toTyped() }\n                .mapError { $0.joinErrors() }.map(ShellString.concatOptimized)\n        }\n        if let x = self as? ShellParser.SQuotedStringContext {\n            return .success(.text(String(x.getText().dropFirst(1).dropLast(1))))\n        }\n        if let x = self as? ShellParser.SubstitutionContext {\n            return x.cmds().toTyped(\"substitution node: nil child\").map(ShellString.interpolation)\n        }\n        return .failure(\"Unknown node type: \\(self)\")\n    }\n}\n\nextension ShellParser.DStringFragmentContext {\n    func toTyped() -> Result<ShellString<String>, String> {\n        if let x = self as? ShellParser.EscapeSequenceContext {\n            return switch x.getText() {\n                case \"\\\\n\": .success(.text(\"\\n\"))\n                case \"\\\\t\": .success(.text(\"\\t\"))\n                case \"\\\\$\": .success(.text(\"$\"))\n                case \"\\\\\\\"\": .success(.text(\"\\\"\"))\n                case \"\\\\\\\\\": .success(.text(\"\\\\\"))\n                default: .failure(\"Unknown ESCAPE_SEQUENCE '\\(x.getText())'\")\n            }\n        }\n        if let x = self as? ShellParser.TextContext {\n            return .success(.text(x.getText()))\n        }\n        if let x = self as? ShellParser.InterpolationContext {\n            return x.cmds().toTyped(\"interpolation node: nil child\").map(ShellString.interpolation)\n        }\n        return .failure(\"Unknown node type: \\(self)\")\n    }\n}\n\nprivate func binaryNode(\n    _ op: (RawShell, RawShell) -> RawShell,\n    _ a: ShellParser.CmdContext?,\n    _ b: ShellParser.CmdContext?,\n) -> Result<RawShell, String> {\n    a.toTyped(\"binary node: nil child 0\").combine { b.toTyped(\"binary node: nil child 1\") }.map(op)\n}\n\nextension Result {\n    func combine<T>(_ other: () -> Result<T, Failure>) -> Result<(Success, T), Failure> {\n        flatMap { a in\n            other().flatMap { b in\n                .success((a, b))\n            }\n        }\n    }\n}\n\nextension Result where Success == ShellParser.CmdContext, Failure == String {\n    func toTyped() -> Result<RawShell, String> { flatMap { $0.toTyped() } }\n}\nextension Result where Success == ShellParser.CmdsContext, Failure == String {\n    func toTyped() -> Result<RawShell, String> { flatMap { $0.toTyped() } }\n}\n\nextension ShellParser.CmdContext? {\n    fileprivate func toTyped(_ msg: String) -> Result<RawShell, String> { orFailure(msg).toTyped() }\n}\nextension ShellParser.CmdsContext? {\n    fileprivate func toTyped(_ msg: String) -> Result<RawShell, String> { orFailure(msg).toTyped() }\n}\n\n// protocol AeroShell {\n//     func run(_ state: CmdMutableState) -> CmdOut\n// }\n// extension [String] : AeroShell {\n//     func run(_ state: CmdMutableState) -> CmdOut { .succ(self) }\n// }\n\nextension Shell: Equatable where T: Equatable {}\ntypealias AeroShell = Shell<any Command>\ntypealias RawShell = Shell<String>\nindirect enum Shell<T> {\n    case args([ShellString<T>])\n    case empty\n\n    case ifElse(IfElse<T>)\n\n    // Listed in precedence order\n    case pipe(Shell<T>, Shell<T>)\n    case and(Shell<T>, Shell<T>)\n    case or(Shell<T>, Shell<T>)\n    case seq([Shell<T>])\n\n    static func ifElse(_ branches: (Shell<T>, Shell<T>?)..., elseB: Shell<T>?) -> Shell<T> {\n        .ifElse(IfElse(branches: branches.map { Branch(cond: $0.0, then: $0.1) }, elseBranch: elseB))\n    }\n}\n\nextension IfElse: Equatable where T: Equatable {}\nstruct IfElse<T> {\n    let branches: [Branch<T>]\n    let elseBranch: Shell<T>?\n}\n\nextension Branch: Equatable where T: Equatable {}\nstruct Branch<T> {\n    let cond: Shell<T>\n    let then: Shell<T>?\n}\n\nextension ShellString: Equatable where T: Equatable {}\nenum ShellString<T> {\n    case text(String)\n    case interpolation(Shell<T>)\n    case concat([ShellString<T>])\n\n    static func concatOptimized(_ fragments: [ShellString<T>]) -> ShellString<T> {\n        var result: [ShellString<T>] = []\n        var current: String = \"\"\n        _concatOptimized(fragments, &result, &current)\n        if !current.isEmpty {\n            result.append(.text(current))\n        }\n        return result.singleOrNil() ?? .concat(result)\n    }\n\n    private static func _concatOptimized(\n        _ fragments: [ShellString<T>],\n        _ result: inout [ShellString<T>],\n        _ current: inout String,\n    ) {\n        for fragment in fragments {\n            switch fragment {\n                case .text(let text): current += text\n                case .concat(let newFragments): _concatOptimized(newFragments, &result, &current)\n                case .interpolation:\n                    if !current.isEmpty {\n                        result.append(.text(current))\n                        current = \"\"\n                    }\n                    result.append(fragment)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/subscriptions.swift",
    "content": "import Common\nimport Foundation\nimport Network\n\nprivate struct Subscriber {\n    let connection: NWConnection\n    let events: Set<ServerEventType>\n}\n\n@MainActor private var subscribers: [UniqueToken: Subscriber] = [:]\n\n@MainActor\nfunc handleSubscribeAndWaitTillError(_ connection: NWConnection, _ args: SubscribeCmdArgs) async {\n    let id = UniqueToken()\n    subscribers[id] = Subscriber(connection: connection, events: args.events)\n    defer { subscribers.removeValue(forKey: id) }\n    if args.sendInitial {\n        let f = focus\n        for eventType in args.events {\n            let event: ServerEvent\n            switch eventType {\n                case .focusChanged:\n                    event = .focusChanged(windowId: f.windowOrNil?.windowId, workspace: f.workspace.name)\n                case .workspaceChanged:\n                    event = .workspaceChanged(workspace: f.workspace.name, prevWorkspace: f.workspace.name)\n                case .modeChanged:\n                    event = .modeChanged(mode: activeMode)\n                case .focusedMonitorChanged:\n                    event = .focusedMonitorChanged(\n                        workspace: f.workspace.name,\n                        monitorId_oneBased: f.workspace.workspaceMonitor.monitorId_oneBased ?? 0,\n                    )\n                case .windowDetected, .bindingTriggered: continue\n            }\n            if await connection.writeAtomic(event, jsonEncoder).error != nil {\n                return\n            }\n        }\n    }\n\n    // Keep connection alive - wait for client to disconnect\n    await connection.readTillError()\n}\n\nprivate let jsonEncoder: JSONEncoder = {\n    let e = JSONEncoder()\n    e.outputFormatting = [.withoutEscapingSlashes, .sortedKeys]\n    return e\n}()\n\nfunc broadcastEvent(_ event: ServerEvent) {\n    Task { @MainActor in\n        for (id, subscriber) in subscribers {\n            guard subscriber.events.contains(event.eventType) else { continue }\n            if await subscriber.connection.writeAtomic(event, jsonEncoder).error != nil {\n                _ = subscribers.removeValue(forKey: id)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/AbstractApp.swift",
    "content": "import Common\n\nprotocol AbstractApp: AnyObject, Hashable, AeroAny {\n    var pid: Int32 { get }\n    var rawAppBundleId: String? { get }\n\n    @MainActor func getFocusedWindow() async throws -> Window?\n    var name: String? { get }\n    var execPath: String? { get }\n    var bundlePath: String? { get }\n}\n\nextension AbstractApp {\n    static func == (lhs: Self, rhs: Self) -> Bool {\n        if lhs.pid == rhs.pid {\n            check(lhs === rhs)\n            return true\n        } else {\n            check(lhs !== rhs)\n            return false\n        }\n    }\n\n    func hash(into hasher: inout Hasher) {\n        hasher.combine(pid)\n    }\n}\n\nextension Window {\n    var macAppUnsafe: MacApp { app as! MacApp }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/MacApp.swift",
    "content": "import AppKit\nimport Common\n\n// Potential alternative implementation\n// https://github.com/swiftlang/swift-evolution/blob/main/proposals/0392-custom-actor-executors.md\n// (only available since macOS 14)\nfinal class MacApp: AbstractApp {\n    /*conforms*/ let pid: Int32\n    /*conforms*/ let rawAppBundleId: String?\n    let appId: KnownBundleId?\n    let nsApp: NSRunningApplication\n    private let axApp: ThreadGuardedValue<AXUIElement>\n    private let appAxSubscriptions: ThreadGuardedValue<[AxSubscription]> // keep subscriptions in memory\n    private let windows: ThreadGuardedValue<[UInt32: AxWindow]> = .init([:])\n    private var windowsCount = 0\n    var lastNativeFocusedWindowId: UInt32? = nil\n    private var thread: Thread?\n    private var setFrameJobs: [UInt32: RunLoopJob] = [:]\n    @MainActor private static var focusJob: RunLoopJob? = nil\n\n    /*conforms*/ var name: String? { nsApp.localizedName }\n    /*conforms*/ var execPath: String? { nsApp.executableURL?.path }\n    /*conforms*/ var bundlePath: String? { nsApp.bundleURL?.path }\n\n    // todo think if it's possible to integrate this global mutable state to https://github.com/nikitabobko/AeroSpace/issues/1215\n    //      and make deinitialization automatic in deinit\n    @MainActor static var allAppsMap: [pid_t: MacApp] = [:]\n    @MainActor private static var wipPids: [pid_t: AwaitableOneTimeBroadcastLatch] = [:]\n\n    private init(_ nsApp: NSRunningApplication, _ axApp: AXUIElement, _ axSubscriptions: [AxSubscription], _ thread: Thread) {\n        self.nsApp = nsApp\n        self.axApp = .init(axApp)\n        self.pid = nsApp.processIdentifier\n        self.rawAppBundleId = nsApp.bundleIdentifier\n        self.appId = nsApp.bundleIdentifier.flatMap { KnownBundleId.init(rawValue: $0) }\n        assert(!axSubscriptions.isEmpty)\n        self.appAxSubscriptions = .init(axSubscriptions)\n        self.thread = thread\n    }\n\n    @MainActor\n    @discardableResult\n    static func getOrRegister(_ nsApp: NSRunningApplication) async throws -> MacApp? {\n        // Don't perceive any of the lock screen windows as real windows\n        // Otherwise, false positive ax notifications might trigger that lead to gcWindows\n        if nsApp.bundleIdentifier == lockScreenAppBundleId { return nil }\n        let pid = nsApp.processIdentifier\n        // AX requests crash if you send them to yourself\n        if pid == myPid { return nil }\n\n        while true {\n            if let existing = allAppsMap[pid] { return existing }\n            try checkCancellation()\n            if let wip = wipPids[pid] {\n                try await wip.await()\n                continue\n            }\n            let wip = AwaitableOneTimeBroadcastLatch()\n            wipPids[pid] = wip\n\n            let thread = Thread {\n                $axTaskLocalAppThreadToken.withValue(AxAppThreadToken(pid: pid, idForDebug: nsApp.idForDebug)) {\n                    let axApp = AXUIElementCreateApplication(nsApp.processIdentifier)\n                    let handlers: HandlerToNotifKeyMapping = [\n                        (refreshObs, [kAXWindowCreatedNotification, kAXFocusedWindowChangedNotification]),\n                    ]\n                    let job = RunLoopJob()\n                    let subscriptions = (try? AxSubscription.bulkSubscribe(nsApp, axApp, job, handlers)) ?? []\n                    let isGood = !subscriptions.isEmpty\n                    let app = isGood ? MacApp(nsApp, axApp, subscriptions, Thread.current) : nil\n                    Task { @MainActor in\n                        allAppsMap[pid] = app\n                        await wip.signalToAll()\n                        wipPids[pid] = nil\n                    }\n                    if isGood {\n                        CFRunLoopRun()\n                    }\n                }\n            }\n            thread.name = \"AxAppThread \\(nsApp.idForDebug)\"\n            thread.start()\n        }\n    }\n\n    func closeAndUnregisterAxWindow(_ windowId: UInt32) {\n        if serverArgs.isReadOnly { return }\n        setFrameJobs.removeValue(forKey: windowId)?.cancel()\n        _ = withWindowAsync(windowId) { [windows] window, job in\n            guard let closeButton = window.get(Ax.closeButtonAttr) else { return }\n            if AXUIElementPerformAction(closeButton.cast, kAXPressAction as CFString) == .success {\n                windows.threadGuarded.removeValue(forKey: windowId)\n            }\n        }\n    }\n\n    func getAxSize(_ windowId: UInt32) async throws -> CGSize? {\n        try await withWindow(windowId) { window, job in\n            window.get(Ax.sizeAttr)\n        }\n    }\n\n    // todo merge together with detectNewWindows\n    func getFocusedWindow() async throws -> Window? {\n        let windowId = try await thread?.runInLoop { [nsApp, axApp, windows] job in\n            try axApp.threadGuarded.get(Ax.focusedWindowAttr)\n                .flatMap { try windows.threadGuarded.getOrRegisterAxWindow(windowId: $0.windowId, $0.ax.cast, nsApp, job) }?\n                .windowId\n        }\n        guard let windowId else { return nil }\n        return try await MacWindow.getOrRegister(windowId: windowId, macApp: self)\n    }\n\n    @MainActor func nativeFocus(_ windowId: UInt32) {\n        if serverArgs.isReadOnly { return }\n        MacApp.focusJob?.cancel()\n        // Performance optimization. If possible avoid doing AX requests\n        // (important for apps which are slow at responding even such basic AX requests. E.g. Godot)\n        // Beware of the macOS bug: https://github.com/nikitabobko/AeroSpace/issues/101\n        if (!NSScreen.screensHaveSeparateSpaces || monitors.count == 1) &&\n            (lastNativeFocusedWindowId == windowId || windowsCount == 1)\n        {\n            nsApp.activate(options: .activateIgnoringOtherApps)\n        } else {\n            MacApp.focusJob = withWindowAsync(windowId) { [nsApp] window, job in\n                // Raise firstly to make sure that by the time we activate the app, the window would be already on top\n                window.set(Ax.isMainAttr, true)\n                AXUIElementPerformAction(window, kAXRaiseAction as CFString)\n                nsApp.activate(options: .activateIgnoringOtherApps)\n            }\n        }\n    }\n\n    func setAxFrame(_ windowId: UInt32, _ topLeft: CGPoint?, _ size: CGSize?) {\n        setFrameJobs.removeValue(forKey: windowId)?.cancel()\n        setFrameJobs[windowId] = withWindowAsync(windowId) { [axApp] window, job in\n            try disableAnimations(app: axApp.threadGuarded, job) {\n                try setFrame(window, topLeft, size, job)\n            }\n        }\n    }\n\n    func setAxFrameBlocking(_ windowId: UInt32, _ topLeft: CGPoint?, _ size: CGSize?) async throws {\n        setFrameJobs.removeValue(forKey: windowId)?.cancel()\n        try await withWindow(windowId) { [axApp] window, job in\n            try disableAnimations(app: axApp.threadGuarded, job) {\n                try setFrame(window, topLeft, size, job)\n            }\n        }\n    }\n\n    func getAxWindowsCount() async throws -> Int? {\n        try await thread?.runInLoop { [axApp] job in\n            axApp.threadGuarded.get(Ax.windowsAttr)?.count\n        }\n    }\n\n    func getAxRect(_ windowId: UInt32) async throws -> Rect? {\n        try await withWindow(windowId) { window, job in\n            guard let topLeftCorner = window.get(Ax.topLeftCornerAttr) else { return nil }\n            guard let size = window.get(Ax.sizeAttr) else { return nil }\n            return Rect(topLeftX: topLeftCorner.x, topLeftY: topLeftCorner.y, width: size.width, height: size.height)\n        }\n    }\n\n    func isWindowHeuristic(_ windowId: UInt32, _ windowLevel: MacOsWindowLevel?) async throws -> Bool {\n        return try await withWindow(windowId) { [nsApp, axApp, appId] window, job in\n            window.isWindowHeuristic(axApp: axApp.threadGuarded, appId, nsApp.activationPolicy, windowLevel)\n        } == true\n    }\n\n    func getAxUiElementWindowType(_ windowId: UInt32, _ windowLevel: MacOsWindowLevel?) async throws -> AxUiElementWindowType {\n        return try await withWindow(windowId) { [nsApp, axApp, appId] window, job in\n            window.getWindowType(axApp: axApp.threadGuarded, appId, nsApp.activationPolicy, windowLevel)\n        } ?? .window\n    }\n\n    func isDialogHeuristic(_ windowId: UInt32, _ windowLevel: MacOsWindowLevel?) async throws -> Bool {\n        try await withWindow(windowId) { [appId] window, job in\n            window.isDialogHeuristic(appId, windowLevel)\n        } == true\n    }\n\n    func setNativeFullscreen(_ windowId: UInt32, _ value: Bool) {\n        setFrameJobs.removeValue(forKey: windowId)?.cancel()\n        setFrameJobs[windowId] = withWindowAsync(windowId) { window, job in\n            window.set(Ax.isFullscreenAttr, value)\n        }\n    }\n\n    func setNativeMinimized(_ windowId: UInt32, _ value: Bool) {\n        setFrameJobs.removeValue(forKey: windowId)?.cancel()\n        setFrameJobs[windowId] = withWindowAsync(windowId) { window, job in\n            window.set(Ax.minimizedAttr, value)\n        }\n    }\n\n    func dumpWindowAxInfo(windowId: UInt32) async throws -> [String: Json] {\n        try await withWindow(windowId) { window, job in\n            dumpAxRecursive(window, .window)\n        } ?? [:]\n    }\n\n    func dumpAppAxInfo() async throws -> [String: Json] {\n        try await thread?.runInLoop { [axApp] job in\n            dumpAxRecursive(axApp.threadGuarded, .app)\n        } ?? [:]\n    }\n\n    func getAxTitle(_ windowId: UInt32) async throws -> String? {\n        try await withWindow(windowId) { window, job in\n            window.get(Ax.titleAttr)\n        }\n    }\n\n    func isMacosNativeFullscreen(_ windowId: UInt32) async throws -> Bool? {\n        try await withWindow(windowId) { window, job in\n            window.get(Ax.isFullscreenAttr)\n        }\n    }\n\n    func isMacosNativeMinimized(_ windowId: UInt32) async throws -> Bool? {\n        try await withWindow(windowId) { window, job in\n            window.get(Ax.minimizedAttr)\n        }\n    }\n\n    @MainActor\n    static func refreshAllAndGetAliveWindowIds(frontmostAppBundleId: String?) async throws -> [MacApp: [UInt32]] {\n        for (_, app) in MacApp.allAppsMap { // gc dead apps\n            try checkCancellation()\n            if app.nsApp.isTerminated {\n                await app.destroy()\n            }\n        }\n        return try await withThrowingTaskGroup(of: (pid_t, [UInt32]).self, returning: [MacApp: [UInt32]].self) { group in\n            func refreshTheApp(_ nsApp: NSRunningApplication) {\n                group.addTask { @Sendable @MainActor in\n                    guard let app = try await MacApp.getOrRegister(nsApp) else { return (nsApp.processIdentifier, []) }\n                    return (nsApp.processIdentifier, try await app.refreshAndGetAliveWindowIds(frontmostAppBundleId: frontmostAppBundleId))\n                }\n            }\n            // Register new apps\n            for nsApp in NSWorkspace.shared.runningApplications {\n                try checkCancellation()\n                if nsApp.activationPolicy == .regular {\n                    refreshTheApp(nsApp)\n                }\n            }\n            for (_, app) in MacApp.allAppsMap {\n                try checkCancellation()\n                // \"About this Mac\" window, TouchID, and a lot of other utility windows\n                // We don't monitor them actively as we do for regular apps, but if a window of one of those utility\n                // apps got focused it will end up in allAppsMap\n                if app.nsApp.activationPolicy != .regular {\n                    refreshTheApp(app.nsApp)\n                }\n            }\n            var result: [MacApp: [UInt32]] = [:]\n            for try await (pid, windowIds) in group {\n                if let app = MacApp.allAppsMap[pid] {\n                    result[app] = windowIds\n                }\n            }\n            return result\n        }\n    }\n\n    private func refreshAndGetAliveWindowIds(frontmostAppBundleId: String?) async throws -> [UInt32] {\n        if nsApp.isTerminated {\n            await destroy()\n            return []\n        }\n        guard let thread else { return [] }\n        let (alive, dead) = try await thread.runInLoop { [nsApp, windows, axApp] (job) -> ([UInt32], [UInt32]) in\n            var alive: [UInt32: AxWindow] = windows.threadGuarded\n            var dead = [UInt32: AxWindow]()\n            // Second line of defence against lock screen. See the first line of defence: closedWindowsCache\n            // Second and third lines of defence are technically needed only to avoid potential flickering\n            if frontmostAppBundleId != lockScreenAppBundleId {\n                (alive, dead) = try alive.partition {\n                    try job.checkCancellation()\n                    return $0.value.ax.containingWindowId() != nil\n                }\n            }\n\n            for (id, window) in axApp.threadGuarded.get(Ax.windowsAttr) ?? [] {\n                try job.checkCancellation()\n                try alive.getOrRegisterAxWindow(windowId: id, window, nsApp, job)\n            }\n\n            windows.threadGuarded = alive\n            return (Array(alive.keys), Array(dead.keys))\n        }\n        windowsCount = alive.count\n        for windowId in dead {\n            setFrameJobs.removeValue(forKey: windowId)?.cancel()\n        }\n        return alive\n    }\n\n    private func destroy() async {\n        _ = await Task { @MainActor [pid] in _ = MacApp.allAppsMap.removeValue(forKey: pid) }.result\n        for (_, job) in setFrameJobs {\n            job.cancel()\n        }\n        setFrameJobs = [:]\n        thread?.runInLoopAsync { [windows, appAxSubscriptions, axApp] job in\n            appAxSubscriptions.destroy() // Destroy AX objects in reverse order of their creation\n            windows.destroy()\n            axApp.destroy()\n            CFRunLoopStop(CFRunLoopGetCurrent())\n        }\n        thread = nil // Disallow all future job submissions\n    }\n\n    private func withWindow<T>(_ windowId: UInt32, _ body: @Sendable @escaping (AXUIElement, RunLoopJob) throws -> T?) async throws -> T? {\n        try await thread?.runInLoop { [windows] job in\n            guard let window = windows.threadGuarded[windowId] else { return nil }\n            return try body(window.ax, job)\n        }\n    }\n\n    private func withWindowAsync(_ windowId: UInt32, _ body: @Sendable @escaping (AXUIElement, RunLoopJob) throws -> ()) -> RunLoopJob {\n        thread?.runInLoopAsync { [windows] job in\n            guard let window = windows.threadGuarded[windowId] else { return }\n            try? body(window.ax, job)\n        } ?? .cancelled\n    }\n}\n\nprivate final class AxWindow {\n    let windowId: UInt32\n    let ax: AXUIElement\n    // periphery:ignore\n    private let axSubscriptions: [AxSubscription] // keep subscriptions in memory\n\n    private init(windowId: UInt32, _ ax: AXUIElement, _ axSubscriptions: [AxSubscription]) {\n        self.windowId = windowId\n        self.ax = ax\n        assert(!axSubscriptions.isEmpty)\n        self.axSubscriptions = axSubscriptions\n    }\n\n    static func new(windowId: UInt32, _ ax: AXUIElement, _ nsApp: NSRunningApplication, _ job: RunLoopJob) throws -> AxWindow? {\n        let handlers: HandlerToNotifKeyMapping = [\n            (refreshObs, [kAXUIElementDestroyedNotification, kAXWindowDeminiaturizedNotification, kAXWindowMiniaturizedNotification]),\n            (movedObs, [kAXMovedNotification]),\n            (resizedObs, [kAXResizedNotification]),\n        ]\n        let subscriptions = try AxSubscription.bulkSubscribe(nsApp, ax, job, handlers)\n        return !subscriptions.isEmpty ? AxWindow(windowId: windowId, ax, subscriptions) : nil\n    }\n}\n\nextension [UInt32: AxWindow] {\n    @discardableResult\n    fileprivate mutating func getOrRegisterAxWindow(windowId id: UInt32, _ axWindow: AXUIElement, _ nsApp: NSRunningApplication, _ job: RunLoopJob) throws -> AxWindow? {\n        if let existing = self[id] { return existing }\n        // Delay new window detection if mouse is down\n        // It helps with apps that allow dragging their tabs out to create new windows\n        // https://github.com/nikitabobko/AeroSpace/issues/1001\n        if isLeftMouseButtonDown { return nil }\n\n        if let window = try AxWindow.new(windowId: id, axWindow, nsApp, job) {\n            self[id] = window\n            return window\n        } else {\n            return nil\n        }\n    }\n}\n\nprivate func setFrame(_ window: AXUIElement, _ topLeft: CGPoint?, _ size: CGSize?, _ job: RunLoopJob) throws {\n    // Set size and then the position. The order is important https://github.com/nikitabobko/AeroSpace/issues/143\n    //                                                        https://github.com/nikitabobko/AeroSpace/issues/335\n    if let size { window.set(Ax.sizeAttr, size) }\n    try job.checkCancellation()\n    if let topLeft { window.set(Ax.topLeftCornerAttr, topLeft) } else { return }\n    try job.checkCancellation()\n    if let size { window.set(Ax.sizeAttr, size) }\n}\n\n// Some undocumented magic\n// References: https://github.com/koekeishiya/yabai/commit/3fe4c77b001e1a4f613c26f01ea68c0f09327f3a\n//             https://github.com/rxhanson/Rectangle/pull/285\nprivate func disableAnimations<T>(app: AXUIElement, _ job: RunLoopJob, _ body: () throws -> T) throws -> T {\n    let wasEnabled = app.get(Ax.enhancedUserInterfaceAttr) == true\n    if wasEnabled {\n        app.set(Ax.enhancedUserInterfaceAttr, false)\n    }\n    defer {\n        if wasEnabled {\n            app.set(Ax.enhancedUserInterfaceAttr, true)\n        }\n    }\n    try job.checkCancellation()\n    return try body()\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/MacWindow.swift",
    "content": "import AppKit\nimport Common\n\nfinal class MacWindow: Window {\n    let macApp: MacApp\n    private var prevUnhiddenProportionalPositionInsideWorkspaceRect: CGPoint?\n\n    @MainActor\n    private init(_ id: UInt32, _ actor: MacApp, lastFloatingSize: CGSize?, parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat, index: Int) {\n        self.macApp = actor\n        super.init(id: id, actor, lastFloatingSize: lastFloatingSize, parent: parent, adaptiveWeight: adaptiveWeight, index: index)\n    }\n\n    @MainActor static var allWindowsMap: [UInt32: MacWindow] = [:]\n    @MainActor static var allWindows: [MacWindow] { Array(allWindowsMap.values) }\n\n    @MainActor\n    @discardableResult\n    static func getOrRegister(windowId: UInt32, macApp: MacApp) async throws -> MacWindow {\n        if let existing = allWindowsMap[windowId] { return existing }\n        let rect = try await macApp.getAxRect(windowId)\n        let data = try await unbindAndGetBindingDataForNewWindow(\n            windowId,\n            macApp,\n            isStartup\n                ? (rect?.center.monitorApproximation ?? mainMonitor).activeWorkspace\n                : focus.workspace,\n            window: nil,\n        )\n\n        // atomic synchronous section\n        if let existing = allWindowsMap[windowId] { return existing }\n        let window = MacWindow(windowId, macApp, lastFloatingSize: rect?.size, parent: data.parent, adaptiveWeight: data.adaptiveWeight, index: data.index)\n        allWindowsMap[windowId] = window\n\n        try await debugWindowsIfRecording(window)\n        if try await !restoreClosedWindowsCacheIfNeeded(newlyDetectedWindow: window) {\n            try await tryOnWindowDetected(window)\n        }\n        return window\n    }\n\n    // var description: String {\n    //     let description = [\n    //         (\"title\", title),\n    //         (\"role\", axWindow.get(Ax.roleAttr)),\n    //         (\"subrole\", axWindow.get(Ax.subroleAttr)),\n    //         (\"identifier\", axWindow.get(Ax.identifierAttr)),\n    //         (\"modal\", axWindow.get(Ax.modalAttr).map { String($0) } ?? \"\"),\n    //         (\"windowId\", String(windowId)),\n    //     ].map { \"\\($0.0): '\\(String(describing: $0.1))'\" }.joined(separator: \", \")\n    //     return \"Window(\\(description))\"\n    // }\n\n    func isWindowHeuristic(_ windowLevel: MacOsWindowLevel?) async throws -> Bool { // todo cache\n        try await macApp.isWindowHeuristic(windowId, windowLevel)\n    }\n\n    func isDialogHeuristic(_ windowLevel: MacOsWindowLevel?) async throws -> Bool { // todo cache\n        try await macApp.isDialogHeuristic(windowId, windowLevel)\n    }\n\n    func dumpAxInfo() async throws -> [String: Json] {\n        try await macApp.dumpWindowAxInfo(windowId: windowId)\n    }\n\n    func setNativeFullscreen(_ value: Bool) {\n        macApp.setNativeFullscreen(windowId, value)\n    }\n\n    func setNativeMinimized(_ value: Bool) {\n        macApp.setNativeMinimized(windowId, value)\n    }\n\n    // skipClosedWindowsCache is an optimization when it's definitely not necessary to cache closed window.\n    //                        If you are unsure, it's better to pass `false`\n    @MainActor\n    func garbageCollect(skipClosedWindowsCache: Bool) {\n        if MacWindow.allWindowsMap.removeValue(forKey: windowId) == nil {\n            return\n        }\n        if !skipClosedWindowsCache { cacheClosedWindowIfNeeded() }\n        let parent = unbindFromParent().parent\n        let deadWindowWorkspace = parent.nodeWorkspace\n        let focus = focus\n        if let deadWindowWorkspace, deadWindowWorkspace == focus.workspace ||\n            deadWindowWorkspace == prevFocusedWorkspace && prevFocusedWorkspaceDate.distance(to: .now) < 1\n        {\n            switch parent.cases {\n                case .tilingContainer, .workspace, .macosHiddenAppsWindowsContainer, .macosFullscreenWindowsContainer:\n                    let deadWindowFocus = deadWindowWorkspace.toLiveFocus()\n                    _ = setFocus(to: deadWindowFocus)\n                    // Guard against \"Apple Reminders popup\" bug: https://github.com/nikitabobko/AeroSpace/issues/201\n                    if focus.windowOrNil?.app.pid != app.pid {\n                        // Force focus to fix macOS annoyance with focused apps without windows.\n                        //   https://github.com/nikitabobko/AeroSpace/issues/65\n                        deadWindowFocus.windowOrNil?.nativeFocus()\n                    }\n                case .macosPopupWindowsContainer, .macosMinimizedWindowsContainer:\n                    break // Don't switch back on popup destruction\n            }\n        }\n    }\n\n    @MainActor override var title: String { get async throws { try await macApp.getAxTitle(windowId) ?? \"\" } }\n    @MainActor override var isMacosFullscreen: Bool { get async throws { try await macApp.isMacosNativeFullscreen(windowId) == true } }\n    @MainActor override var isMacosMinimized: Bool { get async throws { try await macApp.isMacosNativeMinimized(windowId) == true } }\n\n    @MainActor\n    override func nativeFocus() {\n        macApp.nativeFocus(windowId)\n    }\n\n    override func closeAxWindow() {\n        garbageCollect(skipClosedWindowsCache: true)\n        macApp.closeAndUnregisterAxWindow(windowId)\n    }\n\n    // todo it's part of the window layout and should be moved to layoutRecursive.swift\n    @MainActor\n    func hideInCorner(_ corner: OptimalHideCorner) async throws {\n        guard let nodeMonitor else { return }\n        // Don't accidentally override prevUnhiddenEmulationPosition in case of subsequent `hideInCorner` calls\n        if !isHiddenInCorner {\n            guard let windowRect = try await getAxRect() else { return }\n            // Check for isHiddenInCorner for the second time because of the suspension point above\n            if !isHiddenInCorner {\n                let topLeftCorner = windowRect.topLeftCorner\n                let monitorRect = windowRect.center.monitorApproximation.rect // Similar to layoutFloatingWindow. Non idempotent\n                let absolutePoint = topLeftCorner - monitorRect.topLeftCorner\n                prevUnhiddenProportionalPositionInsideWorkspaceRect =\n                    CGPoint(x: absolutePoint.x / monitorRect.width, y: absolutePoint.y / monitorRect.height)\n            }\n        }\n        let p: CGPoint\n        switch corner {\n            case .bottomLeftCorner:\n                guard let s = try await getAxSize() else { fallthrough }\n                // Zoom will jump off if you do one pixel offset https://github.com/nikitabobko/AeroSpace/issues/527\n                // todo this ad hoc won't be necessary once I implement optimization suggested by Zalim\n                let onePixelOffset = macApp.appId == .zoom ? .zero : CGPoint(x: 1, y: -1)\n                p = nodeMonitor.visibleRect.bottomLeftCorner + onePixelOffset + CGPoint(x: -s.width, y: 0)\n            case .bottomRightCorner:\n                // Zoom will jump off if you do one pixel offset https://github.com/nikitabobko/AeroSpace/issues/527\n                // todo this ad hoc won't be necessary once I implement optimization suggested by Zalim\n                let onePixelOffset = macApp.appId == .zoom ? .zero : CGPoint(x: 1, y: 1)\n                p = nodeMonitor.visibleRect.bottomRightCorner - onePixelOffset\n        }\n        setAxFrame(p, nil)\n    }\n\n    @MainActor\n    func unhideFromCorner() {\n        guard let prevUnhiddenProportionalPositionInsideWorkspaceRect else { return }\n        guard let nodeWorkspace else { return } // hiding only makes sense for workspace windows\n        guard let parent else { return }\n\n        switch getChildParentRelation(child: self, parent: parent) {\n            // Just a small optimization to avoid unnecessary AX calls for non floating windows\n            // Tiling windows should be unhidden with layoutRecursive anyway\n            case .floatingWindow:\n                let workspaceRect = nodeWorkspace.workspaceMonitor.rect\n                var newX = workspaceRect.topLeftX + workspaceRect.width * prevUnhiddenProportionalPositionInsideWorkspaceRect.x\n                var newY = workspaceRect.topLeftY + workspaceRect.height * prevUnhiddenProportionalPositionInsideWorkspaceRect.y\n                // todo we probably should replace lastFloatingSize with proper floating window sizing\n                // https://github.com/nikitabobko/AeroSpace/issues/1519\n                let windowWidth = lastFloatingSize?.width ?? 0\n                let windowHeight = lastFloatingSize?.height ?? 0\n                newX = newX.coerce(in: workspaceRect.minX ... max(workspaceRect.minX, workspaceRect.maxX - windowWidth))\n                newY = newY.coerce(in: workspaceRect.minY ... max(workspaceRect.minY, workspaceRect.maxY - windowHeight))\n\n                setAxFrame(CGPoint(x: newX, y: newY), nil)\n            case .macosNativeFullscreenWindow, .macosNativeHiddenAppWindow, .macosNativeMinimizedWindow,\n                 .macosPopupWindow, .tiling, .rootTilingContainer, .shimContainerRelation: break\n        }\n\n        self.prevUnhiddenProportionalPositionInsideWorkspaceRect = nil\n    }\n\n    override var isHiddenInCorner: Bool {\n        prevUnhiddenProportionalPositionInsideWorkspaceRect != nil\n    }\n\n    override func getAxSize() async throws -> CGSize? {\n        try await macApp.getAxSize(windowId)\n    }\n\n    override func setAxFrame(_ topLeft: CGPoint?, _ size: CGSize?) {\n        macApp.setAxFrame(windowId, topLeft, size)\n    }\n\n    func setAxFrameBlocking(_ topLeft: CGPoint?, _ size: CGSize?) async throws {\n        try await macApp.setAxFrameBlocking(windowId, topLeft, size)\n    }\n\n    override func getAxRect() async throws -> Rect? {\n        try await macApp.getAxRect(windowId)\n    }\n}\n\nextension Window {\n    @MainActor\n    func relayoutWindow(on workspace: Workspace, forceTile: Bool = false) async throws {\n        let data = forceTile\n            ? unbindAndGetBindingDataForNewTilingWindow(workspace, window: self)\n            : try await unbindAndGetBindingDataForNewWindow(self.asMacWindow().windowId, self.asMacWindow().macApp, workspace, window: self)\n        bind(to: data.parent, adaptiveWeight: data.adaptiveWeight, index: data.index)\n    }\n}\n\n// The function is private because it's unsafe. It leaves the window in unbound state\n@MainActor\nprivate func unbindAndGetBindingDataForNewWindow(_ windowId: UInt32, _ macApp: MacApp, _ workspace: Workspace, window: Window?) async throws -> BindingData {\n    let windowLevel = getWindowLevel(for: windowId)\n    return switch try await macApp.getAxUiElementWindowType(windowId, windowLevel) {\n        case .popup: BindingData(parent: macosPopupWindowsContainer, adaptiveWeight: WEIGHT_AUTO, index: INDEX_BIND_LAST)\n        case .dialog: BindingData(parent: workspace, adaptiveWeight: WEIGHT_AUTO, index: INDEX_BIND_LAST)\n        case .window: unbindAndGetBindingDataForNewTilingWindow(workspace, window: window)\n    }\n}\n\n// The function is private because it's unsafe. It leaves the window in unbound state\n@MainActor\nprivate func unbindAndGetBindingDataForNewTilingWindow(_ workspace: Workspace, window: Window?) -> BindingData {\n    window?.unbindFromParent() // It's important to unbind to get correct data from below\n    let mruWindow = workspace.mostRecentWindowRecursive\n    if let mruWindow, let tilingParent = mruWindow.parent as? TilingContainer {\n        return BindingData(\n            parent: tilingParent,\n            adaptiveWeight: WEIGHT_AUTO,\n            index: mruWindow.ownIndex.orDie() + 1,\n        )\n    } else {\n        return BindingData(\n            parent: workspace.rootTilingContainer,\n            adaptiveWeight: WEIGHT_AUTO,\n            index: INDEX_BIND_LAST,\n        )\n    }\n}\n\n@MainActor\nfunc tryOnWindowDetected(_ window: Window) async throws {\n    guard let parent = window.parent else { return }\n    switch parent.cases {\n        case .tilingContainer, .workspace, .macosMinimizedWindowsContainer,\n             .macosFullscreenWindowsContainer, .macosHiddenAppsWindowsContainer:\n            try await onWindowDetected(window)\n        case .macosPopupWindowsContainer:\n            break\n    }\n}\n\n@MainActor\nprivate func onWindowDetected(_ window: Window) async throws {\n    broadcastEvent(.windowDetected(\n        windowId: window.windowId,\n        workspace: window.nodeWorkspace?.name,\n        appBundleId: window.app.rawAppBundleId,\n        appName: window.app.name,\n    ))\n    for callback in config.onWindowDetected where try await callback.matches(window) {\n        _ = try await callback.run.runCmdSeq(.defaultEnv.copy(\\.windowId, window.windowId), .emptyStdin)\n        if !callback.checkFurtherCallbacks {\n            return\n        }\n    }\n}\n\nextension WindowDetectedCallback {\n    @MainActor\n    func matches(_ window: Window) async throws -> Bool {\n        if let startupMatcher = matcher.duringAeroSpaceStartup, startupMatcher != isStartup {\n            return false\n        }\n        if let regex = matcher.windowTitleRegexSubstring, !(try await window.title).contains(regex) {\n            return false\n        }\n        if let appId = matcher.appId, appId != window.app.rawAppBundleId {\n            return false\n        }\n        if let regex = matcher.appNameRegexSubstring, !(window.app.name ?? \"\").contains(regex) {\n            return false\n        }\n        if let workspace = matcher.workspace, workspace != window.nodeWorkspace?.name {\n            return false\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/MacosUnconventionalWindowsContainer.swift",
    "content": "import Common\n\nfinal class MacosFullscreenWindowsContainer: TreeNode, NonLeafTreeNodeObject {\n    @MainActor\n    init(parent: Workspace) {\n        super.init(parent: parent, adaptiveWeight: 1, index: INDEX_BIND_LAST)\n    }\n}\n\n/// The container for macOS windows of hidden apps\nfinal class MacosHiddenAppsWindowsContainer: TreeNode, NonLeafTreeNodeObject {\n    @MainActor\n    init(parent: Workspace) {\n        super.init(parent: parent, adaptiveWeight: 1, index: INDEX_BIND_LAST)\n    }\n}\n\n@MainActor let macosMinimizedWindowsContainer = MacosMinimizedWindowsContainer()\nfinal class MacosMinimizedWindowsContainer: TreeNode, NonLeafTreeNodeObject {\n    @MainActor\n    fileprivate init() {\n        super.init(parent: NilTreeNode.instance, adaptiveWeight: 1, index: INDEX_BIND_LAST)\n    }\n}\n\n@MainActor let macosPopupWindowsContainer = MacosPopupWindowsContainer()\n/// The container for macOS objects that are windows from AX perspective but from human perspective they are not even\n/// dialogs. E.g. Sonoma (macOS 14) keyboard layout switch\nfinal class MacosPopupWindowsContainer: TreeNode, NonLeafTreeNodeObject {\n    @MainActor\n    fileprivate init() {\n        super.init(parent: NilTreeNode.instance, adaptiveWeight: 1, index: INDEX_BIND_LAST)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/TilingContainer.swift",
    "content": "import AppKit\nimport Common\n\nfinal class TilingContainer: TreeNode, NonLeafTreeNodeObject { // todo consider renaming to GenericContainer\n    fileprivate var _orientation: Orientation\n    var orientation: Orientation { _orientation }\n    var layout: Layout\n\n    @MainActor\n    init(parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat, _ orientation: Orientation, _ layout: Layout, index: Int) {\n        self._orientation = orientation\n        self.layout = layout\n        super.init(parent: parent, adaptiveWeight: adaptiveWeight, index: index)\n    }\n\n    @MainActor\n    static func newHTiles(parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat, index: Int) -> TilingContainer {\n        TilingContainer(parent: parent, adaptiveWeight: adaptiveWeight, .h, .tiles, index: index)\n    }\n\n    @MainActor\n    static func newVTiles(parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat, index: Int) -> TilingContainer {\n        TilingContainer(parent: parent, adaptiveWeight: adaptiveWeight, .v, .tiles, index: index)\n    }\n}\n\nextension TilingContainer {\n    var isRootContainer: Bool { parent is Workspace }\n\n    @MainActor\n    func changeOrientation(_ targetOrientation: Orientation) {\n        if orientation == targetOrientation {\n            return\n        }\n        if config.enableNormalizationOppositeOrientationForNestedContainers {\n            var orientation = targetOrientation\n            parentsWithSelf\n                .filterIsInstance(of: TilingContainer.self)\n                .forEach {\n                    $0._orientation = orientation\n                    orientation = orientation.opposite\n                }\n        } else {\n            _orientation = targetOrientation\n        }\n    }\n\n    func normalizeOppositeOrientationForNestedContainers() {\n        if orientation == (parent as? TilingContainer)?.orientation {\n            _orientation = orientation.opposite\n        }\n        for child in children {\n            (child as? TilingContainer)?.normalizeOppositeOrientationForNestedContainers()\n        }\n    }\n}\n\nenum Layout: String {\n    case tiles\n    case accordion\n}\n\nextension String {\n    func parseLayout() -> Layout? {\n        if let parsed = Layout(rawValue: self) {\n            return parsed\n        } else if self == \"list\" {\n            return .tiles\n        } else {\n            return nil\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/TreeNode.swift",
    "content": "import AppKit\nimport Common\n\nopen class TreeNode: Equatable, AeroAny {\n    private var _children: [TreeNode] = []\n    var children: [TreeNode] { _children }\n    fileprivate final weak var _parent: NonLeafTreeNodeObject? = nil\n    final var parent: NonLeafTreeNodeObject? { _parent }\n    private var adaptiveWeight: CGFloat\n    private let _mruChildren: MruStack<TreeNode> = MruStack()\n    // Usages:\n    // - resize with mouse\n    // - makeFloatingWindowsSeenAsTiling in focus command\n    var lastAppliedLayoutVirtualRect: Rect? = nil  // as if inner gaps were always zero\n    // Usages:\n    // - resize with mouse\n    // - drag window with mouse\n    // - move-mouse command\n    var lastAppliedLayoutPhysicalRect: Rect? = nil // with real inner gaps\n    final var unboundStacktrace: String? = nil\n    var isBound: Bool { parent != nil } // todo drop, once https://github.com/nikitabobko/AeroSpace/issues/1215 is fixed\n\n    @MainActor\n    init(parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat, index: Int) {\n        self.adaptiveWeight = adaptiveWeight\n        bind(to: parent, adaptiveWeight: adaptiveWeight, index: index)\n    }\n\n    fileprivate init() {\n        adaptiveWeight = 0\n    }\n\n    /// See: ``getWeight(_:)``\n    func setWeight(_ targetOrientation: Orientation, _ newValue: CGFloat) {\n        guard let parent else { die(\"Can't change weight if TreeNode doesn't have parent\") }\n        switch getChildParentRelation(child: self, parent: parent) {\n            case .tiling(let parent):\n                if parent.orientation != targetOrientation {\n                    die(\"You can't change \\(targetOrientation) weight of nodes located in \\(parent.orientation) container\")\n                }\n                if parent.layout != .tiles {\n                    die(\"Weight can be changed only for nodes whose parent has 'tiles' layout\")\n                }\n                adaptiveWeight = newValue\n            default:\n                die(\"Can't change weight\")\n        }\n    }\n\n    /// Weight itself doesn't make sense. The parent container controls semantics of weight\n    @MainActor\n    func getWeight(_ targetOrientation: Orientation) -> CGFloat {\n        guard let parent else { die(\"Weight doesn't make sense for containers without parent\") }\n        return switch getChildParentRelation(child: self, parent: parent) {\n            case .tiling(let parent):\n                parent.orientation == targetOrientation ? adaptiveWeight : parent.getWeight(targetOrientation)\n            case .rootTilingContainer: parent.getWeight(targetOrientation)\n            case .floatingWindow, .macosNativeFullscreenWindow: dieT(\"Weight doesn't make sense for floating windows\")\n            case .macosNativeMinimizedWindow: dieT(\"Weight doesn't make sense for minimized windows\")\n            case .macosPopupWindow: dieT(\"Weight doesn't make sense for popup windows\")\n            case .macosNativeHiddenAppWindow: dieT(\"Weight doesn't make sense for windows of hidden apps\")\n            case .shimContainerRelation: dieT(\"Weight doesn't make sense for stub containers\")\n        }\n    }\n\n    @MainActor\n    @discardableResult\n    func bind(to newParent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat, index: Int) -> BindingData? {\n        let result = unbindIfBound()\n\n        if newParent === NilTreeNode.instance {\n            return result\n        }\n        let relation = getChildParentRelation(child: self, parent: newParent) // Side effect: verify relation\n        if adaptiveWeight == WEIGHT_AUTO {\n            self.adaptiveWeight = switch relation {\n                case .tiling(let newParent):\n                    CGFloat(newParent.children.sumOfDouble { $0.getWeight(newParent.orientation) }).div(newParent.children.count) ?? 1\n                case .floatingWindow, .macosNativeFullscreenWindow,\n                     .rootTilingContainer, .macosNativeMinimizedWindow,\n                     .shimContainerRelation, .macosPopupWindow, .macosNativeHiddenAppWindow:\n                    WEIGHT_DOESNT_MATTER\n            }\n        } else {\n            self.adaptiveWeight = adaptiveWeight\n        }\n        newParent._children.insert(self, at: index != INDEX_BIND_LAST ? index : newParent._children.count)\n        _parent = newParent\n        unboundStacktrace = nil\n        // todo consider disabling automatic mru propogation\n        // 1. \"floating windows\" in FocusCommand break the MRU because of that :(\n        // 2. Misbehaved apps that abuse real window as popups https://github.com/nikitabobko/AeroSpace/issues/106 (the\n        //    last appeared window, is not necessarily the one that has the focus)\n        markAsMostRecentChild()\n        return result\n    }\n\n    private func unbindIfBound() -> BindingData? {\n        guard let _parent else { return nil }\n\n        let index = _parent._children.remove(element: self) ?? dieT(\"Can't find child in its parent\")\n        check(_parent._mruChildren.remove(self))\n        self._parent = nil\n        unboundStacktrace = getStringStacktrace()\n\n        return BindingData(parent: _parent, adaptiveWeight: adaptiveWeight, index: index)\n    }\n\n    func markAsMostRecentChild() {\n        guard let _parent else { return }\n        _parent._mruChildren.pushOrRaise(self)\n        _parent.markAsMostRecentChild()\n    }\n\n    var mostRecentChild: TreeNode? { _mruChildren.mostRecent ?? children.last }\n\n    @discardableResult\n    func unbindFromParent() -> BindingData {\n        unbindIfBound() ?? dieT(\"\\(self) is already unbound. The stacktrace where it was unbound:\\n\\(unboundStacktrace ?? \"nil\")\")\n    }\n\n    nonisolated public static func == (lhs: TreeNode, rhs: TreeNode) -> Bool {\n        lhs === rhs\n    }\n\n    private var userData: [String: Any] = [:]\n    func getUserData<T>(key: TreeNodeUserDataKey<T>) -> T? { userData[key.key] as! T? }\n    func putUserData<T>(key: TreeNodeUserDataKey<T>, data: T) {\n        userData[key.key] = data\n    }\n    @discardableResult\n    func cleanUserData<T>(key: TreeNodeUserDataKey<T>) -> T? { userData.removeValue(forKey: key.key) as! T? }\n}\n\n// periphery:ignore - Generic T is used\nstruct TreeNodeUserDataKey<T> {\n    let key: String\n}\n\nlet WEIGHT_DOESNT_MATTER = CGFloat(-2)\n/// Splits containers evenly if tiling.\n///\n/// Reset weight is bind to workspace (aka \"floating windows\")\nlet WEIGHT_AUTO = CGFloat(-1)\n\nlet INDEX_BIND_LAST = -1\n\nstruct BindingData {\n    let parent: NonLeafTreeNodeObject\n    let adaptiveWeight: CGFloat\n    let index: Int\n}\n\nfinal class NilTreeNode: TreeNode, NonLeafTreeNodeObject {\n    override private init() {\n        super.init()\n    }\n    @MainActor static let instance = NilTreeNode()\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/TreeNodeCases.swift",
    "content": "import Common\n\nenum TreeNodeCases {\n    case window(Window)\n    case tilingContainer(TilingContainer)\n    case workspace(Workspace)\n    case macosMinimizedWindowsContainer(MacosMinimizedWindowsContainer)\n    case macosHiddenAppsWindowsContainer(MacosHiddenAppsWindowsContainer)\n    case macosFullscreenWindowsContainer(MacosFullscreenWindowsContainer)\n    case macosPopupWindowsContainer(MacosPopupWindowsContainer)\n}\n\nenum NonLeafTreeNodeCases {\n    case tilingContainer(TilingContainer)\n    case workspace(Workspace)\n    case macosMinimizedWindowsContainer(MacosMinimizedWindowsContainer)\n    case macosHiddenAppsWindowsContainer(MacosHiddenAppsWindowsContainer)\n    case macosFullscreenWindowsContainer(MacosFullscreenWindowsContainer)\n    case macosPopupWindowsContainer(MacosPopupWindowsContainer)\n}\n\nenum TilingTreeNodeCases {\n    case window(Window)\n    case tilingContainer(TilingContainer)\n}\n\nenum NonLeafTreeNodeKind: Equatable {\n    case tilingContainer\n    case workspace\n    case macosMinimizedWindowsContainer\n    case macosHiddenAppsWindowsContainer\n    case macosFullscreenWindowsContainer\n    case macosPopupWindowsContainer\n}\n\nprotocol NonLeafTreeNodeObject: TreeNode {}\n\nextension TreeNode {\n    var nodeCases: TreeNodeCases {\n        if let window = self as? Window {\n            return .window(window)\n        } else if let workspace = self as? Workspace {\n            return .workspace(workspace)\n        } else if let tilingContainer = self as? TilingContainer {\n            return .tilingContainer(tilingContainer)\n        } else if let container = self as? MacosHiddenAppsWindowsContainer {\n            return .macosHiddenAppsWindowsContainer(container)\n        } else if let container = self as? MacosMinimizedWindowsContainer {\n            return .macosMinimizedWindowsContainer(container)\n        } else if let container = self as? MacosFullscreenWindowsContainer {\n            return .macosFullscreenWindowsContainer(container)\n        } else if let container = self as? MacosPopupWindowsContainer {\n            return .macosPopupWindowsContainer(container)\n        } else {\n            die(\"Unknown tree\")\n        }\n    }\n\n    func tilingTreeNodeCasesOrDie() -> TilingTreeNodeCases {\n        if let window = self as? Window {\n            return .window(window)\n        } else if let tilingContainer = self as? TilingContainer {\n            return .tilingContainer(tilingContainer)\n        } else {\n            illegalChildParentRelation(child: self, parent: parent)\n        }\n    }\n}\n\nextension NonLeafTreeNodeObject {\n    var cases: NonLeafTreeNodeCases {\n        if self is Window {\n            die(\"Windows are leaf nodes. They can't have children\")\n        } else if let workspace = self as? Workspace {\n            return .workspace(workspace)\n        } else if let tilingContainer = self as? TilingContainer {\n            return .tilingContainer(tilingContainer)\n        } else if let container = self as? MacosMinimizedWindowsContainer {\n            return .macosMinimizedWindowsContainer(container)\n        } else if let container = self as? MacosHiddenAppsWindowsContainer {\n            return .macosHiddenAppsWindowsContainer(container)\n        } else if let container = self as? MacosFullscreenWindowsContainer {\n            return .macosFullscreenWindowsContainer(container)\n        } else if let container = self as? MacosPopupWindowsContainer {\n            return .macosPopupWindowsContainer(container)\n        } else {\n            die(\"Unknown tree \\(self)\")\n        }\n    }\n\n    var kind: NonLeafTreeNodeKind {\n        return switch cases {\n            case .tilingContainer: .tilingContainer\n            case .workspace: .workspace\n            case .macosMinimizedWindowsContainer: .macosMinimizedWindowsContainer\n            case .macosFullscreenWindowsContainer: .macosFullscreenWindowsContainer\n            case .macosHiddenAppsWindowsContainer: .macosHiddenAppsWindowsContainer\n            case .macosPopupWindowsContainer: .macosPopupWindowsContainer\n        }\n    }\n}\n\nenum ChildParentRelation: Equatable {\n    case floatingWindow\n    case macosNativeFullscreenWindow\n    case macosNativeHiddenAppWindow\n    case macosNativeMinimizedWindow\n    case macosPopupWindow\n    case tiling(parent: TilingContainer) // todo consider splitting it on 'tiles' and 'accordion'\n    case rootTilingContainer\n\n    case shimContainerRelation\n}\n\nfunc getChildParentRelation(child: TreeNode, parent: NonLeafTreeNodeObject) -> ChildParentRelation {\n    if let relation = getChildParentRelationOrNil(child: child, parent: parent) {\n        return relation\n    }\n    illegalChildParentRelation(child: child, parent: parent)\n}\n\nfunc illegalChildParentRelation(child: TreeNode, parent: NonLeafTreeNodeObject?) -> Never {\n    die(\"Illegal child-parent relation. Child: \\(child), Parent: \\((parent ?? child.parent).prettyDescription)\")\n}\n\nfunc getChildParentRelationOrNil(child: TreeNode, parent: NonLeafTreeNodeObject) -> ChildParentRelation? {\n    return switch (child.nodeCases, parent.cases) {\n        case (.workspace, _): nil\n        case (.window, .workspace): .floatingWindow\n\n        case (.window, .macosPopupWindowsContainer): .macosPopupWindow\n        case (_, .macosPopupWindowsContainer): nil\n        case (.macosPopupWindowsContainer, _): nil\n\n        case (.window, .macosMinimizedWindowsContainer): .macosNativeMinimizedWindow\n        case (_, .macosMinimizedWindowsContainer): nil\n        case (.macosMinimizedWindowsContainer, _): nil\n\n        case (.tilingContainer, .tilingContainer(let container)),\n             (.window, .tilingContainer(let container)): .tiling(parent: container)\n        case (.tilingContainer, .workspace): .rootTilingContainer\n\n        case (.macosFullscreenWindowsContainer, .workspace): .shimContainerRelation\n        case (.window, .macosFullscreenWindowsContainer): .macosNativeFullscreenWindow\n        case (.macosFullscreenWindowsContainer, _): nil\n        case (_, .macosFullscreenWindowsContainer): nil\n\n        case (.macosHiddenAppsWindowsContainer, .workspace): .shimContainerRelation\n        case (.window, .macosHiddenAppsWindowsContainer): .macosNativeHiddenAppWindow\n        case (.macosHiddenAppsWindowsContainer, _): nil\n        case (_, .macosHiddenAppsWindowsContainer): nil\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/TreeNodeEx.swift",
    "content": "import AppKit\nimport Common\n\nextension TreeNode {\n    private func visit(node: TreeNode, result: inout [Window]) {\n        if let node = node as? Window {\n            result.append(node)\n        }\n        for child in node.children {\n            visit(node: child, result: &result)\n        }\n    }\n    var allLeafWindowsRecursive: [Window] {\n        var result: [Window] = []\n        visit(node: self, result: &result)\n        return result\n    }\n\n    var ownIndex: Int? {\n        guard let parent else { return nil }\n        return parent.children.firstIndex(of: self).orDie()\n    }\n\n    var parents: [NonLeafTreeNodeObject] { parent.flatMap { [$0] + $0.parents } ?? [] }\n    var parentsWithSelf: [TreeNode] { parent.flatMap { [self] + $0.parentsWithSelf } ?? [self] }\n\n    /// Also see visualWorkspace\n    var nodeWorkspace: Workspace? {\n        self as? Workspace ?? parent?.nodeWorkspace\n    }\n\n    /// Also see: workspace\n    @MainActor\n    var visualWorkspace: Workspace? { nodeWorkspace ?? nodeMonitor?.activeWorkspace }\n\n    @MainActor\n    var nodeMonitor: Monitor? {\n        switch self.nodeCases {\n            case .workspace(let ws): ws.workspaceMonitor\n            case .window: parent?.nodeMonitor\n            case .tilingContainer: parent?.nodeMonitor\n            case .macosFullscreenWindowsContainer: parent?.nodeMonitor\n            case .macosHiddenAppsWindowsContainer: parent?.nodeMonitor\n            case .macosMinimizedWindowsContainer, .macosPopupWindowsContainer: nil\n        }\n    }\n\n    var mostRecentWindowRecursive: Window? {\n        self as? Window ?? mostRecentChild?.mostRecentWindowRecursive\n    }\n\n    var anyLeafWindowRecursive: Window? {\n        if let window = self as? Window {\n            return window\n        }\n        for child in children {\n            if let window = child.anyLeafWindowRecursive {\n                return window\n            }\n        }\n        return nil\n    }\n\n    // Doesn't contain at least one window\n    var isEffectivelyEmpty: Bool {\n        anyLeafWindowRecursive == nil\n    }\n\n    @MainActor\n    var hWeight: CGFloat {\n        get { getWeight(.h) }\n        set { setWeight(.h, newValue) }\n    }\n\n    @MainActor\n    var vWeight: CGFloat {\n        get { getWeight(.v) }\n        set { setWeight(.v, newValue) }\n    }\n\n    /// Returns closest parent that has children in the specified direction relative to `self`\n    func closestParent(\n        hasChildrenInDirection direction: CardinalDirection,\n        withLayout layout: Layout?,\n    ) -> (parent: TilingContainer, ownIndex: Int)? {\n        let innermostChild = parentsWithSelf.first(where: { (node: TreeNode) -> Bool in\n            return switch node.parent?.cases {\n                // stop searching. We didn't find it, or something went wrong\n                case .workspace, nil, .macosMinimizedWindowsContainer,\n                     .macosFullscreenWindowsContainer, .macosHiddenAppsWindowsContainer, .macosPopupWindowsContainer:\n                    true\n                case .tilingContainer(let parent):\n                    (layout == nil || parent.layout == layout) &&\n                        parent.orientation == direction.orientation &&\n                        (node.ownIndex.map { parent.children.indices.contains($0 + direction.focusOffset) } ?? true)\n            }\n        })\n        guard let innermostChild else { return nil }\n        switch innermostChild.parent?.cases {\n            case .tilingContainer(let parent):\n                check(parent.orientation == direction.orientation)\n                return innermostChild.ownIndex.map { (parent, $0) }\n            case .workspace, nil, .macosMinimizedWindowsContainer,\n                 .macosFullscreenWindowsContainer, .macosHiddenAppsWindowsContainer, .macosPopupWindowsContainer:\n                return nil\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/Window.swift",
    "content": "import AppKit\nimport Common\n\nopen class Window: TreeNode, Hashable {\n    let windowId: UInt32\n    let app: any AbstractApp\n    var lastFloatingSize: CGSize?\n    var isFullscreen: Bool = false\n    var noOuterGapsInFullscreen: Bool = false\n    var layoutReason: LayoutReason = .standard\n\n    @MainActor\n    init(id: UInt32, _ app: any AbstractApp, lastFloatingSize: CGSize?, parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat, index: Int) {\n        self.windowId = id\n        self.app = app\n        self.lastFloatingSize = lastFloatingSize\n        super.init(parent: parent, adaptiveWeight: adaptiveWeight, index: index)\n    }\n\n    @MainActor static func get(byId windowId: UInt32) -> Window? { // todo make non optional\n        isUnitTest\n            ? Workspace.all.flatMap { $0.allLeafWindowsRecursive }.first(where: { $0.windowId == windowId })\n            : MacWindow.allWindowsMap[windowId]\n    }\n\n    @MainActor\n    func closeAxWindow() { die(\"Not implemented\") }\n\n    public func hash(into hasher: inout Hasher) {\n        hasher.combine(windowId)\n    }\n\n    func getAxSize() async throws -> CGSize? { die(\"Not implemented\") }\n    var title: String { get async throws { die(\"Not implemented\") } }\n    var isMacosFullscreen: Bool { get async throws { false } }\n    var isMacosMinimized: Bool { get async throws { false } } // todo replace with enum MacOsWindowNativeState { normal, fullscreen, invisible }\n    var isHiddenInCorner: Bool { die(\"Not implemented\") }\n    @MainActor\n    func nativeFocus() { die(\"Not implemented\") }\n    func getAxRect() async throws -> Rect? { die(\"Not implemented\") }\n    func getCenter() async throws -> CGPoint? { try await getAxRect()?.center }\n\n    func setAxFrame(_ topLeft: CGPoint?, _ size: CGSize?) { die(\"Not implemented\") }\n}\n\nenum LayoutReason: Equatable {\n    case standard\n    /// Reason for the cur temp layout is macOS native fullscreen, minimize, or hide\n    case macos(prevParentKind: NonLeafTreeNodeKind)\n}\n\nextension Window {\n    var isFloating: Bool { parent is Workspace } // todo drop. It will be a source of bugs when sticky is introduced\n\n    @discardableResult\n    @MainActor\n    func bindAsFloatingWindow(to workspace: Workspace) -> BindingData? {\n        bind(to: workspace, adaptiveWeight: WEIGHT_AUTO, index: INDEX_BIND_LAST)\n    }\n\n    func asMacWindow() -> MacWindow { self as! MacWindow }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/Workspace.swift",
    "content": "import AppKit\nimport Common\n\n@MainActor private var workspaceNameToWorkspace: [String: Workspace] = [:]\n\n@MainActor private var screenPointToPrevVisibleWorkspace: [CGPoint: String] = [:]\n@MainActor private var screenPointToVisibleWorkspace: [CGPoint: Workspace] = [:]\n@MainActor private var visibleWorkspaceToScreenPoint: [Workspace: CGPoint] = [:]\n\n// The returned workspace must be invisible and it must belong to the requested monitor\n@MainActor func getStubWorkspace(for monitor: Monitor) -> Workspace {\n    getStubWorkspace(forPoint: monitor.rect.topLeftCorner)\n}\n\n@MainActor\nprivate func getStubWorkspace(forPoint point: CGPoint) -> Workspace {\n    if let prev = screenPointToPrevVisibleWorkspace[point].map({ Workspace.get(byName: $0) }),\n       !prev.isVisible && prev.workspaceMonitor.rect.topLeftCorner == point && prev.forceAssignedMonitor == nil\n    {\n        return prev\n    }\n    if let candidate = Workspace.all\n        .first(where: { !$0.isVisible && $0.workspaceMonitor.rect.topLeftCorner == point })\n    {\n        return candidate\n    }\n    return (1 ... Int.max).lazy\n        .map { Workspace.get(byName: String($0)) }\n        .first { $0.isEffectivelyEmpty && !$0.isVisible && !config.persistentWorkspaces.contains($0.name) && $0.forceAssignedMonitor == nil }\n        .orDie(\"Can't create empty workspace\")\n}\n\nfinal class Workspace: TreeNode, NonLeafTreeNodeObject, Hashable, Comparable {\n    let name: String\n    nonisolated private let nameLogicalSegments: StringLogicalSegments\n    /// `assignedMonitorPoint` must be interpreted only when the workspace is invisible\n    fileprivate var assignedMonitorPoint: CGPoint? = nil\n\n    @MainActor\n    private init(_ name: String) {\n        self.name = name\n        self.nameLogicalSegments = name.toLogicalSegments()\n        super.init(parent: NilTreeNode.instance, adaptiveWeight: 0, index: 0)\n    }\n\n    @MainActor static var all: [Workspace] {\n        workspaceNameToWorkspace.values.sorted()\n    }\n\n    @MainActor static func get(byName name: String) -> Workspace {\n        if let existing = workspaceNameToWorkspace[name] {\n            return existing\n        } else {\n            let workspace = Workspace(name)\n            workspaceNameToWorkspace[name] = workspace\n            return workspace\n        }\n    }\n\n    nonisolated static func < (lhs: Workspace, rhs: Workspace) -> Bool {\n        lhs.nameLogicalSegments < rhs.nameLogicalSegments\n    }\n\n    override func getWeight(_ targetOrientation: Orientation) -> CGFloat {\n        workspaceMonitor.visibleRectPaddedByOuterGaps.getDimension(targetOrientation)\n    }\n\n    override func setWeight(_ targetOrientation: Orientation, _ newValue: CGFloat) {\n        die(\"It's not possible to change weight of Workspace\")\n    }\n\n    @MainActor\n    var description: String {\n        let description = [\n            (\"name\", name),\n            (\"isVisible\", String(isVisible)),\n            (\"isEffectivelyEmpty\", String(isEffectivelyEmpty)),\n            (\"doKeepAlive\", String(config.persistentWorkspaces.contains(name))),\n        ].map { \"\\($0.0): '\\(String(describing: $0.1))'\" }.joined(separator: \", \")\n        return \"Workspace(\\(description))\"\n    }\n\n    @MainActor\n    static func garbageCollectUnusedWorkspaces() {\n        for name in config.persistentWorkspaces {\n            _ = get(byName: name) // Make sure that all persistent workspaces are \"cached\"\n        }\n        workspaceNameToWorkspace = workspaceNameToWorkspace.filter { (_, workspace: Workspace) in\n            config.persistentWorkspaces.contains(workspace.name) ||\n                !workspace.isEffectivelyEmpty ||\n                workspace.isVisible ||\n                workspace.name == focus.workspace.name\n        }\n    }\n\n    nonisolated static func == (lhs: Workspace, rhs: Workspace) -> Bool {\n        check((lhs === rhs) == (lhs.name == rhs.name), \"lhs: \\(lhs) rhs: \\(rhs)\")\n        return lhs === rhs\n    }\n\n    nonisolated func hash(into hasher: inout Hasher) { hasher.combine(name) }\n}\n\nextension Workspace {\n    @MainActor\n    var isVisible: Bool { visibleWorkspaceToScreenPoint.keys.contains(self) }\n    @MainActor\n    var workspaceMonitor: Monitor {\n        forceAssignedMonitor\n            ?? visibleWorkspaceToScreenPoint[self]?.monitorApproximation\n            ?? assignedMonitorPoint?.monitorApproximation\n            ?? mainMonitor\n    }\n}\n\nextension Monitor {\n    @MainActor\n    var activeWorkspace: Workspace {\n        if let existing = screenPointToVisibleWorkspace[rect.topLeftCorner] {\n            return existing\n        }\n        // What if monitor configuration changed? (frame.origin is changed)\n        rearrangeWorkspacesOnMonitors()\n        // Normally, recursion should happen only once more because we must take the value from the cache\n        // (Unless, monitor configuration data race happens)\n        return self.activeWorkspace\n    }\n\n    @MainActor\n    func setActiveWorkspace(_ workspace: Workspace) -> Bool {\n        rect.topLeftCorner.setActiveWorkspace(workspace)\n    }\n}\n\n@MainActor\nfunc gcMonitors() {\n    if screenPointToVisibleWorkspace.count != monitors.count {\n        rearrangeWorkspacesOnMonitors()\n    }\n}\n\nextension CGPoint {\n    @MainActor\n    fileprivate func setActiveWorkspace(_ workspace: Workspace) -> Bool {\n        if !isValidAssignment(workspace: workspace, screen: self) {\n            return false\n        }\n        if let prevMonitorPoint = visibleWorkspaceToScreenPoint[workspace] {\n            visibleWorkspaceToScreenPoint.removeValue(forKey: workspace)\n            screenPointToPrevVisibleWorkspace[prevMonitorPoint] =\n                screenPointToVisibleWorkspace.removeValue(forKey: prevMonitorPoint)?.name\n        }\n        if let prevWorkspace = screenPointToVisibleWorkspace[self] {\n            screenPointToPrevVisibleWorkspace[self] =\n                screenPointToVisibleWorkspace.removeValue(forKey: self)?.name\n            visibleWorkspaceToScreenPoint.removeValue(forKey: prevWorkspace)\n        }\n        visibleWorkspaceToScreenPoint[workspace] = self\n        screenPointToVisibleWorkspace[self] = workspace\n        workspace.assignedMonitorPoint = self\n        return true\n    }\n}\n\n@MainActor\nprivate func rearrangeWorkspacesOnMonitors() {\n    var oldVisibleScreens: Set<CGPoint> = screenPointToVisibleWorkspace.keys.toSet()\n\n    let newScreens = monitors.map(\\.rect.topLeftCorner)\n    var newScreenToOldScreenMapping: [CGPoint: CGPoint] = [:]\n    for newScreen in newScreens {\n        if let oldScreen = oldVisibleScreens.minBy({ ($0 - newScreen).vectorLength }) {\n            check(oldVisibleScreens.remove(oldScreen) != nil)\n            newScreenToOldScreenMapping[newScreen] = oldScreen\n        }\n    }\n\n    let oldScreenPointToVisibleWorkspace = screenPointToVisibleWorkspace\n    screenPointToVisibleWorkspace = [:]\n    visibleWorkspaceToScreenPoint = [:]\n\n    for newScreen in newScreens {\n        if let existingVisibleWorkspace = newScreenToOldScreenMapping[newScreen].flatMap({ oldScreenPointToVisibleWorkspace[$0] }),\n           newScreen.setActiveWorkspace(existingVisibleWorkspace)\n        {\n            continue\n        }\n        let stubWorkspace = getStubWorkspace(forPoint: newScreen)\n        check(newScreen.setActiveWorkspace(stubWorkspace),\n              \"getStubWorkspace generated incompatible stub workspace (\\(stubWorkspace)) for the monitor (\\(newScreen)\")\n    }\n}\n\n@MainActor\nprivate func isValidAssignment(workspace: Workspace, screen: CGPoint) -> Bool {\n    if let forceAssigned = workspace.forceAssignedMonitor, forceAssigned.rect.topLeftCorner != screen {\n        return false\n    } else {\n        return true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/WorkspaceEx.swift",
    "content": "import Common\n\nextension Workspace {\n    @MainActor var rootTilingContainer: TilingContainer {\n        let containers = children.filterIsInstance(of: TilingContainer.self)\n        switch containers.count {\n            case 0:\n                let orientation: Orientation = switch config.defaultRootContainerOrientation {\n                    case .horizontal: .h\n                    case .vertical: .v\n                    case .auto: workspaceMonitor.then { $0.width >= $0.height } ? .h : .v\n                }\n                return TilingContainer(parent: self, adaptiveWeight: 1, orientation, config.defaultRootContainerLayout, index: INDEX_BIND_LAST)\n            case 1:\n                return containers.singleOrNil().orDie()\n            default:\n                die(\"Workspace must contain zero or one tiling container as its child\")\n        }\n    }\n\n    var floatingWindows: [Window] {\n        children.filterIsInstance(of: Window.self)\n    }\n\n    @MainActor var macOsNativeFullscreenWindowsContainer: MacosFullscreenWindowsContainer {\n        let containers = children.filterIsInstance(of: MacosFullscreenWindowsContainer.self)\n        return switch containers.count {\n            case 0: MacosFullscreenWindowsContainer(parent: self)\n            case 1: containers.singleOrNil().orDie()\n            default: dieT(\"Workspace must contain zero or one MacosFullscreenWindowsContainer\")\n        }\n    }\n\n    @MainActor var macOsNativeHiddenAppsWindowsContainer: MacosHiddenAppsWindowsContainer {\n        let containers = children.filterIsInstance(of: MacosHiddenAppsWindowsContainer.self)\n        return switch containers.count {\n            case 0: MacosHiddenAppsWindowsContainer(parent: self)\n            case 1: containers.singleOrNil().orDie()\n            default: dieT(\"Workspace must contain zero or one MacosHiddenAppsWindowsContainer\")\n        }\n    }\n\n    @MainActor var forceAssignedMonitor: Monitor? {\n        guard let monitorDescriptions = config.workspaceToMonitorForceAssignment[name] else { return nil }\n        let sortedMonitors = sortedMonitors\n        return monitorDescriptions.lazy\n            .compactMap { $0.resolveMonitor(sortedMonitors: sortedMonitors) }\n            .first\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/frozen/FrozenTreeNode.swift",
    "content": "import AppKit\nimport Common\n\nenum FrozenTreeNode: Sendable {\n    case container(FrozenContainer)\n    case window(FrozenWindow)\n}\n\nstruct FrozenContainer: Sendable {\n    let children: [FrozenTreeNode]\n    let layout: Layout\n    let orientation: Orientation\n    let weight: CGFloat\n\n    @MainActor init(_ container: TilingContainer) {\n        children = container.children.map {\n            switch $0.nodeCases {\n                case .window(let w): .window(FrozenWindow(w))\n                case .tilingContainer(let c): .container(FrozenContainer(c))\n                case .workspace,\n                     .macosMinimizedWindowsContainer,\n                     .macosHiddenAppsWindowsContainer,\n                     .macosFullscreenWindowsContainer,\n                     .macosPopupWindowsContainer:\n                    illegalChildParentRelation(child: $0, parent: container)\n            }\n        }\n        layout = container.layout\n        orientation = container.orientation\n        weight = getWeightOrNil(container) ?? 1\n    }\n}\n\nstruct FrozenWindow: Sendable {\n    let id: UInt32\n    let weight: CGFloat\n\n    @MainActor init(_ window: Window) {\n        id = window.windowId\n        weight = getWeightOrNil(window) ?? 1\n    }\n}\n\n@MainActor private func getWeightOrNil(_ node: TreeNode) -> CGFloat? {\n    ((node.parent as? TilingContainer)?.orientation).map { node.getWeight($0) }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/frozen/FrozenWorld.swift",
    "content": "struct FrozenWorld {\n    let workspaces: [FrozenWorkspace]\n    let monitors: [FrozenMonitor]\n    let windowIds: Set<UInt32>\n}\n\n@MainActor\nfunc collectAllWindowIds(workspace: Workspace) -> [UInt32] {\n    workspace.floatingWindows.map { $0.windowId } +\n        workspace.macOsNativeFullscreenWindowsContainer.children.map { ($0 as! Window).windowId } +\n        workspace.macOsNativeHiddenAppsWindowsContainer.children.map { ($0 as! Window).windowId } +\n        collectAllWindowIdsRecursive(workspace.rootTilingContainer)\n}\n\nfunc collectAllWindowIdsRecursive(_ node: TreeNode) -> [UInt32] {\n    switch node.nodeCases {\n        case .macosFullscreenWindowsContainer,\n             .macosHiddenAppsWindowsContainer,\n             .macosMinimizedWindowsContainer,\n             .macosPopupWindowsContainer,\n             .workspace: []\n        case .tilingContainer(let c):\n            c.children.reduce(into: [UInt32]()) { partialResult, elem in\n                partialResult += collectAllWindowIdsRecursive(elem)\n            }\n        case .window(let w): [w.windowId]\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/frozen/closedWindowsCache.swift",
    "content": "import AppKit\n\n/// First line of defence against lock screen\n///\n/// When you lock the screen, all accessibility API becomes unobservable (all attributes become empty, window id\n/// becomes nil, etc.) which tricks AeroSpace into thinking that all windows were closed.\n/// That's why every time a window dies AeroSpace caches the \"entire world\" (unless window is already presented in the cache)\n/// so that once the screen is unlocked, AeroSpace could restore windows to where they were\n@MainActor private var closedWindowsCache = FrozenWorld(workspaces: [], monitors: [], windowIds: [])\n\nstruct FrozenMonitor: Sendable {\n    let topLeftCorner: CGPoint\n    let visibleWorkspace: String\n\n    @MainActor init(_ monitor: Monitor) {\n        topLeftCorner = monitor.rect.topLeftCorner\n        visibleWorkspace = monitor.activeWorkspace.name\n    }\n}\n\nstruct FrozenWorkspace: Sendable {\n    let name: String\n    let monitor: FrozenMonitor // todo drop this property, once monitor to workspace assignment migrates to TreeNode\n    let rootTilingNode: FrozenContainer\n    let floatingWindows: [FrozenWindow]\n    let macosUnconventionalWindows: [FrozenWindow]\n\n    @MainActor init(_ workspace: Workspace) {\n        name = workspace.name\n        monitor = FrozenMonitor(workspace.workspaceMonitor)\n        rootTilingNode = FrozenContainer(workspace.rootTilingContainer)\n        floatingWindows = workspace.floatingWindows.map(FrozenWindow.init)\n        macosUnconventionalWindows =\n            workspace.macOsNativeHiddenAppsWindowsContainer.children.map { FrozenWindow($0 as! Window) } +\n            workspace.macOsNativeFullscreenWindowsContainer.children.map { FrozenWindow($0 as! Window) }\n    }\n}\n\n@MainActor func cacheClosedWindowIfNeeded() {\n    let allWs = Workspace.all\n    let allWindowIds = allWs.flatMap { collectAllWindowIds(workspace: $0) }.toSet()\n    if allWindowIds.isSubset(of: closedWindowsCache.windowIds) {\n        return // already cached\n    }\n    closedWindowsCache = FrozenWorld(\n        workspaces: allWs.map { FrozenWorkspace($0) },\n        monitors: monitors.map(FrozenMonitor.init),\n        windowIds: allWindowIds,\n    )\n}\n\n@MainActor func restoreClosedWindowsCacheIfNeeded(newlyDetectedWindow: Window) async throws -> Bool {\n    if !closedWindowsCache.windowIds.contains(newlyDetectedWindow.windowId) {\n        return false\n    }\n    let monitors = monitors\n    let topLeftCornerToMonitor = monitors.grouped { $0.rect.topLeftCorner }\n\n    for frozenWorkspace in closedWindowsCache.workspaces {\n        let workspace = Workspace.get(byName: frozenWorkspace.name)\n        _ = topLeftCornerToMonitor[frozenWorkspace.monitor.topLeftCorner]?\n            .singleOrNil()?\n            .setActiveWorkspace(workspace)\n        for frozenWindow in frozenWorkspace.floatingWindows {\n            MacWindow.get(byId: frozenWindow.id)?.bindAsFloatingWindow(to: workspace)\n        }\n        for frozenWindow in frozenWorkspace.macosUnconventionalWindows { // Will get fixed by normalizations\n            MacWindow.get(byId: frozenWindow.id)?.bindAsFloatingWindow(to: workspace)\n        }\n        let prevRoot = workspace.rootTilingContainer // Save prevRoot into a variable to avoid it being garbage collected earlier than needed\n        let potentialOrphans = prevRoot.allLeafWindowsRecursive\n        prevRoot.unbindFromParent()\n        restoreTreeRecursive(frozenContainer: frozenWorkspace.rootTilingNode, parent: workspace, index: INDEX_BIND_LAST)\n        for window in (potentialOrphans - workspace.rootTilingContainer.allLeafWindowsRecursive) {\n            try await window.relayoutWindow(on: workspace, forceTile: true)\n        }\n    }\n\n    for monitor in closedWindowsCache.monitors {\n        _ = topLeftCornerToMonitor[monitor.topLeftCorner]?\n            .singleOrNil()?\n            .setActiveWorkspace(Workspace.get(byName: monitor.visibleWorkspace))\n    }\n    return true\n}\n\n@discardableResult\n@MainActor\nprivate func restoreTreeRecursive(frozenContainer: FrozenContainer, parent: NonLeafTreeNodeObject, index: Int) -> Bool {\n    let container = TilingContainer(\n        parent: parent,\n        adaptiveWeight: frozenContainer.weight,\n        frozenContainer.orientation,\n        frozenContainer.layout,\n        index: index,\n    )\n\n    for (index, child) in frozenContainer.children.enumerated() {\n        switch child {\n            case .window(let w):\n                // Stop the loop if can't find the window, because otherwise all the subsequent windows will have incorrect index\n                guard let window = MacWindow.get(byId: w.id) else { return false }\n                window.bind(to: container, adaptiveWeight: w.weight, index: index)\n            case .container(let c):\n                // There is no reason to continue\n                if !restoreTreeRecursive(frozenContainer: c, parent: container, index: index) { return false }\n        }\n    }\n    return true\n}\n\n// Consider the following case:\n// 1. Close window\n// 2. The previous step lead to caching the whole world\n// 3. Change something in the layout\n// 4. Lock the screen\n// 5. The cache won't be updated because all alive windows are already cached\n// 6. Unlock the screen\n// 7. The wrong cache is used\n//\n// That's why we have to reset the cache every time layout changes. The layout can only be changed by running commands\n// and with mouse manipulations\n@MainActor func resetClosedWindowsCache() {\n    closedWindowsCache = FrozenWorld(workspaces: [], monitors: [], windowIds: [])\n}\n"
  },
  {
    "path": "Sources/AppBundle/tree/normalizeContainers.swift",
    "content": "extension Workspace {\n    @MainActor func normalizeContainers() {\n        rootTilingContainer.unbindEmptyAndAutoFlatten() // Beware! rootTilingContainer may change after this line of code\n        if config.enableNormalizationOppositeOrientationForNestedContainers {\n            rootTilingContainer.normalizeOppositeOrientationForNestedContainers()\n        }\n    }\n}\n\nextension TilingContainer {\n    @MainActor fileprivate func unbindEmptyAndAutoFlatten() {\n        if let child = children.singleOrNil(), config.enableNormalizationFlattenContainers && (child is TilingContainer || !isRootContainer) {\n            child.unbindFromParent()\n            let mru = parent?.mostRecentChild\n            let previousBinding = unbindFromParent()\n            child.bind(to: previousBinding.parent, adaptiveWeight: previousBinding.adaptiveWeight, index: previousBinding.index)\n            (child as? TilingContainer)?.unbindEmptyAndAutoFlatten()\n            if mru != self {\n                mru?.markAsMostRecentChild()\n            } else {\n                child.markAsMostRecentChild()\n            }\n        } else {\n            for child in children {\n                (child as? TilingContainer)?.unbindEmptyAndAutoFlatten()\n            }\n            if children.isEmpty && !isRootContainer {\n                unbindFromParent()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/AppearanceTheme.swift",
    "content": "import SwiftUI\nimport Common\n\nenum AppearanceTheme {\n    case light\n    case dark\n\n    /// System Settings -> Appearance -> Light/Dark\n    /// This is the theme representing how the UI should look inside the app (this might be different than the menu bar color)\n    @MainActor\n    static var current: AppearanceTheme {\n        let name = NSApplication.shared.effectiveAppearance.name\n        let isDarkAppearance = name == .vibrantDark ||\n            name == .darkAqua ||\n            name == .accessibilityHighContrastDarkAqua ||\n            name == .accessibilityHighContrastVibrantDark\n        return isDarkAppearance ? .dark : .light\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/ExperimentalUISettings.swift",
    "content": "import SwiftUI\n\nstruct ExperimentalUISettings {\n    var displayStyle: MenuBarStyle {\n        get {\n            if let value = UserDefaults.standard.string(forKey: ExperimentalUISettingsItems.displayStyle.rawValue) {\n                return MenuBarStyle(rawValue: value) ?? .monospacedText\n            } else {\n                return .monospacedText\n            }\n        }\n        set {\n            UserDefaults.standard.setValue(newValue.rawValue, forKey: ExperimentalUISettingsItems.displayStyle.rawValue)\n            UserDefaults.standard.synchronize()\n        }\n    }\n}\n\nenum MenuBarStyle: String, CaseIterable, Identifiable, Equatable, Hashable {\n    case monospacedText\n    case systemText\n    case squares\n    case i3\n    case i3Ordered\n    var id: String { rawValue }\n    var title: String {\n        switch self {\n            case .monospacedText: \"Monospaced font\"\n            case .systemText: \"System font\"\n            case .squares: \"Square images\"\n            case .i3: \"i3 style grouped\"\n            case .i3Ordered: \"i3 style ordered\"\n        }\n    }\n}\n\nenum ExperimentalUISettingsItems: String {\n    case displayStyle\n}\n\n@MainActor\nfunc getExperimentalUISettingsMenu(viewModel: TrayMenuModel) -> some View {\n    let color = AppearanceTheme.current == .dark ? Color.white : Color.black\n    return Menu {\n        Text(\"Menu bar style (macOS 14 or later):\")\n        ForEach(MenuBarStyle.allCases, id: \\.id) { style in\n            MenuBarStyleButton(style: style, color: color).environmentObject(viewModel)\n        }\n    } label: {\n        Text(\"Experimental UI Settings (No stability guarantees)\")\n    }\n}\n\n@MainActor\nstruct MenuBarStyleButton: View {\n    @EnvironmentObject var viewModel: TrayMenuModel\n    let style: MenuBarStyle\n    let color: Color\n\n    var body: some View {\n        Button {\n            viewModel.experimentalUISettings.displayStyle = style\n        } label: {\n            Toggle(isOn: .constant(viewModel.experimentalUISettings.displayStyle == style)) {\n                MenuBarLabel(style: style, color: color)\n                    .environmentObject(viewModel)\n                Text(\" -  \" + style.title)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/MenuBar.swift",
    "content": "import Common\nimport Foundation\nimport SwiftUI\n\n@MainActor\npublic func menuBar(viewModel: TrayMenuModel) -> some Scene { // todo should it be converted to \"SwiftUI struct\"?\n    MenuBarExtra {\n        let shortIdentification = \"\\(aeroSpaceAppName) v\\(aeroSpaceAppVersion) \\(gitShortHash)\"\n        let identification      = \"\\(aeroSpaceAppName) v\\(aeroSpaceAppVersion) \\(gitHash)\"\n        Text(shortIdentification)\n        Button(\"Copy to clipboard\") { identification.copyToClipboard() }\n            .keyboardShortcut(\"C\", modifiers: .command)\n        Divider()\n        if let token: RunSessionGuard = .isServerEnabled {\n            Text(\"Workspaces:\")\n            ForEach(viewModel.workspaces, id: \\.name) { workspace in\n                Button {\n                    Task {\n                        try await runLightSession(.menuBarButton, token) { _ = Workspace.get(byName: workspace.name).focusWorkspace() }\n                    }\n                } label: {\n                    Toggle(isOn: .constant(workspace.isFocused)) {\n                        Text(workspace.name + workspace.suffix).font(.system(.body, design: .monospaced))\n                    }\n                }\n            }\n            Divider()\n        }\n        Button {\n            NSWorkspace.shared.open(URL(string: \"https://github.com/sponsors/nikitabobko\").orDie())\n            viewModel.sponsorshipMessage = sponsorshipPrompts.randomElement().orDie()\n        } label: {\n            Text(\"Sponsor AeroSpace on GitHub\")\n            Text(viewModel.sponsorshipMessage)\n        }\n        Divider()\n        Button(viewModel.isEnabled ? \"Disable\" : \"Enable\") {\n            Task {\n                try await runLightSession(.menuBarButton, .forceRun) { () throws in\n                    _ = try await EnableCommand(args: EnableCmdArgs(rawArgs: [], targetState: .toggle))\n                        .run(.defaultEnv, .emptyStdin)\n                }\n            }\n        }.keyboardShortcut(\"E\", modifiers: .command)\n        getExperimentalUISettingsMenu(viewModel: viewModel)\n        openConfigButton()\n        reloadConfigButton()\n        Button(\"Quit \\(aeroSpaceAppName)\") {\n            Task {\n                defer { terminateApp() }\n                try await terminationHandler.beforeTermination()\n            }\n        }.keyboardShortcut(\"Q\", modifiers: .command)\n    } label: {\n        if viewModel.isEnabled {\n            MenuBarLabel().environmentObject(viewModel)\n        } else {\n            Image(systemName: \"pause.circle.fill\")\n                .resizable()\n                .aspectRatio(contentMode: .fit)\n        }\n    }\n}\n\n@MainActor @ViewBuilder\nfunc openConfigButton(showShortcutGroup: Bool = false) -> some View {\n    let editor = getTextEditorToOpenConfig()\n    let button = Button(\"Open config in '\\(editor.lastPathComponent)'\") {\n        let fallbackConfig: URL = FileManager.default.homeDirectoryForCurrentUser.appending(path: configDotfileName)\n        switch findCustomConfigUrl() {\n            case .file(let url):\n                url.open(with: editor)\n            case .noCustomConfigExists:\n                _ = try? FileManager.default.copyItem(atPath: defaultConfigUrl.path, toPath: fallbackConfig.path)\n                fallbackConfig.open(with: editor)\n            case .ambiguousConfigError:\n                fallbackConfig.open(with: editor)\n        }\n    }.keyboardShortcut(\",\", modifiers: .command)\n    if showShortcutGroup {\n        shortcutGroup(label: Text(\"⌘ ,\"), content: button)\n    } else {\n        button\n    }\n}\n\n@MainActor @ViewBuilder\nfunc reloadConfigButton(showShortcutGroup: Bool = false) -> some View {\n    if let token: RunSessionGuard = .isServerEnabled {\n        let button = Button(\"Reload config\") {\n            Task {\n                try await runLightSession(.menuBarButton, token) { _ = try await reloadConfig() }\n            }\n        }.keyboardShortcut(\"R\", modifiers: .command)\n        if showShortcutGroup {\n            shortcutGroup(label: Text(\"⌘ R\"), content: button)\n        } else {\n            button\n        }\n    }\n}\n\nfunc shortcutGroup(label: some View, content: some View) -> some View {\n    GroupBox {\n        VStack(alignment: .trailing, spacing: 6) {\n            label\n                .foregroundStyle(Color.secondary)\n            content\n        }\n    }\n}\n\nfunc getTextEditorToOpenConfig() -> URL {\n    NSWorkspace.shared.urlForApplication(toOpen: findCustomConfigUrl().urlOrNil ?? defaultConfigUrl)?\n        .takeIf { $0.lastPathComponent != \"Xcode.app\" } // Blacklist Xcode. It is too heavy to open plain text files\n        ?? URL(filePath: \"/System/Applications/TextEdit.app\")\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/MenuBarLabel.swift",
    "content": "import Common\nimport Foundation\nimport SwiftUI\n\n@MainActor\nstruct MenuBarLabel: View {\n    @Environment(\\.colorScheme) var menuColorScheme: ColorScheme\n    @EnvironmentObject var viewModel: TrayMenuModel\n    let color: Color?\n    let style: MenuBarStyle?\n\n    let hStackSpacing = CGFloat(6)\n    let itemSize = CGFloat(40)\n    let itemBorderSize = CGFloat(3)\n    let itemCornerRadius = CGFloat(6)\n\n    private var finalColor: Color {\n        return color ?? (menuColorScheme == .dark ? Color.white : Color.black)\n    }\n\n    init(style: MenuBarStyle? = nil, color: Color? = nil) {\n        self.style = style\n        self.color = color\n    }\n\n    var body: some View {\n        if #available(macOS 14, *) { // https://github.com/nikitabobko/AeroSpace/issues/1122\n            let renderer = ImageRenderer(content: menuBarContent)\n            if let cgImage = renderer.cgImage {\n                // Using scale: 1 results in a blurry image for unknown reasons\n                Image(cgImage, scale: 2, label: Text(viewModel.trayText))\n            } else {\n                // In case image can't be rendered fallback to plain text\n                Text(viewModel.trayText)\n            }\n        } else { // macOS 13 and lower\n            Text(viewModel.trayText)\n        }\n    }\n\n    var menuBarContent: some View {\n        return HStack(spacing: hStackSpacing) {\n            let style = style ?? viewModel.experimentalUISettings.displayStyle\n            switch style {\n                case .monospacedText: getText(for: .monospaced)\n                case .systemText: getText(for: .default)\n                case .squares: squares\n                case .i3:\n                    squares\n                    let workspaces = viewModel.workspaces.filter { !$0.isEffectivelyEmpty && !$0.isVisible }\n                    if !workspaces.isEmpty {\n                        otherWorkspaces(with: workspaces)\n                    }\n                case .i3Ordered:\n                    let modeItem = viewModel.trayItems.first { $0.type == .mode }\n                    if let modeItem {\n                        itemView(for: modeItem)\n                        modeSeparator(with: .monospaced)\n                    }\n                    let orderedWorkspaces = viewModel.workspaces.filter { !$0.isEffectivelyEmpty || $0.isVisible }\n                    ForEach(orderedWorkspaces, id: \\.name) { item in\n                        let trayItem = TrayItem(\n                            type: .workspace,\n                            name: item.name,\n                            isActive: item.isFocused,\n                            hasFullscreenWindows: item.hasFullscreenWindows,\n                        )\n                        itemView(for: trayItem)\n                            .opacity(item.isVisible ? 1 : 0.5)\n                    }\n            }\n        }\n    }\n\n    private func getText(for design: Font.Design) -> some View {\n        Text(viewModel.trayText)\n            .font(.system(.largeTitle, design: design))\n            .foregroundStyle(finalColor)\n    }\n\n    private var squares: some View {\n        ForEach(viewModel.trayItems, id: \\.id) { item in\n            itemView(for: item)\n            if item.type == .mode {\n                modeSeparator(with: .monospaced)\n            }\n        }\n    }\n\n    private func otherWorkspaces(with otherWorkspaces: [WorkspaceViewModel]) -> some View {\n        Group {\n            Text(\"|\")\n                .font(.system(.largeTitle))\n                .foregroundStyle(finalColor)\n                .bold()\n                .padding(.bottom, 6)\n            ForEach(otherWorkspaces, id: \\.name) { item in\n                itemView(for: TrayItem(type: .workspace, name: item.name, isActive: false, hasFullscreenWindows: item.hasFullscreenWindows))\n            }\n        }\n        .opacity(0.6)\n    }\n\n    private func modeSeparator(with design: Font.Design) -> some View {\n        Text(\":\")\n            .font(.system(.largeTitle, design: design))\n            .foregroundStyle(finalColor)\n            .bold()\n    }\n\n    @ViewBuilder\n    fileprivate func itemView(for item: TrayItem) -> some View {\n        let view = itemSubView(for: item)\n        if item.hasFullscreenWindows {\n            let strokeStyle = StrokeStyle(lineWidth: 2, lineCap: .square, lineJoin: .miter, miterLimit: 10, dash: [10, 5], dashPhase: 3)\n            view\n                .padding(4)\n                .overlay {\n                    RoundedRectangle(cornerRadius: itemCornerRadius, style: .continuous)\n                        .strokeBorder(finalColor, style: strokeStyle)\n                }\n        } else {\n            view\n        }\n    }\n\n    @ViewBuilder\n    fileprivate func itemSubView(for item: TrayItem) -> some View {\n        // If workspace name contains emojis we use the plain emoji in text to avoid visibility issues scaling the emoji to fit the squares\n        if item.name.containsEmoji() {\n            Text(item.name)\n                .font(.system(.largeTitle))\n                .foregroundStyle(finalColor)\n                .frame(height: itemSize)\n        } else {\n            if let imageName = item.systemImageName {\n                Image(systemName: imageName)\n                    .resizable()\n                    .aspectRatio(contentMode: .fit)\n                    .symbolRenderingMode(.monochrome)\n                    .foregroundStyle(finalColor)\n                    .frame(width: itemSize, height: itemSize)\n            } else {\n                let text = Text(item.name)\n                    .font(.system(.largeTitle))\n                    .bold()\n                    .padding(.horizontal, itemBorderSize * 2)\n                    .frame(height: itemSize)\n                if item.isActive {\n                    ZStack {\n                        text.background {\n                            RoundedRectangle(cornerRadius: itemCornerRadius, style: .circular)\n                        }\n                        text.blendMode(.destinationOut)\n                    }\n                    .compositingGroup()\n                    .foregroundStyle(finalColor)\n                    .frame(height: itemSize)\n                } else {\n                    text.background {\n                        RoundedRectangle(cornerRadius: itemCornerRadius, style: .continuous)\n                            .strokeBorder(lineWidth: itemBorderSize)\n                    }\n                    .foregroundStyle(finalColor)\n                    .frame(height: itemSize)\n                }\n            }\n        }\n    }\n}\n\nextension String {\n    fileprivate func containsEmoji() -> Bool {\n        unicodeScalars.contains { $0.properties.isEmoji && $0.properties.isEmojiPresentation }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/MessageView.swift",
    "content": "import Common\nimport SwiftUI\n\n@MainActor\npublic func getMessageWindow(messageModel: MessageModel) -> some Scene {\n    // Using SwiftUI.Window because another class in AeroSpace is already called Window\n    SwiftUI.Window(messageModel.message?.title ?? aeroSpaceAppName, id: messageWindowId) {\n        MessageView(model: messageModel)\n            .onAppear {\n                // Set activation policy; otherwise, AeroSpace windows won't be able to receive focus and accept keyboard input\n                NSApp.setActivationPolicy(.accessory)\n                NSApplication.shared.windows.forEach {\n                    if $0.identifier?.rawValue == messageWindowId {\n                        $0.level = .floating\n                        $0.styleMask.remove(.miniaturizable) // Disable minimize button, because we don't unminimize the window on config error\n                    }\n                }\n            }\n        // .windowMinimizeBehavior(WindowInteractionBehavior.disabled) // SwiftUI way of hiding minimize button. Available only since macOS 15\n    }\n    .windowResizability(.contentMinSize)\n    //.windowLevel(.floating) //This might be the SwiftUI way of doing window level instead of the onAppear block above, but it's only available from macOS 15.0\n}\n\npublic let messageWindowId = \"\\(aeroSpaceAppName).messageView\"\n\nstruct MessageView: View {\n    @StateObject private var model: MessageModel\n    @Environment(\\.dismiss) private var dismiss: DismissAction\n    @FocusState var focus: Bool\n\n    init(model: MessageModel) {\n        self._model = .init(wrappedValue: model)\n    }\n\n    public var body: some View {\n        VStack(alignment: .leading) {\n            HStack(alignment: .center) {\n                Image(systemName: \"exclamationmark.triangle.fill\")\n                    .foregroundColor(.yellow)\n                    .font(.system(size: 48))\n                Text(\"\\(model.message?.description ?? \"\")\")\n                    .padding(.horizontal)\n                    .focusable()\n            }\n            .padding()\n            ScrollView {\n                VStack(alignment: .leading) {\n                    HStack {\n                        let cancelOnEnterBinding: Binding<String> = Binding(\n                            get: { model.message?.body ?? \"\" },\n                            set: { newText in\n                                if let prev = model.message?.body.count(where: \\.isNewline), newText.count(where: \\.isNewline) > prev {\n                                    model.message = nil\n                                }\n                            },\n                        )\n                        TextEditor(text: cancelOnEnterBinding)\n                            .font(.system(size: 12).monospaced())\n                            .focused($focus)\n                        //  .onKeyPress(.return) { return .handled } // enter handling alternative. Only available since macOS 14\n                        Spacer()\n                    }\n                    Spacer()\n                }\n                .padding()\n            }\n            .background(Color(.controlBackgroundColor))\n            .clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous))\n            .padding(.horizontal)\n            HStack {\n                Spacer()\n                if let type = model.message?.type {\n                    switch type {\n                        case .config:\n                            reloadConfigButton(showShortcutGroup: true)\n                            openConfigButton(showShortcutGroup: true)\n                    }\n                }\n                let closeButton = Button(\"Close\") { model.message = nil }.keyboardShortcut(.defaultAction)\n                shortcutGroup(label: Image(systemName: \"return.left\"), content: closeButton)\n            }\n            .padding()\n        }\n        .textSelection(.enabled)\n        .frame(minWidth: 480, maxWidth: 960, minHeight: 200)\n        .onChange(of: model.message) { message in\n            if message == nil {\n                self.dismiss()\n            }\n        }\n        .onDisappear {\n            // If user closes the screen with the macOS native close (x) button and then the error is still the same, this window will not appear again\n            model.message = nil\n        }\n        .onAppear {\n            focus = true\n        }\n    }\n}\n\npublic final class MessageModel: ObservableObject {\n    @MainActor public static let shared = MessageModel()\n    @Published public var message: Message? = nil\n\n    private init() {}\n}\n\npublic enum MessageType {\n    case config\n}\n\npublic struct Message: Hashable, Equatable {\n    public let type: MessageType\n    public let title: String\n    public let description: String\n    public let body: String\n\n    init(type: MessageType = .config, title: String = aeroSpaceAppName, description: String, body: String) {\n        self.type = type\n        self.title = title\n        self.description = description\n        self.body = body\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/NSPanelHud.swift",
    "content": "import AppKit\n\nopen class NSPanelHud: NSPanel {\n    init() {\n        super.init(\n            contentRect: .zero,\n            styleMask: [.nonactivatingPanel, .borderless, .hudWindow, .utilityWindow],\n            backing: .buffered,\n            defer: false,\n        )\n        self.level = .floating\n        self.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]\n        self.isReleasedWhenClosed = false\n        self.hidesOnDeactivate = false\n        self.isMovableByWindowBackground = false\n        self.alphaValue = 1\n        self.hasShadow = true\n        self.backgroundColor = .clear\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/SecureInputView.swift",
    "content": "import AppKit\nimport Carbon\nimport SwiftUI\n\nprivate let iconSize = CGSize(width: 50, height: 50)\nprivate let textSize = CGSize(width: 440, height: 110)\n\npublic final class SecureInputPanel: NSPanelHud {\n    @MainActor public static var shared: SecureInputPanel = SecureInputPanel()\n    private var hostingView = NSHostingView(rootView: SecureInputView())\n\n    override private init() {\n        super.init()\n    }\n\n    @MainActor\n    public func refresh() {\n        if let activeMode, TrayMenuModel.shared.isEnabled &&\n            config.modes[activeMode]?.bindings.isEmpty == false && IsSecureEventInputEnabled()\n        {\n            if isVisible { return }\n            self.contentView?.subviews.removeAll()\n            hostingView = NSHostingView(rootView: SecureInputView())\n            hostingView.frame = NSRect(x: 0, y: 0, width: iconSize.width, height: iconSize.height)\n            self.contentView?.addSubview(hostingView)\n            let x = mainMonitor.width - iconSize.width - 20\n            let panelFrame = NSRect(x: x, y: 20, width: iconSize.width, height: iconSize.width)\n            self.setFrame(panelFrame, display: true)\n            self.orderFrontRegardless()\n        } else {\n            close()\n        }\n    }\n\n    public func updateFrame(isMinimized: Bool) {\n        let width = isMinimized ? iconSize.width : textSize.width\n        let height = isMinimized ? iconSize.height : textSize.height\n        hostingView.frame = NSRect(x: 0, y: 0, width: width, height: height)\n        let x = mainMonitor.width - width - 20\n        let panelFrame = NSRect(x: x, y: 20, width: width, height: height)\n        self.setFrame(panelFrame, display: true)\n    }\n}\n\nstruct SecureInputView: View {\n    @State var isMinimized: Bool = true\n\n    @Environment(\\.colorScheme) var colorScheme: ColorScheme\n    private var fontColor: Color {\n        colorScheme == .dark ? Color.black : Color.white\n    }\n\n    var body: some View {\n        ZStack(alignment: .center) {\n            Rectangle()\n                .fill(Color.gray.opacity(isMinimized ? 0.8 : 1.0))\n            if isMinimized {\n                Image(systemName: \"lock.shield.fill\")\n                    .resizable()\n                    .aspectRatio(contentMode: .fit)\n                    .padding(6)\n            } else {\n                Text(\"AeroSpace cannot respond to keyboard shortcuts while **Secure Input** is active. **Secure Input** is a macOS security feature that prevents applications from reading keyboard events.\")\n                    .font(.title3)\n                    .padding(10)\n            }\n        }\n        .foregroundStyle(fontColor)\n        .clipShape(RoundedRectangle(cornerRadius: 12, style: .continuous))\n        .onTapGesture {\n            if !isMinimized {\n                SecureInputPanel.shared.refresh()\n            }\n            isMinimized.toggle()\n            SecureInputPanel.shared.updateFrame(isMinimized: isMinimized)\n        }\n        .frame(\n            width: isMinimized ? iconSize.width : textSize.width,\n            height: isMinimized ? iconSize.height : textSize.height,\n        )\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/TrayMenuModel.swift",
    "content": "import AppKit\nimport Common\n\npublic final class TrayMenuModel: ObservableObject {\n    @MainActor public static let shared = TrayMenuModel()\n\n    private init() {}\n\n    @Published var trayText: String = \"\"\n    @Published var trayItems: [TrayItem] = []\n    /// Is \"layouting\" enabled\n    @Published var isEnabled: Bool = true\n    @Published var workspaces: [WorkspaceViewModel] = []\n    @Published var experimentalUISettings: ExperimentalUISettings = ExperimentalUISettings()\n    @Published var sponsorshipMessage: String = sponsorshipPrompts.randomElement().orDie()\n}\n\n@MainActor func updateTrayText() {\n    let sortedMonitors = sortedMonitors\n    let focus = focus\n    TrayMenuModel.shared.trayText = (activeMode?.takeIf { $0 != mainModeId }?.first.map { \"(\\($0.uppercased())) \" } ?? \"\") +\n        sortedMonitors\n        .map {\n            let hasFullscreenWindows = $0.activeWorkspace.allLeafWindowsRecursive.contains { $0.isFullscreen }\n            let activeWorkspaceName = hasFullscreenWindows ? \"[\\($0.activeWorkspace.name)]\" : $0.activeWorkspace.name\n            return ($0.activeWorkspace == focus.workspace && sortedMonitors.count > 1 ? \"*\" : \"\") + activeWorkspaceName\n        }\n        .joined(separator: \" │ \")\n    TrayMenuModel.shared.workspaces = Workspace.all.map {\n        let apps = $0.allLeafWindowsRecursive.map { $0.app.name?.takeIf { !$0.isEmpty } }.filterNotNil().toSet()\n        let dash = \" - \"\n        let suffix = switch true {\n            case !apps.isEmpty: dash + apps.sorted().joinTruncating(separator: \", \", length: 25)\n            case $0.isVisible: dash + $0.workspaceMonitor.name\n            default: \"\"\n        }\n        let hasFullscreenWindows = $0.allLeafWindowsRecursive.contains { $0.isFullscreen }\n        return WorkspaceViewModel(\n            name: $0.name,\n            suffix: suffix,\n            isFocused: focus.workspace == $0,\n            isEffectivelyEmpty: $0.isEffectivelyEmpty,\n            isVisible: $0.isVisible,\n            hasFullscreenWindows: hasFullscreenWindows,\n        )\n    }\n    var items = sortedMonitors.map {\n        let hasFullscreenWindows = $0.activeWorkspace.allLeafWindowsRecursive.contains { $0.isFullscreen }\n        return TrayItem(\n            type: .workspace,\n            name: $0.activeWorkspace.name,\n            isActive: $0.activeWorkspace == focus.workspace,\n            hasFullscreenWindows: hasFullscreenWindows,\n        )\n    }\n    let mode = activeMode?.takeIf { $0 != mainModeId }?.first.map {\n        TrayItem(type: .mode, name: $0.uppercased(), isActive: true, hasFullscreenWindows: false)\n    }\n    if let mode {\n        items.insert(mode, at: 0)\n    }\n    TrayMenuModel.shared.trayItems = items\n}\n\nstruct WorkspaceViewModel: Hashable {\n    let name: String\n    let suffix: String\n    let isFocused: Bool\n    let isEffectivelyEmpty: Bool\n    let isVisible: Bool\n    let hasFullscreenWindows: Bool\n}\n\nenum TrayItemType: String, Hashable {\n    case mode\n    case workspace\n}\n\nprivate let validLetters = \"A\" ... \"Z\"\n\nstruct TrayItem: Hashable, Identifiable {\n    let type: TrayItemType\n    let name: String\n    let isActive: Bool\n    let hasFullscreenWindows: Bool\n    var systemImageName: String? {\n        // System image type is only valid for numbers 0 to 50 and single capital char workspace name\n        if let number = Int(name) {\n            if !(0 ... 50).contains(number) { return nil }\n        } else if name.count == 1 {\n            if !validLetters.contains(name) { return nil }\n        } else {\n            return nil\n        }\n        let lowercasedName = name.lowercased()\n        switch type {\n            case .mode:\n                return \"\\(lowercasedName).circle\"\n            case .workspace:\n                if isActive {\n                    return \"\\(lowercasedName).square.fill\"\n                } else {\n                    return \"\\(lowercasedName).square\"\n                }\n        }\n    }\n    var id: String {\n        return type.rawValue + name\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/ui/VolumeView.swift",
    "content": "import AppKit\nimport SwiftUI\n\npublic final class VolumePanel: NSPanelHud {\n    @MainActor public static var shared: VolumePanel = VolumePanel()\n    private var timer: Timer?\n    private var panelFrame = NSRect(x: 0, y: 0, width: 50, height: 206)\n\n    override private init() {\n        super.init()\n    }\n\n    public func update(with volume: Float) {\n        timer?.invalidate()\n        self.contentView?.subviews.removeAll()\n        let hostingView = NSHostingView(rootView: VolumeView(volume: volume))\n        hostingView.frame = NSRect(x: 0, y: 0, width: panelFrame.width, height: panelFrame.height)\n        self.contentView?.addSubview(hostingView)\n        panelFrame.origin.x = mainMonitor.width - panelFrame.size.width - 20\n        panelFrame.origin.y = (mainMonitor.height - panelFrame.size.height) / 2\n        self.setFrame(panelFrame, display: true)\n        self.orderFrontRegardless()\n        startTimer()\n    }\n\n    func startTimer() {\n        timer = .scheduledTimer(withTimeInterval: 2 /* seconds */, repeats: false) { _ in\n            Task { @MainActor [weak self] in\n                self?.close()\n            }\n        }\n    }\n}\n\nstruct VolumeView: View {\n    @State var volume: Float? = nil\n\n    @Environment(\\.colorScheme) var colorScheme: ColorScheme\n    private var barColor: Color {\n        colorScheme == .dark ? Color.white : Color.black\n    }\n    private var fontColor: Color {\n        colorScheme == .dark ? Color.black : Color.white\n    }\n    private var speakerImage: String {\n        guard let volume else { return \"speaker.fill\" }\n        switch volume {\n            case 0.00 ..< 0.01: return \"speaker.slash.fill\"\n            case 0.01 ..< 0.25: return \"speaker.fill\"\n            case 0.25 ..< 0.50: return \"speaker.1.fill\"\n            case 0.50 ..< 0.75: return \"speaker.2.fill\"\n            default: return \"speaker.3.fill\"\n        }\n    }\n    private let bar = CGSize(width: 44, height: 200)\n\n    var body: some View {\n        ZStack(alignment: .bottom) {\n            if let volume {\n                Rectangle()\n                    .fill(Color.gray.opacity(0.8))\n                Rectangle()\n                    .fill(barColor)\n                    .frame(height: CGFloat(volume) * bar.height)\n                VStack {\n                    Text(\"\\(Int(volume * 100))%\")\n                        .font(.system(size: 12, weight: .bold))\n                    Image(systemName: speakerImage)\n                        .frame(width: 30, height: 30, alignment: .center)\n                        .padding(.bottom, 10)\n                }\n                .foregroundStyle(fontColor)\n            }\n        }\n        .frame(width: bar.width, height: bar.height)\n        .clipShape(RoundedRectangle(cornerRadius: 12, style: .continuous))\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/ArrayEx.swift",
    "content": "import Common\n\nextension Array {\n    func singleOrNil(where predicate: (Self.Element) throws -> Bool) rethrows -> Self.Element? {\n        var found: Self.Element? = nil\n        for elem in self where try predicate(elem) {\n            if found == nil {\n                found = elem\n            } else {\n                return nil\n            }\n        }\n        return found\n    }\n}\n\nextension Array where Self.Element: Equatable {\n    @discardableResult\n    mutating func remove(element: Self.Element) -> Int? {\n        if let index = firstIndex(of: element) {\n            remove(at: index)\n            return index\n        } else {\n            return nil\n        }\n    }\n}\n\nfunc - <T>(lhs: [T], rhs: [T]) -> [T] where T: Hashable {\n    let r = rhs.toSet()\n    return lhs.filter { !r.contains($0) }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/AwaitableOneTimeBroadcastLatch.swift",
    "content": "import Common\nimport Foundation\n\nactor AwaitableOneTimeBroadcastLatch {\n    private var done = false\n    private var awaiters: [UniqueToken: Nullable<CheckedContinuation<(), any Error>>] = [:]\n\n    func await() async throws {\n        try checkCancellation()\n        if done { return }\n\n        let id = UniqueToken()\n        try await withTaskCancellationHandler {\n            try await withCheckedThrowingContinuation { (cont: CheckedContinuation<(), any Error>) in\n                if let awaiter = awaiters.removeValue(forKey: id) {\n                    check(awaiter.isNull)\n                    cont.resume(throwing: CancellationError())\n                } else if done {\n                    cont.resume()\n                } else {\n                    awaiters[id] = .just(cont)\n                }\n            }\n        } onCancel: {\n            Task { await cancel(id: id) }\n        }\n    }\n\n    private func cancel(id: UniqueToken) {\n        if let awaiter = awaiters.removeValue(forKey: id) {\n            awaiter.valueOrNil.orDie().resume(throwing: CancellationError())\n        } else if !done {\n            awaiters[id] = .null // Indicate to 'await' that the client should be cancelled right away when it suspends\n        }\n    }\n\n    func signalToAll() {\n        done = true\n        for (_, awaiter) in awaiters {\n            awaiter.valueOrNil?.resume()\n        }\n        awaiters = [:]\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/AxSubscription.swift",
    "content": "import AppKit\nimport Common\n\n/// The subscription is active as long as you keep this class in memory\nfinal class AxSubscription {\n    let obs: AXObserver\n    let ax: AXUIElement\n    let axThreadToken: AxAppThreadToken = axTaskLocalAppThreadToken ?? dieT(\"axTaskLocalAppThreadToken is not initialized\")\n    var notifKeys: Set<String> = []\n\n    private init(obs: AXObserver, ax: AXUIElement) {\n        axThreadToken.checkEquals(axTaskLocalAppThreadToken)\n        self.obs = obs\n        self.ax = ax\n    }\n\n    private func subscribe(_ key: String) throws -> Bool {\n        axThreadToken.checkEquals(axTaskLocalAppThreadToken)\n        if AXObserverAddNotification(obs, ax, key as CFString, nil) == .success {\n            notifKeys.insert(key)\n            return true\n        } else {\n            return false\n        }\n    }\n\n    static func bulkSubscribe(_ nsApp: NSRunningApplication, _ ax: AXUIElement, _ job: RunLoopJob, _ handlerToNotifKeyMapping: HandlerToNotifKeyMapping) throws -> [AxSubscription] {\n        var result: [AxSubscription] = []\n        var visitedNotifKeys: Set<String> = []\n        for (handler, notifKeys) in handlerToNotifKeyMapping {\n            try job.checkCancellation()\n            guard let obs = AXObserver.new(nsApp.processIdentifier, handler) else { return [] }\n            let subscription = AxSubscription(obs: obs, ax: ax)\n            for key: String in notifKeys {\n                try job.checkCancellation()\n                assert(visitedNotifKeys.insert(key).inserted)\n                if try !subscription.subscribe(key) { return [] }\n            }\n            CFRunLoopAddSource(CFRunLoopGetCurrent(), AXObserverGetRunLoopSource(obs), .defaultMode)\n            result.append(subscription)\n        }\n        return result\n    }\n\n    deinit {\n        axThreadToken.checkEquals(axTaskLocalAppThreadToken)\n        CFRunLoopRemoveSource(CFRunLoopGetCurrent(), AXObserverGetRunLoopSource(obs), .defaultMode)\n        for notifKey in notifKeys {\n            AXObserverRemoveNotification(obs, ax, notifKey as CFString)\n        }\n    }\n}\n\ntypealias HandlerToNotifKeyMapping = [(AXObserverCallback, [String])]\n"
  },
  {
    "path": "Sources/AppBundle/util/AxUiElementMock.swift",
    "content": "import AppKit\nimport Common\n\n/// Alternative name: AttrAddressibleStorage\nprotocol AxUiElementMock {\n    func get<Attr: ReadableAttr>(_ attr: Attr) -> Attr.T?\n    func containingWindowId() -> CGWindowID?\n}\n\nextension AxUiElementMock {\n    var cast: AXUIElement { self as! AXUIElement }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/LazySequenceProtocolEx.swift",
    "content": "// periphery:ignore\nextension LazySequenceProtocol {\n    func filterNotNil<Unwrapped>() -> LazyMapSequence<LazyFilterSequence<Self.Elements>.Elements, Unwrapped> where Element == Unwrapped? {\n        filter { $0 != nil }.map { $0.orDie() }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/MruStack.swift",
    "content": "/// Stack with most recently element on top\nfinal class MruStack<T: Equatable>: Sequence {\n    typealias Element = T\n\n    private var mruNode: Node<T>? = nil\n\n    func makeIterator() -> MruStackIterator<T> {\n        MruStackIterator(mruNode)\n    }\n\n    var mostRecent: T? { mruNode?.value }\n\n    func pushOrRaise(_ value: T) {\n        remove(value)\n        mruNode = Node(value, mruNode)\n    }\n\n    @discardableResult\n    func remove(_ value: T) -> Bool {\n        var prev: Node<T>? = nil\n        var current = mruNode\n        while let cur = current {\n            if cur.value == value {\n                if let prev {\n                    prev.next = cur.next\n                } else {\n                    mruNode = current?.next\n                }\n                cur.next = nil\n                return true\n            }\n            prev = cur\n            current = cur.next\n        }\n        return false\n    }\n}\n\nstruct MruStackIterator<T: Equatable>: IteratorProtocol {\n    typealias Element = T\n    private var current: Node<T>?\n\n    fileprivate init(_ current: Node<T>?) {\n        self.current = current\n    }\n\n    mutating func next() -> T? {\n        let result = current?.value\n        current = current?.next\n        return result\n    }\n}\n\nprivate final class Node<T: Equatable> {\n    var next: Node<T>? = nil\n    let value: T\n\n    init(_ value: T, _ next: Node<T>?) {\n        self.value = value\n        self.next = next\n    }\n\n    init(_ value: T) {\n        self.value = value\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/NSRunningApplicationEx.swift",
    "content": "import AppKit\n\nextension NSRunningApplication {\n    var idForDebug: String {\n        \"PID: \\(processIdentifier) ID: \\(bundleIdentifier ?? executableURL?.description ?? \"\")\"\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/NsApplicationEx.swift",
    "content": "import AppKit\n\nextension NSApplication.ActivationPolicy {\n    var prettyDescription: String {\n        switch self {\n            case .accessory: \"accessory\"\n            case .prohibited: \" prohibited\"\n            case .regular: \"regular\"\n            @unknown default: \"unknown \\(self.rawValue)\"\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/SetEx.swift",
    "content": "// periphery:ignore\nextension Set {\n    func toArray() -> [Element] { Array(self) }\n\n    @inlinable static func += (lhs: inout Set<Element>, rhs: any Sequence<Element>) {\n        lhs.formUnion(rhs)\n    }\n\n    @inlinable static func -= (lhs: inout Set<Element>, rhs: any Sequence<Element>) {\n        lhs.subtract(rhs)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/ThreadGuardedValue.swift",
    "content": "import Common\n\nfinal class ThreadGuardedValue<Value>: Sendable {\n    nonisolated(unsafe) private var _threadGuarded: Value?\n    private let threadToken: AxAppThreadToken = axTaskLocalAppThreadToken ?? dieT(\"axTaskLocalAppThreadToken is not initialized\")\n    init(_ value: Value) { self._threadGuarded = value }\n    var threadGuarded: Value {\n        get {\n            threadToken.checkEquals(axTaskLocalAppThreadToken)\n            return _threadGuarded ?? dieT(\"Value is already destroyed\")\n        }\n        set(newValue) {\n            threadToken.checkEquals(axTaskLocalAppThreadToken)\n            _threadGuarded = newValue\n        }\n    }\n    func destroy() {\n        threadToken.checkEquals(axTaskLocalAppThreadToken)\n        _threadGuarded = nil\n    }\n    deinit {\n        check(_threadGuarded == nil, \"The Value must be explicitly destroyed on the appropriate thread before deinit\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/UniqueToken.swift",
    "content": "final class UniqueToken: Equatable, Hashable, CustomStringConvertible, Sendable {\n    private let hash = Int.random(in: Int.min ... Int.max)\n    static func == (lhs: UniqueToken, rhs: UniqueToken) -> Bool { lhs === rhs }\n    func hash(into hasher: inout Hasher) { hasher.combine(hash) }\n    var description: String { \"UniqueToken(\\(hash))\" }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/accessibility.swift",
    "content": "import AppKit\nimport Common\nimport PrivateApi\n\n@MainActor\nfunc checkAccessibilityPermissions() {\n    let options = [axTrustedCheckOptionPrompt: true]\n    if !AXIsProcessTrustedWithOptions(options as CFDictionary) {\n        resetAccessibility() // Because macOS doesn't reset it for us when the app signature changes...\n        terminateApp()\n    }\n}\n\nprivate func resetAccessibility() {\n    _ = try? Process.run(URL(filePath: \"/usr/bin/tccutil\"), arguments: [\"reset\", \"Accessibility\", aeroSpaceAppId])\n}\n\nprotocol ReadableAttr: Sendable {\n    associatedtype T\n    var getter: @Sendable (AnyObject) -> T? { get }\n    var key: String { get }\n}\n\nprotocol WritableAttr: ReadableAttr, Sendable {\n    var setter: @Sendable (T) -> CFTypeRef? { get }\n}\n\n// Quick reference:\n//\n// // informational attributes\n// kAXRoleAttribute\n// kAXSubroleAttribute\n// kAXRoleDescriptionAttribute\n// kAXTitleAttribute\n// kAXDescriptionAttribute\n// kAXHelpAttribute\n//\n// // hierarchy or relationship attributes\n// kAXParentAttribute\n// kAXChildrenAttribute\n// kAXSelectedChildrenAttribute\n// kAXVisibleChildrenAttribute\n// kAXWindowAttribute\n// kAXTopLevelUIElementAttribute\n// kAXTitleUIElementAttribute\n// kAXServesAsTitleForUIElementsAttribute\n// kAXLinkedUIElementsAttribute\n// kAXSharedFocusElementsAttribute\n//\n// // visual state attributes\n// kAXEnabledAttribute\n// kAXFocusedAttribute\n// kAXPositionAttribute\n// kAXSizeAttribute\n//\n// // value attributes\n// kAXValueAttribute\n// kAXValueDescriptionAttribute\n// kAXMinValueAttribute\n// kAXMaxValueAttribute\n// kAXValueIncrementAttribute\n// kAXValueWrapsAttribute\n// kAXAllowedValuesAttribute\n//\n// // text-specific attributes\n// kAXSelectedTextAttribute\n// kAXSelectedTextRangeAttribute\n// kAXSelectedTextRangesAttribute\n// kAXVisibleCharacterRangeAttribute\n// kAXNumberOfCharactersAttribute\n// kAXSharedTextUIElementsAttribute\n// kAXSharedCharacterRangeAttribute\n//\n// // window, sheet, or drawer-specific attributes\n// kAXMainAttribute\n// kAXMinimizedAttribute\n// kAXCloseButtonAttribute\n// kAXZoomButtonAttribute\n// kAXMinimizeButtonAttribute\n// kAXToolbarButtonAttribute\n// kAXProxyAttribute\n// kAXGrowAreaAttribute\n// kAXModalAttribute\n// kAXDefaultButtonAttribute\n// kAXCancelButtonAttribute\n//\n// // menu or menu item-specific attributes\n// kAXMenuItemCmdCharAttribute\n// kAXMenuItemCmdVirtualKeyAttribute\n// kAXMenuItemCmdGlyphAttribute\n// kAXMenuItemCmdModifiersAttribute\n// kAXMenuItemMarkCharAttribute\n// kAXMenuItemPrimaryUIElementAttribute\n//\n// // application element-specific attributes\n// kAXMenuBarAttribute\n// kAXWindowsAttribute\n// kAXFrontmostAttribute\n// kAXHiddenAttribute\n// kAXMainWindowAttribute\n// kAXFocusedWindowAttribute\n// kAXFocusedUIElementAttribute\n// kAXExtrasMenuBarAttribute\n//\n// // date/time-specific attributes\n// kAXHourFieldAttribute\n// kAXMinuteFieldAttribute\n// kAXSecondFieldAttribute\n// kAXAMPMFieldAttribute\n// kAXDayFieldAttribute\n// kAXMonthFieldAttribute\n// kAXYearFieldAttribute\n//\n// // table, outline, or browser-specific attributes\n// kAXRowsAttribute\n// kAXVisibleRowsAttribute\n// kAXSelectedRowsAttribute\n// kAXColumnsAttribute\n// kAXVisibleColumnsAttribute\n// kAXSelectedColumnsAttribute\n// kAXSortDirectionAttribute\n// kAXColumnHeaderUIElementsAttribute\n// kAXIndexAttribute\n// kAXDisclosingAttribute\n// kAXDisclosedRowsAttribute\n// kAXDisclosedByRowAttribute\n//\n// // matte-specific attributes\n// kAXMatteHoleAttribute\n// kAXMatteContentUIElementAttribute\n//\n// // ruler-specific attributes\n// kAXMarkerUIElementsAttribute\n// kAXUnitsAttribute\n// kAXUnitDescriptionAttribute\n// kAXMarkerTypeAttribute\n// kAXMarkerTypeDescriptionAttribute\n//\n// // miscellaneous or role-specific attributes\n// kAXHorizontalScrollBarAttribute\n// kAXVerticalScrollBarAttribute\n// kAXOrientationAttribute\n// kAXHeaderAttribute\n// kAXEditedAttribute\n// kAXTabsAttribute\n// kAXOverflowButtonAttribute\n// kAXFilenameAttribute\n// kAXExpandedAttribute\n// kAXSelectedAttribute\n// kAXSplittersAttribute\n// kAXContentsAttribute\n// kAXNextContentsAttribute\n// kAXPreviousContentsAttribute\n// kAXDocumentAttribute\n// kAXIncrementorAttribute\n// kAXDecrementButtonAttribute\n// kAXIncrementButtonAttribute\n// kAXColumnTitleAttribute\n// kAXURLAttribute\n// kAXLabelUIElementsAttribute\n// kAXLabelValueAttribute\n// kAXShownMenuUIElementAttribute\n// kAXIsApplicationRunningAttribute\n// kAXFocusedApplicationAttribute\n// kAXElementBusyAttribute\n// kAXAlternateUIVisibleAttribute\nenum Ax {\n    struct ReadableAttrImpl<T>: ReadableAttr {\n        var key: String\n        var getter: @Sendable (AnyObject) -> T?\n    }\n\n    struct WritableAttrImpl<T>: WritableAttr {\n        var key: String\n        var getter: @Sendable (AnyObject) -> T?\n        var setter: @Sendable (T) -> CFTypeRef?\n    }\n\n    static let titleAttr = WritableAttrImpl<String>(\n        key: kAXTitleAttribute,\n        getter: { $0 as? String },\n        setter: { $0 as CFTypeRef },\n    )\n    static let roleAttr = WritableAttrImpl<String>(\n        key: kAXRoleAttribute,\n        getter: { $0 as? String },\n        setter: { $0 as CFTypeRef },\n    )\n    static let subroleAttr = WritableAttrImpl<String>(\n        key: kAXSubroleAttribute,\n        getter: { $0 as? String },\n        setter: { $0 as CFTypeRef },\n    )\n    static let identifierAttr = ReadableAttrImpl<String>(\n        key: kAXIdentifierAttribute,\n        getter: { $0 as? String },\n    )\n    // static let modalAttr = ReadableAttrImpl<Bool>(\n    //     key: kAXModalAttribute,\n    //     getter: { $0 as? Bool },\n    // )\n    static let enabledAttr = ReadableAttrImpl<Bool>(\n        key: kAXEnabledAttribute,\n        getter: { $0 as? Bool },\n    )\n    static let enhancedUserInterfaceAttr = WritableAttrImpl<Bool>(\n        key: \"AXEnhancedUserInterface\",\n        getter: { $0 as? Bool },\n        setter: { $0 as CFTypeRef },\n    )\n    static let minimizedAttr = WritableAttrImpl<Bool>(\n        key: kAXMinimizedAttribute,\n        getter: { $0 as? Bool },\n        setter: { $0 as CFTypeRef },\n    )\n    //static let minimizedAttr = ReadableAttrImpl<Bool>(\n    //    key: kAXMinimizedAttribute,\n    //    getter: { $0 as? Bool }\n    //)\n    static let isFullscreenAttr = WritableAttrImpl<Bool>(\n        key: \"AXFullScreen\",\n        getter: { $0 as? Bool },\n        setter: { $0 as CFTypeRef },\n    )\n    static let isFocused = ReadableAttrImpl<Bool>(\n        key: kAXFocusedAttribute,\n        getter: { $0 as? Bool },\n    )\n    static let isMainAttr = WritableAttrImpl<Bool>(\n        key: kAXMainAttribute,\n        getter: { $0 as? Bool },\n        setter: { $0 as CFTypeRef },\n    )\n    static let sizeAttr = WritableAttrImpl<CGSize>(\n        key: kAXSizeAttribute,\n        getter: {\n            var raw: CGSize = .zero\n            check(AXValueGetValue($0 as! AXValue, .cgSize, &raw))\n            return raw\n        },\n        setter: {\n            var size = $0\n            return AXValueCreate(.cgSize, &size) as CFTypeRef\n        },\n    )\n    static let topLeftCornerAttr = WritableAttrImpl<CGPoint>(\n        key: kAXPositionAttribute,\n        getter: {\n            var raw: CGPoint = .zero\n            AXValueGetValue($0 as! AXValue, .cgPoint, &raw)\n            return raw\n        },\n        setter: {\n            var size = $0\n            return AXValueCreate(.cgPoint, &size) as CFTypeRef\n        },\n    )\n    /// Returns windows visible on all monitors\n    /// If some windows are located on not active macOS Spaces then they won't be returned\n    static let windowsAttr = ReadableAttrImpl<[WindowIdAndAxUiElement]>(\n        key: kAXWindowsAttribute,\n        getter: { ($0 as? NSArray)?.compactMap(windowOrNil).map { ($0.windowId, $0.ax.cast) } ?? [] },\n    )\n    static let focusedWindowAttr = ReadableAttrImpl<WindowIdAndAxUiElementMock>(\n        key: kAXFocusedWindowAttribute,\n        getter: windowOrNil,\n    )\n    //static let mainWindowAttr = ReadableAttrImpl<AXUIElement>(\n    //    key: kAXMainWindowAttribute,\n    //    getter: tryGetWindow\n    //)\n    static let closeButtonAttr = ReadableAttrImpl<any AxUiElementMock>(\n        key: kAXCloseButtonAttribute,\n        getter: castToAxUiElementMock,\n    )\n    // Note! fullscreen is not the same as \"zoom\" (green plus)\n    static let fullscreenButtonAttr = ReadableAttrImpl<any AxUiElementMock>(\n        key: kAXFullScreenButtonAttribute,\n        getter: castToAxUiElementMock,\n    )\n    // green plus\n    static let zoomButtonAttr = ReadableAttrImpl<any AxUiElementMock>(\n        key: kAXZoomButtonAttribute,\n        getter: castToAxUiElementMock,\n    )\n    static let minimizeButtonAttr = ReadableAttrImpl<any AxUiElementMock>(\n        key: kAXMinimizeButtonAttribute,\n        getter: castToAxUiElementMock,\n    )\n    //static let growAreaAttr = ReadableAttrImpl<AXUIElement>(\n    //    key: kAXGrowAreaAttribute,\n    //    getter: { ($0 as! AXUIElement) }\n    //)\n}\n\nlet kAXAeroSynthetic = \"Aero.synthetic\"\n\nprivate func castToAxUiElementMock(_ a: AnyObject) -> AxUiElementMock {\n    if isUnitTest {\n        if let str = a as? String, let commaIndex = str.firstIndex(of: \",\") {\n            let windowId = UInt32.init(String(str.prefix(upTo: commaIndex)).removePrefix(\"AXUIElement(AxWindowId=\"))\n            if let windowId {\n                return castToAxUiElementMock([\n                    \"Aero.axWindowId\": Json.uint32(windowId),\n                    kAXAeroSynthetic: Json.bool(true),\n                ] as AnyObject)\n            }\n        }\n        if let dict = a as? [String: Json] { // Convert from _SwiftDeferredNSDictionary<String, Json>\n            return dict as? AxUiElementMock ?? dieT(\"Cannot cast \\(type(of: a)) to AxUiElementMock\")\n        }\n        die(\"Can't convert \\(a) to AxUiElementMock\")\n    }\n    return a as! AXUIElement\n}\n\ntypealias WindowIdAndAxUiElement = (windowId: UInt32, ax: AXUIElement)\ntypealias WindowIdAndAxUiElementMock = (windowId: UInt32, ax: AxUiElementMock)\n\nprivate func windowOrNil(_ any: Any?) -> WindowIdAndAxUiElementMock? {\n    guard let any else { return nil }\n    let potentialWindow = castToAxUiElementMock(any as AnyObject)\n    // Filter out non-window objects (e.g. Finder's desktop)\n    let windowId = potentialWindow.containingWindowId()\n    if let windowId {\n        return (windowId, potentialWindow)\n    } else {\n        return nil\n    }\n}\n\nextension AXUIElement: AxUiElementMock {\n    func get<Attr: ReadableAttr>(_ attr: Attr) -> Attr.T? {\n        let state = signposter.beginInterval(#function, \"attr: \\(attr.key) axTaskLocalAppThreadToken: \\(axTaskLocalAppThreadToken?.idForDebug)\")\n        defer { signposter.endInterval(#function, state) }\n        var raw: AnyObject?\n        return AXUIElementCopyAttributeValue(self, attr.key as CFString, &raw) == .success\n            ? raw.flatMap(attr.getter)\n            : nil\n    }\n\n    @discardableResult func set<Attr: WritableAttr>(_ attr: Attr, _ value: Attr.T) -> Bool {\n        if serverArgs.isReadOnly { return false }\n        let state = signposter.beginInterval(#function, \"attr: \\(attr.key) axTaskLocalAppThreadToken: \\(axTaskLocalAppThreadToken?.idForDebug)\")\n        defer { signposter.endInterval(#function, state) }\n        guard let value = attr.setter(value) else { return false }\n        return AXUIElementSetAttributeValue(self, attr.key as CFString, value) == .success\n    }\n\n    func containingWindowId() -> CGWindowID? {\n        let state = signposter.beginInterval(#function, \"axTaskLocalAppThreadToken: \\(axTaskLocalAppThreadToken?.idForDebug)\")\n        defer { signposter.endInterval(#function, state) }\n        var cgWindowId = CGWindowID()\n        return _AXUIElementGetWindow(self, &cgWindowId) == .success ? cgWindowId : nil\n    }\n}\n\nextension AXObserver {\n    static func new(_ pid: pid_t, _ handler: AXObserverCallback) -> AXObserver? {\n        var observer: AXObserver? = nil\n        return AXObserverCreate(pid, handler, &observer) == .success ? observer : nil\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/appBundleUtil.swift",
    "content": "import AppKit\nimport Common\nimport Foundation\nimport os\n\nlet signposter = OSSignposter(subsystem: aeroSpaceAppId, category: .pointsOfInterest)\n\nlet myPid = NSRunningApplication.current.processIdentifier\nlet lockScreenAppBundleId = \"com.apple.loginwindow\"\n\nfunc interceptTermination(_ _signal: Int32) {\n    signal(_signal, { signal in\n        check(Thread.current.isMainThread)\n        Task {\n            defer { exit(signal) }\n            try await terminationHandler.beforeTermination()\n        }\n    } as sig_t)\n}\n\n@MainActor\nfunc initTerminationHandler() {\n    terminationHandler = AppServerTerminationHandler()\n}\n\nprivate struct AppServerTerminationHandler: TerminationHandler {\n    func beforeTermination() async throws {\n        try await makeAllWindowsVisibleAndRestoreSize()\n        await toggleReleaseServerIfDebug(.on)\n    }\n}\n\n@MainActor\nprivate func makeAllWindowsVisibleAndRestoreSize() async throws {\n    // Make all windows fullscreen before Quit\n    for (_, window) in MacWindow.allWindowsMap {\n        // makeAllWindowsVisibleAndRestoreSize may be invoked when something went wrong (e.g. some windows are unbound)\n        // that's why it's not allowed to use `.parent` call in here\n        let monitor = try await window.getCenter()?.monitorApproximation ?? mainMonitor\n        let monitorVisibleRect = monitor.visibleRect\n        let windowSize = window.lastFloatingSize ?? CGSize(width: monitorVisibleRect.width, height: monitorVisibleRect.height)\n        let point = CGPoint(\n            x: (monitorVisibleRect.width - windowSize.width) / 2,\n            y: (monitorVisibleRect.height - windowSize.height) / 2,\n        )\n        try await window.setAxFrameBlocking(point, windowSize)\n    }\n}\n\n@MainActor\nfunc terminateApp() -> Never {\n    NSApplication.shared.terminate(nil)\n    die(\"Unreachable code\")\n}\n\nextension String {\n    func copyToClipboard() {\n        let pasteboard = NSPasteboard.general\n        pasteboard.declareTypes([.string], owner: nil)\n        pasteboard.setString(self, forType: .string)\n    }\n}\n\nfunc - (a: CGPoint, b: CGPoint) -> CGPoint {\n    CGPoint(x: a.x - b.x, y: a.y - b.y)\n}\n\nfunc + (a: CGPoint, b: CGPoint) -> CGPoint {\n    CGPoint(x: a.x + b.x, y: a.y + b.y)\n}\n\nextension CGPoint: ConvenienceCopyable {}\n\nextension CGPoint {\n    func distance(toOuterFrame rect: Rect) -> CGFloat {\n        if rect.contains(self) {\n            return 0\n        }\n        let list: [CGFloat] =\n            (rect.minY.until(excl: rect.maxY)?.contains(y) == true ? [abs(rect.minX - x), abs(rect.maxX - x)] : []) +\n            (rect.minX.until(excl: rect.maxX)?.contains(x) == true ? [abs(rect.minY - y), abs(rect.maxY - y)] : []) +\n            [\n                distance(to: rect.topLeftCorner),\n                distance(to: rect.bottomRightCorner),\n                distance(to: rect.topRightCorner),\n                distance(to: rect.bottomLeftCorner),\n            ]\n        return list.minOrDie()\n    }\n\n    func coerce(in rect: Rect) -> CGPoint? {\n        guard let xRange = rect.minX.until(incl: rect.maxX - 1) else { return nil }\n        guard let yRange = rect.minY.until(incl: rect.maxY - 1) else { return nil }\n        return CGPoint(x: x.coerce(in: xRange), y: y.coerce(in: yRange))\n    }\n\n    func addingXOffset(_ offset: CGFloat) -> CGPoint { CGPoint(x: x + offset, y: y) }\n    func addingYOffset(_ offset: CGFloat) -> CGPoint { CGPoint(x: x, y: y + offset) }\n    func addingOffset(_ orientation: Orientation, _ offset: CGFloat) -> CGPoint { orientation == .h ? addingXOffset(offset) : addingYOffset(offset) }\n\n    func getProjection(_ orientation: Orientation) -> Double { orientation == .h ? x : y }\n\n    var vectorLength: CGFloat { sqrt(x * x + y * y) }\n\n    func distance(to point: CGPoint) -> Double { (self - point).vectorLength }\n\n    var monitorApproximation: Monitor { monitors.minByOrDie { distance(toOuterFrame: $0.rect) } }\n}\n\nextension CGFloat {\n    func div(_ denominator: Int) -> CGFloat? {\n        denominator == 0 ? nil : self / CGFloat(denominator)\n    }\n\n    func coerce(in range: ClosedRange<CGFloat>) -> CGFloat {\n        switch true {\n            case self > range.upperBound: range.upperBound\n            case self < range.lowerBound: range.lowerBound\n            default: self\n        }\n    }\n}\n\nextension CGPoint: @retroactive Hashable { // todo migrate to self written Point\n    public func hash(into hasher: inout Hasher) {\n        hasher.combine(x)\n        hasher.combine(y)\n    }\n}\n\n#if DEBUG\n    let isDebug = true\n#else\n    let isDebug = false\n#endif\n\n@inlinable\nfunc checkCancellation() throws(CancellationError) {\n    if Task.isCancelled {\n        throw CancellationError()\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/util/axTrustedCheckOptionPrompt.swift",
    "content": "@preconcurrency import ApplicationServices\n\nlet axTrustedCheckOptionPrompt: String = kAXTrustedCheckOptionPrompt.takeRetainedValue() as String\n"
  },
  {
    "path": "Sources/AppBundle/util/dumpAxRecursive.swift",
    "content": "import AppKit\nimport Common\n\nfunc dumpAxRecursive(_ ax: AXUIElement, _ kind: AxKind, recursionDepth: Int = 0) -> [String: Json] {\n    if recursionDepth > 5 {\n        return [\n            \"dumpAxRecursive infinite recursion\": .bool(true),\n            kAXAeroSynthetic: .bool(true),\n        ]\n    }\n    let recursionDepth = recursionDepth + 1\n    var result: [String: Json] = [:]\n    var ignored: [String] = []\n    var writable: [String] = []\n    var failedAxRequest: [String] = []\n    for key: String in ax.attrs(failedAxRequest: &failedAxRequest) {\n        if globalIgnore.contains(key) || kindSpecificIgnore[kind]?.contains(key) == true {\n            ignored.append(key)\n        } else {\n            var raw: AnyObject?\n            if let status = .some(AXUIElementCopyAttributeValue(ax, key as CFString, &raw)), status != .success {\n                failedAxRequest.append(\"get.\\(key)(\\(status.repr))\")\n            }\n            result[key] = prettyValue(raw as Any?, recursionDepth: recursionDepth)\n\n            var isWritable: DarwinBoolean = false\n            if let status = .some(AXUIElementIsAttributeSettable(ax, key as CFString, &isWritable)), status != .success {\n                failedAxRequest.append(\"isWritable.\\(key)(\\(status.repr))\")\n            }\n            if isWritable.boolValue { writable.append(key) }\n        }\n    }\n    if !writable.isEmpty { result[\"Aero.AxWritable\"] = .string(writable.joined(separator: \", \")) }\n    if !failedAxRequest.isEmpty { result[\"Aero.AxFailed\"] = .string(failedAxRequest.joined(separator: \", \")) }\n    if !ignored.isEmpty { result[\"Aero.AxIgnored\"] = .string(ignored.joined(separator: \", \")) }\n    return result\n}\n\nenum AxKind: Hashable {\n    case button\n    case window\n    case app\n}\n\nprivate func prettyValue(_ value: Any?, recursionDepth: Int) -> Json {\n    if let arr = value as? [Any?] {\n        return .array(arr.map { prettyValue($0, recursionDepth: recursionDepth) })\n    }\n    if let value = value as? Int {\n        return .int(value)\n    }\n    if let value = value as? UInt32 {\n        return .uint32(value)\n    }\n    if let value = value as? Bool {\n        return .bool(value)\n    }\n    if let value {\n        let ax = value as! AXUIElement\n        if ax.get(Ax.roleAttr) == kAXButtonRole {\n            return .dict(dumpAxRecursive(ax, .button, recursionDepth: recursionDepth))\n        }\n        if let windowId = ax.containingWindowId() {\n            let title = ax.get(Ax.titleAttr)?.doubleQuoted ?? \"nil\"\n            let role = ax.get(Ax.roleAttr)?.doubleQuoted ?? \"nil\"\n            let subrole = ax.get(Ax.subroleAttr)?.doubleQuoted ?? \"nil\"\n            return .string(\"AXUIElement(AxWindowId=\\(windowId), title=\\(title), role=\\(role), subrole=\\(subrole))\")\n        }\n        return .string(String(describing: value))\n    }\n    return .null\n}\n\nextension AXUIElement {\n    fileprivate func attrs(failedAxRequest: inout [String]) -> [String] {\n        var rawArray: CFArray?\n        if let status = .some(AXUIElementCopyAttributeNames(self, &rawArray)), status != .success {\n            failedAxRequest.append(\"AXUIElementCopyAttributeNames(\\(status.repr))\")\n        }\n        return rawArray as? [String] ?? []\n    }\n}\n\nprivate let globalIgnore: Set<String> = [\n    \"AXChildren\", // too verbose\n    \"AXChildrenInNavigationOrder\", // too verbose\n    \"AXFocusableAncestor\", // infinite recursion\n    kAXHelpAttribute, // localized - not helpful\n    kAXRoleDescriptionAttribute, // localized - not helpful\n]\n\nprivate let kindSpecificIgnore: [AxKind: Set<String>] = [\n    .button: [\n        \"AXFrame\",\n        kAXEditedAttribute,\n        kAXFocusedAttribute,\n        kAXPositionAttribute,\n        kAXSizeAttribute,\n    ],\n    .app: [\n        \"AXEnhancedUserInterface\",\n        \"AXPreferredLanguage\",\n        kAXHiddenAttribute,\n    ],\n]\n\nextension AXError {\n    fileprivate var repr: String {\n        switch self {\n            case .actionUnsupported: \"actionUnsupported\"\n            case .apiDisabled: \"apiDisabled\"\n            case .attributeUnsupported: \"attributeUnsupported\"\n            case .cannotComplete: \"cannotComplete\"\n            case .failure: \"failure\"\n            case .illegalArgument: \"illegalArgument\"\n            case .invalidUIElement: \"invalidUIElement\"\n            case .invalidUIElementObserver: \"invalidUIElementObserver\"\n            case .noValue: \"noValue\"\n            case .notEnoughPrecision: \"notEnoughPrecision\"\n            case .notImplemented: \"notImplemented\"\n            case .notificationAlreadyRegistered: \"notificationAlreadyRegistered\"\n            case .notificationNotRegistered: \"notificationNotRegistered\"\n            case .notificationUnsupported: \"notificationUnsupported\"\n            case .parameterizedAttributeUnsupported: \"parameterizedAttributeUnsupported\"\n            case .success: \"success\"\n            @unknown default: rawValue.description\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundle/windowLevelCache.swift",
    "content": "import CoreGraphics\nimport Foundation\n\n@MainActor\nprivate var cache: [UInt32: MacOsWindowLevel] = [:]\n\n@MainActor\nfunc getWindowLevel(for windowId: UInt32) -> MacOsWindowLevel? {\n    if let existing = cache[windowId] { return existing }\n\n    var result: [UInt32: MacOsWindowLevel] = [:]\n    let options = CGWindowListOption(arrayLiteral: .excludeDesktopElements, .optionOnScreenOnly)\n    guard let cfArray = CGWindowListCopyWindowInfo(options, CGWindowID(0)) as? [CFDictionary] else { return nil }\n    for elem in cfArray {\n        let dict = elem as NSDictionary\n\n        guard let _windowLayer = dict[kCGWindowLayer] else { continue }\n        let windowLayer = ((_windowLayer as! CFNumber) as NSNumber).intValue\n\n        guard let _windowId = dict[kCGWindowNumber] else { continue }\n        let windowId = ((_windowId as! CFNumber) as NSNumber).uint32Value\n\n        result[windowId] = .new(windowLevel: windowLayer)\n    }\n    cache = result\n    return result[windowId]\n}\n\nenum MacOsWindowLevel: Sendable, Equatable {\n    case normalWindow\n    case alwaysOnTopWindow\n    case unknown(windowLevel: Int)\n\n    static func new(windowLevel: Int) -> MacOsWindowLevel {\n        switch windowLevel {\n            case 0: .normalWindow\n            case 3: .alwaysOnTopWindow\n            default: .unknown(windowLevel: windowLevel)\n        }\n    }\n\n    static func fromJson(_ json: Json) -> MacOsWindowLevel? {\n        switch json {\n            case .string(let str) where str == \"normalWindow\": .normalWindow\n            case .string(let str) where str == \"alwaysOnTopWindow\": .alwaysOnTopWindow\n            case .int(let int): .new(windowLevel: int)\n            default: nil\n        }\n    }\n\n    func toJson() -> Json {\n        switch self {\n            case .normalWindow: .string(\"normalWindow\")\n            case .alwaysOnTopWindow: .string(\"alwaysOnTopWindow\")\n            case .unknown(let layerNumber): .int(layerNumber)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/AxUiElementWindowTypeTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class AxWindowKindTest: XCTestCase {\n    func test() throws {\n        try checkAxDumpsRecursive(projectRoot.appending(path: \"./axDumps\"))\n    }\n}\n\nfunc checkAxDumpsRecursive(_ dir: URL) throws {\n    for file in try FileManager.default.contentsOfDirectory(at: dir, includingPropertiesForKeys: nil) {\n        if file.isDirectory {\n            try checkAxDumpsRecursive(file)\n            continue\n        }\n        if file.pathExtension == \"md\" { continue }\n\n        let rawJson = try JSONSerialization.jsonObject(with: Data.init(contentsOf: file), options: [.json5Allowed]) as! [String: Any]\n        let json = Json.newOrDie(rawJson).asDictOrDie\n        let app = json[\"Aero.AXApp\"]!.asDictOrDie\n        let appBundleId = (rawJson[\"Aero.App.appBundleId\"] as? String).flatMap { KnownBundleId.init(rawValue: $0) }\n        let windowLevel = json[\"Aero.windowLevel\"].map { MacOsWindowLevel.fromJson($0) ?? dieT() }\n        let activationPolicy: NSApplication.ActivationPolicy = .from(string: rawJson[\"Aero.App.nsApp.activationPolicy\"] as! String)\n        assertEquals(\n            json.getWindowType(axApp: app, appBundleId, activationPolicy, windowLevel),\n            AxUiElementWindowType(rawValue: rawJson[\"Aero.AxUiElementWindowType\"] as? String ?? dieT()),\n            additionalMsg: \"\\(file.path()):0:0: AxUiElementWindowType doesn't match\",\n        )\n        assertEquals(\n            json.isDialogHeuristic(appBundleId, windowLevel),\n            rawJson[\"Aero.AxUiElementWindowType_isDialogHeuristic\"] as? Bool ?? dieT(),\n            additionalMsg: \"\\(file.path()):0:0: AxUiElementWindowType_isDialogHeuristic doesn't match\",\n        )\n    }\n}\n\nextension [String: Json]: AxUiElementMock {\n    public func get<Attr>(_ attr: Attr) -> Attr.T? where Attr: ReadableAttr {\n        guard let value = self[attr.key] else {\n            return isSynthetic ? dieT(\"\\(self) doesn't contain \\(attr.key)\") : nil\n        }\n        if let value = value.rawValue {\n            return attr.getter(value as AnyObject)\n                ?? dieT(\"Value \\(value) (of type \\(Swift.type(of: value))) isn't convertible to \\(attr.key)\")\n        } else {\n            return nil\n        }\n    }\n\n    private var isSynthetic: Bool { self[kAXAeroSynthetic] != nil }\n\n    public func containingWindowId() -> CGWindowID? { _containingWindowId() }\n\n    private func _containingWindowId() -> CGWindowID {\n        let windowId = self[\"Aero.axWindowId\"]?.rawValue ?? dieT()\n        if let windowId = windowId as? Int {\n            return UInt32.init(windowId)\n        } else {\n            return windowId as? UInt32 ?? dieT()\n        }\n    }\n}\n\nextension NSApplication.ActivationPolicy {\n    static func from(string: String) -> NSApplication.ActivationPolicy {\n        switch string {\n            case \"regular\": .regular\n            case \"accessory\": .accessory\n            case \"prohibited\": .prohibited\n            default: dieT(\"Unknown ActivationPolicy \\(string)\")\n        }\n    }\n}\n\nextension URL {\n    var isDirectory: Bool {\n        (try? resourceValues(forKeys: [.isDirectoryKey]))?.isDirectory == true\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/assert.swift",
    "content": "// periphery:ignore:all - Those are utils that can become useful any moment\n@testable import AppBundle\nimport Common\nimport XCTest\n\nfunc assertTrue(_ actual: Bool, file: String = #filePath, line: Int = #line) {\n    assertEquals(actual, true, file: file, line: line)\n}\n\n// Because assertEquals default messages are unreadable!\n// periphery:ignore\nfunc assertNotEquals<T>(_ actual: T, _ expected: T, file: String = #filePath, line: Int = #line) where T: Equatable {\n    if actual == expected {\n        failExpectedActual(\"not \\(expected)\", actual, file: file, line: line)\n    }\n}\n\nfunc assertNil(_ actual: Any?, file: String = #filePath, line: Int = #line) {\n    if let actual {\n        failExpectedActual(\"nil\", actual, file: file, line: line)\n    }\n}\n\nfunc assertNotNil(_ actual: Any?, file: String = #filePath, line: Int = #line) {\n    if actual == nil {\n        failExpectedActual(\"not nil\", \"nil\", file: file, line: line)\n    }\n}\n\nfunc assertEquals<T>(_ actual: T, _ expected: T, additionalMsg: String? = nil, file: String = #filePath, line: Int = #line) where T: Equatable {\n    if actual != expected {\n        failExpectedActual(expected, actual, additionalMsg: additionalMsg, file: file, line: line)\n    }\n}\n\n\nfunc assertSucc<T>(_ actual: Result<T, some Any>, file: String = #filePath, line: Int = #line) {\n    switch actual {\n        case .failure: failExpectedActual(\"Result.success\", actual, file: file, line: line)\n        case .success: break\n    }\n}\n\nfunc assertSucc<T>(_ actual: Result<T, some Any>, _ expected: T, file: String = #filePath, line: Int = #line) where T: Equatable {\n    switch actual {\n        case .failure: failExpectedActual(\"Result.success\", actual, file: file, line: line)\n        case .success(let actual): assertEquals(actual, expected, file: file, line: line)\n    }\n}\nfunc assertFail<F>(_ actual: Result<some Any, F>, _ expected: F? = nil, file: String = #filePath, line: Int = #line) where F: Equatable {\n    switch actual {\n        case .success: failExpectedActual(\"Result.failure\", actual, file: file, line: line)\n        case .failure(let actual):\n            if let expected {\n                assertEquals(actual, expected, file: file, line: line)\n            }\n    }\n}\n\nfunc testParseCommandSucc(_ command: String, _ expected: any CmdArgs) {\n    let parsed = parseCommand(command)\n    switch parsed {\n        case .cmd(let command):\n            if !command.args.equals(expected) {\n                failExpectedActual(expected, command.args)\n            }\n        case .help: die() // todo test help\n        case .failure(let msg): XCTFail(msg)\n    }\n}\n\nfunc failExpectedActual(_ expected: Any?, _ actual: Any?, additionalMsg: String? = nil, file: String = #filePath, line: Int = #line) {\n    let additionalMsg = additionalMsg.map { \"\\n    Additional Message:\\n        \\($0)\" } ?? \"\"\n    XCTFail(\n        \"\"\"\n\n        \\(file):\\(line): Assertion failed\\(additionalMsg)\n            Expected:\n                \\(expected.prettyDescription)\n            Actual:\n                \\(actual.prettyDescription)\n        \"\"\",\n    )\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/BalanceSizesCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class BalanceSizesCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testBalanceSizesCommand() async throws {\n        let workspace = Workspace.get(byName: name).apply { wsp in\n            wsp.rootTilingContainer.apply {\n                TestWindow.new(id: 1, parent: $0).setWeight(wsp.rootTilingContainer.orientation, 1)\n                TestWindow.new(id: 2, parent: $0).setWeight(wsp.rootTilingContainer.orientation, 2)\n                TestWindow.new(id: 3, parent: $0).setWeight(wsp.rootTilingContainer.orientation, 3)\n            }\n        }\n\n        try await BalanceSizesCommand(args: BalanceSizesCmdArgs(rawArgs: []))\n            .run(.defaultEnv.copy(\\.workspaceName, name), .emptyStdin)\n\n        for window in workspace.rootTilingContainer.children {\n            assertEquals(window.getWeight(workspace.rootTilingContainer.orientation), 1)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/CloseCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class CloseCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testSimple() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            _ = TestWindow.new(id: 1, parent: $0).focusWindow()\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 1)\n        assertEquals(focus.workspace.rootTilingContainer.children.count, 2)\n\n        try await CloseCommand(args: CloseCmdArgs(rawArgs: [])).run(.defaultEnv, .emptyStdin)\n\n        assertEquals(focus.windowOrNil?.windowId, 2)\n        assertEquals(focus.workspace.rootTilingContainer.children.count, 1)\n    }\n\n    func testCloseViaWindowIdFlag() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            _ = TestWindow.new(id: 1, parent: $0).focusWindow()\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 1)\n        assertEquals(focus.workspace.rootTilingContainer.children.count, 2)\n\n        try await CloseCommand(args: CloseCmdArgs(rawArgs: []).copy(\\.windowId, 2)).run(.defaultEnv, .emptyStdin)\n\n        assertEquals(focus.windowOrNil?.windowId, 1)\n        assertEquals(focus.workspace.rootTilingContainer.children.count, 1)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/ExecCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class ExecCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testParseExecCommand() {\n        testParseCommandSucc(\"exec-and-forget echo 'foo'\", ExecAndForgetCmdArgs(bashScript: \" echo 'foo'\"))\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/FlattenWorkspaceTreeCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class FlattenWorkspaceTreeCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testSimple() async throws {\n        let workspace = Workspace.get(byName: name).apply {\n            $0.rootTilingContainer.apply {\n                TestWindow.new(id: 1, parent: $0)\n                TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1).apply {\n                    TestWindow.new(id: 2, parent: $0)\n                }\n            }\n            TestWindow.new(id: 3, parent: $0) // floating\n        }\n        assertEquals(workspace.focusWorkspace(), true)\n\n        try await FlattenWorkspaceTreeCommand(args: FlattenWorkspaceTreeCmdArgs(rawArgs: [])).run(.defaultEnv, .emptyStdin)\n        workspace.normalizeContainers()\n        assertEquals(workspace.layoutDescription, .workspace([.h_tiles([.window(1), .window(2)]), .window(3)]))\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/FocusCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n// todo write tests\n//\n// test 1\n//     horizontal\n//         window1\n//         vertical\n//             vertical\n//                 window2 <-- focused\n//             vertical\n//                 window5\n//                 horizontal\n//                     window3\n//                     window4\n// pre-condition: focus_wrapping force_workspace\n// action: focus up\n// expected: mru(window3, window4) is focused\n\n@MainActor\nfinal class FocusCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testParse() {\n        XCTAssertTrue(parseCommand(\"focus --boundaries left\").errorOrNil?.contains(\"Possible values\") == true)\n        var expected = FocusCmdArgs(rawArgs: [], cardinalOrDfsDirection: .direction(.left))\n        expected.rawBoundaries = .workspace\n        testParseCommandSucc(\"focus --boundaries workspace left\", expected)\n\n        assertEquals(\n            parseCommand(\"focus --boundaries workspace --boundaries workspace left\").errorOrNil,\n            \"ERROR: Duplicated option '--boundaries'\",\n        )\n        assertEquals(\n            parseCommand(\"focus --window-id 42 --ignore-floating\").errorOrNil,\n            \"--window-id is incompatible with other options\",\n        )\n        assertEquals(\n            parseCommand(\"focus --boundaries all-monitors-outer-frame dfs-next\").errorOrNil,\n            \"(dfs-next|dfs-prev) only supports --boundaries workspace\",\n        )\n\n        assertEquals(\n            parseCommand(\"focus --window-id 42 --wrap-around\").errorOrNil,\n            \"--window-id is incompatible with other options\",\n        )\n        assertEquals(\n            parseCommand(\"focus left --boundaries-action wrap-around-the-workspace --wrap-around\").errorOrNil,\n            \"ERROR: Conflicting options: --boundaries-action, --wrap-around\",\n        )\n    }\n\n    func testFocus() {\n        assertEquals(focus.windowOrNil, nil)\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            assertEquals(TestWindow.new(id: 2, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 3, parent: $0)\n        }\n        assertEquals(focus.windowOrNil?.windowId, 2)\n    }\n\n    func testFocusOverFloatingWindows() async throws {\n        assertEquals(focus.windowOrNil, nil)\n        Workspace.get(byName: name).apply {\n            TestWindow.new(id: 1, parent: $0, rect: Rect(topLeftX: 0, topLeftY: 0, width: 100, height: 100))\n            assertEquals(TestWindow.new(id: 2, parent: $0, rect: Rect(topLeftX: 10, topLeftY: 10, width: 100, height: 100)).focusWindow(), true)\n            TestWindow.new(id: 3, parent: $0, rect: Rect(topLeftX: 20, topLeftY: 20, width: 100, height: 100))\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 2)\n        try await FocusCommand.new(direction: .right).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 3)\n    }\n\n    func testFocusAlongTheContainerOrientation() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 1)\n        try await FocusCommand.new(direction: .right).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n    }\n\n    func testFocusAcrossTheContainerOrientation() async throws {\n        Workspace.get(byName: name).apply {\n            TestWindow.new(id: 1, parent: $0.rootTilingContainer)\n            TestWindow.new(id: 2, parent: $0.rootTilingContainer)\n            assertEquals($0.focusWorkspace(), true)\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 2)\n        try await FocusCommand.new(direction: .up).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n        try await FocusCommand.new(direction: .down).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n    }\n\n    func testFocusNoWrapping() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 1)\n        try await FocusCommand.new(direction: .left).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testFocusWrapping() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 1)\n        var args = FocusCmdArgs(rawArgs: [], cardinalOrDfsDirection: .direction(.left))\n        args.rawBoundaries = .workspace\n        args.rawBoundariesAction = .wrapAroundTheWorkspace\n        try await FocusCommand(args: args).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n    }\n\n    func testFocusFindMruLeaf() async throws {\n        let workspace = Workspace.get(byName: name)\n        var startWindow: Window!\n        var window2: Window!\n        var window3: Window!\n        var unrelatedWindow: Window!\n        workspace.rootTilingContainer.apply {\n            startWindow = TestWindow.new(id: 1, parent: $0)\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1).apply {\n                    window2 = TestWindow.new(id: 2, parent: $0)\n                    unrelatedWindow = TestWindow.new(id: 5, parent: $0)\n                }\n                window3 = TestWindow.new(id: 3, parent: $0)\n            }\n        }\n\n        assertEquals(workspace.mostRecentWindowRecursive?.windowId, 3) // The latest bound\n        _ = startWindow.focusWindow()\n        try await FocusCommand.new(direction: .right).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 3)\n\n        window2.markAsMostRecentChild()\n        _ = startWindow.focusWindow()\n        try await FocusCommand.new(direction: .right).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n\n        window3.markAsMostRecentChild()\n        unrelatedWindow.markAsMostRecentChild()\n        _ = startWindow.focusWindow()\n        try await FocusCommand.new(direction: .right).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n    }\n\n    func testFocusOutsideOfTheContainer() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 2, parent: $0).focusWindow(), true)\n            }\n        }\n\n        try await FocusCommand.new(direction: .left).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testFocusOutsideOfTheContainer2() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 2, parent: $0).focusWindow(), true)\n            }\n        }\n\n        try await FocusCommand.new(direction: .left).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testFocusDfsRelative() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n                TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1).apply {\n                    TestWindow.new(id: 2, parent: $0)\n                    TestWindow.new(id: 3, parent: $0)\n                }\n            }\n            TestWindow.new(id: 4, parent: $0)\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        try await FocusCommand.new(dfsRelative: .dfsNext).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n        try await FocusCommand.new(dfsRelative: .dfsNext).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 3)\n        try await FocusCommand.new(dfsRelative: .dfsNext).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 4)\n\n        try await FocusCommand.new(dfsRelative: .dfsPrev).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 3)\n        try await FocusCommand.new(dfsRelative: .dfsPrev).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n        try await FocusCommand.new(dfsRelative: .dfsPrev).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testFocusDfsRelativeWrapping() async throws {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        var args = FocusCmdArgs(rawArgs: [], cardinalOrDfsDirection: .dfsRelative(.dfsPrev))\n\n        args.rawBoundariesAction = .stop\n        assertEquals(try await FocusCommand(args: args).run(.defaultEnv, .emptyStdin).exitCode, 0)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        args.rawBoundariesAction = .fail\n        assertEquals(try await FocusCommand(args: args).run(.defaultEnv, .emptyStdin).exitCode, 1)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        args.rawBoundariesAction = .wrapAroundTheWorkspace\n        assertEquals(try await FocusCommand(args: args).run(.defaultEnv, .emptyStdin).exitCode, 0)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n\n        args.cardinalOrDfsDirection = .dfsRelative(.dfsNext)\n\n        args.rawBoundariesAction = .stop\n        assertEquals(try await FocusCommand(args: args).run(.defaultEnv, .emptyStdin).exitCode, 0)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n\n        args.rawBoundariesAction = .fail\n        assertEquals(try await FocusCommand(args: args).run(.defaultEnv, .emptyStdin).exitCode, 1)\n        assertEquals(focus.windowOrNil?.windowId, 2)\n\n        args.rawBoundariesAction = .wrapAroundTheWorkspace\n        assertEquals(try await FocusCommand(args: args).run(.defaultEnv, .emptyStdin).exitCode, 0)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n}\n\nextension FocusCommand {\n    static func new(direction: CardinalDirection) -> FocusCommand {\n        FocusCommand(args: FocusCmdArgs(rawArgs: [], cardinalOrDfsDirection: .direction(direction)))\n    }\n    static func new(dfsRelative: DfsNextPrev) -> FocusCommand {\n        FocusCommand(args: FocusCmdArgs(rawArgs: [], cardinalOrDfsDirection: .dfsRelative(dfsRelative)))\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/JoinWithCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class JoinWithCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testMoveIn() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 0, parent: $0)\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        try await JoinWithCommand(args: JoinWithCmdArgs(rawArgs: [], direction: .right)).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([\n            .window(0),\n            .v_tiles([\n                .window(1),\n                .window(2),\n            ]),\n        ]))\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/ListAppsTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class ListAppsTest: XCTestCase {\n    func testParse() {\n        assertNotNil(parseCommand(\"list-apps --macos-native-hidden\").cmdOrNil)\n        assertNotNil(parseCommand(\"list-apps --macos-native-hidden no\").cmdOrNil)\n        assertNotNil(parseCommand(\"list-apps --format %{app-bundle-id}\").cmdOrNil)\n        assertNotNil(parseCommand(\"list-apps --count\").cmdOrNil)\n        assertEquals(parseCommand(\"list-apps --format %{app-bundle-id} --count\").errorOrNil, \"ERROR: Conflicting options: --count, --format\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/ListModesTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class ListModesTest: XCTestCase {\n    func testParseListModesCommand() {\n        testParseCommandSucc(\"list-modes\", ListModesCmdArgs(rawArgs: []))\n        testParseCommandSucc(\"list-modes --current\", ListModesCmdArgs(rawArgs: []).copy(\\.current, true))\n        testParseCommandSucc(\"list-modes --json\", ListModesCmdArgs(rawArgs: []).copy(\\.json, true))\n        testParseCommandSucc(\"list-modes --count\", ListModesCmdArgs(rawArgs: []).copy(\\.outputOnlyCount, true))\n        testParseCommandSucc(\"list-modes --current --json\", ListModesCmdArgs(rawArgs: []).copy(\\.current, true).copy(\\.json, true))\n    }\n\n    func testParseListModesCommandConflicts() {\n        assertEquals(parseCommand(\"list-modes --json --count\").errorOrNil, \"ERROR: Conflicting options: --count, --json\")\n        assertEquals(parseCommand(\"list-modes --current --count\").errorOrNil, \"ERROR: Conflicting options: --count, --current\")\n    }\n\n    @MainActor\n    func testListModesOutput() async throws {\n        config.modes = [\n            \"main\": Mode(bindings: [:]),\n            \"service\": Mode(bindings: [:]),\n            \"resize\": Mode(bindings: [:]),\n        ]\n\n        let defaultResult = try await ListModesCommand(args: ListModesCmdArgs(rawArgs: [])).run(.defaultEnv, .emptyStdin)\n        assertEquals(defaultResult.exitCode, 0)\n        assertEquals(defaultResult.stdout, [\"main\", \"resize\", \"service\"])\n        assertEquals(defaultResult.stderr, [])\n\n        let currentResult = try await ListModesCommand(args: ListModesCmdArgs(rawArgs: []).copy(\\.current, true)).run(.defaultEnv, .emptyStdin)\n        assertEquals(currentResult.exitCode, 0)\n        assertEquals(currentResult.stdout, [\"main\"])\n        assertEquals(currentResult.stderr, [])\n\n        let countResult = try await ListModesCommand(args: ListModesCmdArgs(rawArgs: []).copy(\\.outputOnlyCount, true)).run(.defaultEnv, .emptyStdin)\n        assertEquals(countResult.exitCode, 0)\n        assertEquals(countResult.stdout, [\"3\"])\n        assertEquals(countResult.stderr, [])\n\n        let jsonResult = try await ListModesCommand(args: ListModesCmdArgs(rawArgs: []).copy(\\.json, true)).run(.defaultEnv, .emptyStdin)\n        let expectedJson = JSONEncoder.aeroSpaceDefault.encodeToString([\n            [\"mode-id\": \"main\"],\n            [\"mode-id\": \"resize\"],\n            [\"mode-id\": \"service\"],\n        ])\n        assertEquals(jsonResult.exitCode, 0)\n        assertEquals(jsonResult.stdout, [expectedJson])\n        assertEquals(jsonResult.stderr, [])\n\n        let currentJsonResult = try await ListModesCommand(args: ListModesCmdArgs(rawArgs: []).copy(\\.current, true).copy(\\.json, true)).run(.defaultEnv, .emptyStdin)\n        let expectedCurrentJson = JSONEncoder.aeroSpaceDefault.encodeToString([\n            [\"mode-id\": \"main\"],\n        ])\n        assertEquals(currentJsonResult.exitCode, 0)\n        assertEquals(currentJsonResult.stdout, [expectedCurrentJson])\n        assertEquals(currentJsonResult.stderr, [])\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/ListMonitorsTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class ListMonitorsTest: XCTestCase {\n    func testParseListMonitorsCommand() {\n        testParseCommandSucc(\"list-monitors\", ListMonitorsCmdArgs(rawArgs: []))\n        testParseCommandSucc(\"list-monitors --focused\", ListMonitorsCmdArgs(rawArgs: []).copy(\\.focused, true))\n        testParseCommandSucc(\"list-monitors --count\", ListMonitorsCmdArgs(rawArgs: []).copy(\\.outputOnlyCount, true))\n        assertEquals(parseCommand(\"list-monitors --format %{monitor-id} --count\").errorOrNil, \"ERROR: Conflicting options: --count, --format\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/ListWindowsTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class ListWindowsTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testParse() {\n        assertEquals(parseCommand(\"list-windows --pid 1\").errorOrNil, \"Mandatory option is not specified (--focused|--all|--monitor|--workspace)\")\n        assertNil(parseCommand(\"list-windows --workspace M --pid 1\").errorOrNil)\n        assertEquals(parseCommand(\"list-windows --pid 1 --focused\").errorOrNil, \"--focused conflicts with other \\\"filtering\\\" flags\")\n        assertEquals(parseCommand(\"list-windows --pid 1 --all\").errorOrNil, \"--all conflicts with \\\"filtering\\\" flags. Please use '--monitor all' instead of '--all' alias\")\n        assertNil(parseCommand(\"list-windows --all\").errorOrNil)\n        assertEquals(parseCommand(\"list-windows --all --workspace M\").errorOrNil, \"ERROR: Conflicting options: --all, --workspace\")\n        assertEquals(parseCommand(\"list-windows --all --focused\").errorOrNil, \"ERROR: Conflicting options: --all, --focused\")\n        assertEquals(parseCommand(\"list-windows --all --count --format %{window-title}\").errorOrNil, \"ERROR: Conflicting options: --count, --format\")\n        assertEquals(\n            parseCommand(\"list-windows --all --focused --monitor mouse\").errorOrNil,\n            \"ERROR: Conflicting options: --all, --focused\")\n        assertEquals(\n            parseCommand(\"list-windows --all --focused --monitor mouse --workspace focused\").errorOrNil,\n            \"ERROR: Conflicting options: --all, --focused, --workspace\")\n        assertEquals(\n            parseCommand(\"list-windows --all --workspace focused\").errorOrNil,\n            \"ERROR: Conflicting options: --all, --workspace\")\n        assertNil(parseCommand(\"list-windows --monitor mouse\").errorOrNil)\n\n        // --json\n        assertEquals(parseCommand(\"list-windows --all --count --json\").errorOrNil, \"ERROR: Conflicting options: --count, --json\")\n        assertEquals(parseCommand(\"list-windows --all --format '%{right-padding}' --json\").errorOrNil, \"%{right-padding} interpolation variable is not allowed when --json is used\")\n        assertEquals(parseCommand(\"list-windows --all --format '%{window-title} |' --json\").errorOrNil, \"Only interpolation variables and spaces are allowed in \\'--format\\' when \\'--json\\' is used\")\n        assertNil(parseCommand(\"list-windows --all --format '%{window-title}' --json\").errorOrNil)\n    }\n\n    func testInterpolationVariablesConsistency() {\n        for kind in AeroObjKind.allCases {\n            switch kind {\n                case .window:\n                    assertTrue(FormatVar.WindowFormatVar.allCases.allSatisfy { $0.rawValue.starts(with: \"window-\") })\n                case .app:\n                    assertTrue(FormatVar.AppFormatVar.allCases.allSatisfy { $0.rawValue.starts(with: \"app-\") })\n                case .workspace:\n                    assertTrue(FormatVar.WorkspaceFormatVar.allCases.allSatisfy { $0.rawValue.starts(with: \"workspace\") })\n                case .monitor:\n                    assertTrue(FormatVar.MonitorFormatVar.allCases.allSatisfy { $0.rawValue.starts(with: \"monitor-\") })\n            }\n        }\n    }\n\n    func testFormat() {\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            let windows = [\n                AeroObj.window(window: TestWindow.new(id: 2, parent: $0), title: \"non-empty\"),\n                AeroObj.window(window: TestWindow.new(id: 1, parent: $0), title: \"\"),\n            ]\n            assertEquals(windows.format([.interVar(\"window-title\")]), .success([\"non-empty\", \"\"]))\n        }\n\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            let windows = [\n                AeroObj.window(window: TestWindow.new(id: 2, parent: $0), title: \"non-empty\"),\n                AeroObj.window(window: TestWindow.new(id: 10, parent: $0), title: \"\"),\n            ]\n            assertEquals(windows.format([.interVar(\"window-id\"), .interVar(\"right-padding\"), .interVar(\"window-title\")]), .success([\"2 non-empty\", \"10\"]))\n        }\n\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            let windows = [\n                AeroObj.window(window: TestWindow.new(id: 2, parent: $0), title: \"title1\"),\n                AeroObj.window(window: TestWindow.new(id: 10, parent: $0), title: \"title2\"),\n            ]\n            assertEquals(windows.format([.interVar(\"window-id\"), .interVar(\"right-padding\"), .literal(\" | \"), .interVar(\"window-title\")]), .success([\"2  | title1\", \"10 | title2\"]))\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/ListWorkspacesTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class ListWorkspacesTest: XCTestCase {\n    func testParse() {\n        assertNotNil(parseCommand(\"list-workspaces --all\").cmdOrNil)\n        assertNil(parseCommand(\"list-workspaces --all --visible\").cmdOrNil)\n        assertNil(parseCommand(\"list-workspaces --focused --visible\").cmdOrNil)\n        assertNil(parseCommand(\"list-workspaces --focused --all\").cmdOrNil)\n        assertNil(parseCommand(\"list-workspaces --visible\").cmdOrNil)\n        assertNotNil(parseCommand(\"list-workspaces --visible --monitor 2\").cmdOrNil)\n        assertNotNil(parseCommand(\"list-workspaces --monitor focused\").cmdOrNil)\n        assertNil(parseCommand(\"list-workspaces --focused --monitor 2\").cmdOrNil)\n        assertNotNil(parseCommand(\"list-workspaces --all --format %{workspace}\").cmdOrNil)\n        assertEquals(parseCommand(\"list-workspaces --all --format %{workspace} --count\").errorOrNil, \"ERROR: Conflicting options: --count, --format\")\n        assertEquals(parseCommand(\"list-workspaces --empty\").errorOrNil, \"Mandatory option is not specified (--all|--focused|--monitor)\")\n        assertEquals(parseCommand(\"list-workspaces --all --focused --monitor mouse\").errorOrNil, \"ERROR: Conflicting options: --all, --focused, --monitor\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/MoveCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class MoveCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testMove_swapWindows() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .right)).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([.window(2), .window(1)]))\n    }\n\n    func testMoveInto_findTopMostContainerWithRightOrientation() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 0, parent: $0)\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1).apply {\n                TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1).apply {\n                    TestWindow.new(id: 2, parent: $0)\n                }\n            }\n        }\n\n        try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .right)).run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            root.layoutDescription,\n            .h_tiles([\n                .window(0),\n                .h_tiles([\n                    .window(1),\n                    .h_tiles([\n                        .window(2),\n                    ]),\n                ]),\n            ]),\n        )\n    }\n\n    func testMove_mru() async throws {\n        var window3: Window!\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 0, parent: $0)\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1).apply {\n                    TestWindow.new(id: 2, parent: $0)\n                    window3 = TestWindow.new(id: 3, parent: $0)\n                }\n                TestWindow.new(id: 4, parent: $0)\n            }\n        }\n        window3.markAsMostRecentChild()\n\n        try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .right)).run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            root.layoutDescription,\n            .h_tiles([\n                .window(0),\n                .v_tiles([\n                    .h_tiles([\n                        .window(1),\n                        .window(2),\n                        .window(3),\n                    ]),\n                    .window(4),\n                ]),\n            ]),\n        )\n    }\n\n    func testSwap_preserveWeight() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer\n        let window1 = TestWindow.new(id: 1, parent: root, adaptiveWeight: 1)\n        let window2 = TestWindow.new(id: 2, parent: root, adaptiveWeight: 2)\n        _ = window2.focusWindow()\n\n        try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .left)).run(.defaultEnv, .emptyStdin)\n        assertEquals(window2.hWeight, 2)\n        assertEquals(window1.hWeight, 1)\n    }\n\n    func testMoveIn_newWeight() async throws {\n        var window1: Window!\n        var window2: Window!\n        Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 0, parent: $0, adaptiveWeight: 1)\n            window1 = TestWindow.new(id: 1, parent: $0, adaptiveWeight: 2)\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                window2 = TestWindow.new(id: 2, parent: $0, adaptiveWeight: 1)\n            }\n        }\n        _ = window1.focusWindow()\n\n        try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .right)).run(.defaultEnv, .emptyStdin)\n        assertEquals(window2.hWeight, 1)\n        assertEquals(window2.vWeight, 1)\n        assertEquals(window1.vWeight, 1)\n        assertEquals(window1.hWeight, 1)\n    }\n\n    func testCreateImplicitContainer() async throws {\n        let workspace = Workspace.get(byName: name)\n        workspace.rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            assertEquals(TestWindow.new(id: 2, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        let result = try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .up)).run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            workspace.layoutDescription,\n            .workspace([\n                .v_tiles([\n                    .window(2),\n                    .h_tiles([.window(1), .window(3)]),\n                ]),\n            ]),\n        )\n        assertEquals(result.exitCode, 0)\n    }\n\n    func testStop_onRootNode() async throws {\n        let workspace = Workspace.get(byName: name)\n        workspace.rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        let result = try await parseCommand(\"move --boundaries-action stop left\").cmdOrDie.run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            workspace.layoutDescription,\n            .workspace([\n                .h_tiles([.window(1), .window(2), .window(3)]),\n            ]),\n        )\n        assertEquals(result.exitCode, 0)\n    }\n\n    func testStop_onRootNode_withOppositeOrientation() async throws {\n        let workspace = Workspace.get(byName: name)\n        workspace.rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        let result = try await parseCommand(\"move --boundaries-action stop up\").cmdOrDie.run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            workspace.layoutDescription,\n            .workspace([\n                .h_tiles([.window(1), .window(2), .window(3)]),\n            ]),\n        )\n        assertEquals(result.exitCode, 0)\n    }\n\n    func testStop_onRootNode_whenNoBoundary() async throws {\n        let workspace = Workspace.get(byName: name)\n        workspace.rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            assertEquals(TestWindow.new(id: 2, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        let result = try await parseCommand(\"move --boundaries-action stop left\").cmdOrDie.run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            workspace.layoutDescription,\n            .workspace([\n                .h_tiles([.window(2), .window(1), .window(3)]),\n            ]),\n        )\n        assertEquals(result.exitCode, 0)\n    }\n\n    func testStop_onInnerNode() async throws {\n        let workspace = Workspace.get(byName: name)\n        workspace.rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 2, parent: $0).focusWindow(), true)\n                TestWindow.new(id: 3, parent: $0)\n            }\n        }\n\n        let result = try await parseCommand(\"move --boundaries-action stop right\").cmdOrDie.run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            workspace.layoutDescription,\n            .workspace([\n                .h_tiles([.window(1), .v_tiles([.window(3)]), .window(2)]),\n            ]),\n        )\n        assertEquals(result.exitCode, 0)\n    }\n\n    func testFail() async throws {\n        let workspace = Workspace.get(byName: name)\n        workspace.rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        let result = try await parseCommand(\"move --boundaries-action fail left\").cmdOrDie.run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            workspace.layoutDescription,\n            .workspace([\n                .h_tiles([.window(1), .window(2), .window(3)]),\n            ]),\n        )\n        assertEquals(result.exitCode, 1)\n    }\n\n    func testMoveOut() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 2, parent: $0).focusWindow(), true)\n                TestWindow.new(id: 3, parent: $0)\n                TestWindow.new(id: 4, parent: $0)\n            }\n        }\n\n        try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .left)).run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            root.layoutDescription,\n            .h_tiles([\n                .window(1),\n                .window(2),\n                .v_tiles([\n                    .window(3),\n                    .window(4),\n                ]),\n            ]),\n        )\n    }\n\n    func testMoveOutWithNormalization_right() async throws {\n        config.enableNormalizationFlattenContainers = true\n\n        let workspace = Workspace.get(byName: name).apply {\n            TestWindow.new(id: 1, parent: $0.rootTilingContainer)\n            assertEquals(TestWindow.new(id: 2, parent: $0.rootTilingContainer).focusWindow(), true)\n        }\n\n        try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .right)).run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            workspace.rootTilingContainer.layoutDescription,\n            .h_tiles([\n                .window(1),\n                .window(2),\n            ]),\n        )\n        assertEquals(focus.windowOrNil?.windowId, 2)\n    }\n\n    func testMoveOutWithNormalization_left() async throws {\n        config.enableNormalizationFlattenContainers = true\n\n        let workspace = Workspace.get(byName: name).apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0.rootTilingContainer).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0.rootTilingContainer)\n        }\n\n        try await MoveCommand(args: MoveCmdArgs(rawArgs: [], .left)).run(.defaultEnv, .emptyStdin)\n        assertEquals(\n            workspace.rootTilingContainer.layoutDescription,\n            .h_tiles([\n                .window(1),\n                .window(2),\n            ]),\n        )\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n}\n\nextension TreeNode {\n    var layoutDescription: LayoutDescription {\n        return switch nodeCases {\n            case .window(let window): .window(window.windowId)\n            case .workspace(let workspace): .workspace(workspace.children.map(\\.layoutDescription))\n            case .macosMinimizedWindowsContainer: .macosMinimized\n            case .macosFullscreenWindowsContainer: .macosFullscreen\n            case .macosHiddenAppsWindowsContainer: .macosHiddeAppWindow\n            case .macosPopupWindowsContainer: .macosPopupWindowsContainer\n            case .tilingContainer(let container):\n                switch container.layout {\n                    case .tiles:\n                        container.orientation == .h\n                            ? .h_tiles(container.children.map(\\.layoutDescription))\n                            : .v_tiles(container.children.map(\\.layoutDescription))\n                    case .accordion:\n                        container.orientation == .h\n                            ? .h_accordion(container.children.map(\\.layoutDescription))\n                            : .v_accordion(container.children.map(\\.layoutDescription))\n                }\n        }\n    }\n}\n\nenum LayoutDescription: Equatable {\n    case workspace([LayoutDescription])\n    case h_tiles([LayoutDescription])\n    case v_tiles([LayoutDescription])\n    case h_accordion([LayoutDescription])\n    case v_accordion([LayoutDescription])\n    case window(UInt32)\n    case macosPopupWindowsContainer\n    case macosMinimized\n    case macosHiddeAppWindow\n    case macosFullscreen\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/MoveNodeToMonitorCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class MoveNodeToMonitorCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testParse() {\n        testParseCommandSucc(\"move-node-to-monitor next\", MoveNodeToMonitorCmdArgs(target: .relative(.next)))\n        testParseCommandSucc(\"move-node-to-monitor --fail-if-noop main\", MoveNodeToMonitorCmdArgs(target: .patterns([.main])).copy(\\.failIfNoop, true))\n        assertEquals(parseCommand(\"move-node-to-monitor --fail-if-noop next\").errorOrNil, \"--fail-if-noop is incompatible with (left|down|up|right|next|prev)\")\n        assertEquals(parseCommand(\"move-node-to-monitor --fail-if-noop left\").errorOrNil, \"--fail-if-noop is incompatible with (left|down|up|right|next|prev)\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/MoveNodeToWorkspaceCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class MoveNodeToWorkspaceCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testParse() {\n        testParseCommandSucc(\"move-node-to-workspace next\", MoveNodeToWorkspaceCmdArgs(target: .relative(.next)))\n        assertEquals(parseCommand(\"move-node-to-workspace --fail-if-noop next\").errorOrNil, \"--fail-if-noop is incompatible with (next|prev)\")\n        assertEquals(parseCommand(\"move-node-to-workspace --stdin foo\").errorOrNil, \"--stdin and --no-stdin require using (next|prev) argument\")\n        testParseCommandSucc(\"move-node-to-workspace --stdin next\", MoveNodeToWorkspaceCmdArgs(target: .relative(.next)).copy(\\.explicitStdinFlag, true))\n        testParseCommandSucc(\"move-node-to-workspace --no-stdin next\", MoveNodeToWorkspaceCmdArgs(target: .relative(.next)).copy(\\.explicitStdinFlag, false))\n    }\n\n    func testSimple() async throws {\n        let workspaceA = Workspace.get(byName: \"a\")\n        workspaceA.rootTilingContainer.apply {\n            _ = TestWindow.new(id: 1, parent: $0).focusWindow()\n        }\n\n        try await MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"b\")).run(.defaultEnv, .emptyStdin)\n        XCTAssertTrue(workspaceA.isEffectivelyEmpty)\n        assertEquals((Workspace.get(byName: \"b\").rootTilingContainer.children.singleOrNil() as? Window)?.windowId, 1)\n    }\n\n    func testEmptyWorkspaceSubject() async throws {\n        let workspaceA = Workspace.get(byName: \"a\")\n        workspaceA.rootTilingContainer.apply {\n            _ = TestWindow.new(id: 1, parent: $0).focusWindow()\n        }\n\n        try await MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"b\")).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.workspace.name, \"a\")\n    }\n\n    func testAnotherWindowSubject() async throws {\n        Workspace.get(byName: \"a\").rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            _ = TestWindow.new(id: 2, parent: $0).focusWindow()\n        }\n\n        try await MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"b\")).run(.defaultEnv, .emptyStdin)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testPreserveFloatingLayout() async throws {\n        let workspaceA = Workspace.get(byName: \"a\").apply {\n            _ = TestWindow.new(id: 1, parent: $0).focusWindow()\n        }\n\n        try await MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"b\")).run(.defaultEnv, .emptyStdin)\n        XCTAssertTrue(workspaceA.isEffectivelyEmpty)\n        assertEquals(Workspace.get(byName: \"b\").children.filterIsInstance(of: Window.self).singleOrNil()?.windowId, 1)\n    }\n\n    func testSummonWindow() async throws {\n        let workspaceA = Workspace.get(byName: \"a\").apply {\n            $0.rootTilingContainer.apply {\n                _ = TestWindow.new(id: 1, parent: $0).focusWindow()\n            }\n        }\n        Workspace.get(byName: \"b\").rootTilingContainer.apply {\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        assertEquals(focus.workspace, workspaceA)\n\n        try await MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"a\").copy(\\.windowId, 2))\n            .run(.defaultEnv, .emptyStdin)\n\n        assertEquals(focus.workspace, workspaceA)\n        assertEquals(focus.windowOrNil?.windowId, 1)\n        assertEquals(Workspace.get(byName: \"b\").rootTilingContainer.children.count, 0)\n        assertEquals(workspaceA.rootTilingContainer.children.count, 2)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/ResizeCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class ResizeCommandTest: XCTestCase {\n    func testParseCommand() {\n        testParseCommandSucc(\"resize smart +10\", ResizeCmdArgs(rawArgs: [], dimension: .smart, units: .add(10)))\n        testParseCommandSucc(\"resize smart -10\", ResizeCmdArgs(rawArgs: [], dimension: .smart, units: .subtract(10)))\n        testParseCommandSucc(\"resize smart 10\", ResizeCmdArgs(rawArgs: [], dimension: .smart, units: .set(10)))\n\n        testParseCommandSucc(\"resize smart-opposite +10\", ResizeCmdArgs(rawArgs: [], dimension: .smartOpposite, units: .add(10)))\n        testParseCommandSucc(\"resize smart-opposite -10\", ResizeCmdArgs(rawArgs: [], dimension: .smartOpposite, units: .subtract(10)))\n        testParseCommandSucc(\"resize smart-opposite 10\", ResizeCmdArgs(rawArgs: [], dimension: .smartOpposite, units: .set(10)))\n\n        testParseCommandSucc(\"resize height 10\", ResizeCmdArgs(rawArgs: [], dimension: .height, units: .set(10)))\n        testParseCommandSucc(\"resize width 10\", ResizeCmdArgs(rawArgs: [], dimension: .width, units: .set(10)))\n\n        testParseCommandFail(\"resize s 10\", msg: \"\"\"\n            ERROR: Can't parse 's'.\n                   Possible values: (width|height|smart|smart-opposite)\n            \"\"\")\n        testParseCommandFail(\"resize smart foo\", msg: \"ERROR: <number> argument must be a number\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/SplitCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class SplitCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testSplit() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        try await SplitCommand(args: SplitCmdArgs(rawArgs: [], .vertical)).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([\n            .v_tiles([\n                .window(1),\n            ]),\n            .window(2),\n        ]))\n    }\n\n    func testSplitOppositeOrientation() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        try await SplitCommand(args: SplitCmdArgs(rawArgs: [], .opposite)).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([\n            .v_tiles([\n                .window(1),\n            ]),\n            .window(2),\n        ]))\n    }\n\n    func testChangeOrientation() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            }\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        try await SplitCommand(args: SplitCmdArgs(rawArgs: [], .horizontal)).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([\n            .h_tiles([\n                .window(1),\n            ]),\n            .window(2),\n        ]))\n    }\n\n    func testToggleOrientation() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            }\n            TestWindow.new(id: 2, parent: $0)\n        }\n\n        try await SplitCommand(args: SplitCmdArgs(rawArgs: [], .opposite)).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([\n            .h_tiles([\n                .window(1),\n            ]),\n            .window(2),\n        ]))\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/SubscribeCmdArgsTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class SubscribeCmdArgsTest: XCTestCase {\n    func testParseValidEvents() {\n        let result = parseSubscribeCmdArgs([\"focus-changed\", \"mode-changed\"].slice)\n        switch result {\n            case .cmd(let args):\n                assertEquals(args.events, Set([.focusChanged, .modeChanged]))\n            case .help, .failure:\n                XCTFail(\"Expected success\")\n        }\n    }\n\n    func testParseAllFlag() {\n        let result = parseSubscribeCmdArgs([\"--all\"].slice)\n        switch result {\n            case .cmd(let args):\n                assertEquals(args.events, Set(ServerEventType.allCases))\n            case .help, .failure:\n                XCTFail(\"Expected success\")\n        }\n    }\n\n    func testParseUnknownEvent() {\n        let result = parseSubscribeCmdArgs([\"unknown-event\"].slice)\n        switch result {\n            case .cmd, .help:\n                XCTFail(\"Expected failure\")\n            case .failure(let err):\n                assertEquals(err, \"\"\"\n                    ERROR: Can't parse 'unknown-event'.\n                           Possible values: (focus-changed|focused-monitor-changed|focused-workspace-changed|mode-changed|window-detected|binding-triggered)\n                    \"\"\")\n        }\n    }\n\n    func testParseDuplicateEvent() {\n        let result = parseSubscribeCmdArgs([\"focus-changed\", \"focus-changed\"].slice)\n        switch result {\n            case .cmd, .help:\n                XCTFail(\"Expected failure\")\n            case .failure(let err):\n                assertEquals(err, \"ERROR: Duplicate event 'focus-changed'\")\n        }\n    }\n\n    func testParseNoEvents() {\n        let result = parseSubscribeCmdArgs([String]().slice)\n        switch result {\n            case .cmd, .help:\n                XCTFail(\"Expected failure\")\n            case .failure(let err):\n                assertEquals(err, \"Either --all or at least one <event> must be specified\")\n        }\n    }\n\n    func testParseAllWithEventsConflict() {\n        let result = parseSubscribeCmdArgs([\"--all\", \"focus-changed\"].slice)\n        switch result {\n            case .cmd, .help:\n                XCTFail(\"Expected failure\")\n            case .failure(let err):\n                assertEquals(err, \"--all conflicts with specifying individual events\")\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/SummonWorkspaceCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class SummonWorkspaceCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testParse() {\n        assertEquals(parseCommand(\"summon-workspace\").errorOrNil, \"ERROR: Argument '<workspace>' is mandatory\")\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/SwapCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class SwapCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testSwap_swapWindows_Directional() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n                TestWindow.new(id: 2, parent: $0)\n            }\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        try await SwapCommand(args: SwapCmdArgs(rawArgs: [], target: .direction(.right))).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription,\n                     .h_tiles([.v_tiles([.window(3), .window(2)]),\n                               .window(1)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        try await SwapCommand(args: SwapCmdArgs(rawArgs: [], target: .direction(.left))).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription,\n                     .h_tiles([.v_tiles([.window(1), .window(2)]),\n                               .window(3)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        try await SwapCommand(args: SwapCmdArgs(rawArgs: [], target: .direction(.down))).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription,\n                     .h_tiles([.v_tiles([.window(2), .window(1)]),\n                               .window(3)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        try await SwapCommand(args: SwapCmdArgs(rawArgs: [], target: .direction(.up))).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription,\n                     .h_tiles([.v_tiles([.window(1), .window(2)]),\n                               .window(3)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testSwap_swapWindows_DfsRelative() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n                TestWindow.new(id: 2, parent: $0)\n            }\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        try await SwapCommand(args: SwapCmdArgs(rawArgs: [], target: .dfsRelative(.dfsNext))).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription,\n                     .h_tiles([.v_tiles([.window(2), .window(1)]),\n                               .window(3)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        try await SwapCommand(args: SwapCmdArgs(rawArgs: [], target: .dfsRelative(.dfsNext))).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription,\n                     .h_tiles([.v_tiles([.window(2), .window(3)]),\n                               .window(1)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        try await SwapCommand(args: SwapCmdArgs(rawArgs: [], target: .dfsRelative(.dfsPrev))).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription,\n                     .h_tiles([.v_tiles([.window(2), .window(1)]),\n                               .window(3)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        try await SwapCommand(args: SwapCmdArgs(rawArgs: [], target: .dfsRelative(.dfsPrev))).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription,\n                     .h_tiles([.v_tiles([.window(1), .window(2)]),\n                               .window(3)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testSwap_DirectionalWrapping() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        var args = SwapCmdArgs(rawArgs: [], target: .direction(.left))\n        args.wrapAround = true\n        try await SwapCommand(args: args).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([.window(3), .window(2), .window(1)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        args.target = .initialized(.direction(.right))\n        try await SwapCommand(args: args).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([.window(1), .window(2), .window(3)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testSwap_DfsRelativeWrapping() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            assertEquals(TestWindow.new(id: 1, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 2, parent: $0)\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        var args = SwapCmdArgs(rawArgs: [], target: .dfsRelative(.dfsPrev))\n        args.wrapAround = true\n        try await SwapCommand(args: args).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([.window(3), .window(2), .window(1)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n\n        args.target = .initialized(.dfsRelative(.dfsNext))\n        try await SwapCommand(args: args).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([.window(1), .window(2), .window(3)]))\n        assertEquals(focus.windowOrNil?.windowId, 1)\n    }\n\n    func testSwap_SwapFocus() async throws {\n        let root = Workspace.get(byName: name).rootTilingContainer.apply {\n            TestWindow.new(id: 1, parent: $0)\n            assertEquals(TestWindow.new(id: 2, parent: $0).focusWindow(), true)\n            TestWindow.new(id: 3, parent: $0)\n        }\n\n        var args = SwapCmdArgs(rawArgs: [], target: .direction(.right))\n        args.swapFocus = true\n        try await SwapCommand(args: args).run(.defaultEnv, .emptyStdin)\n        assertEquals(root.layoutDescription, .h_tiles([.window(1), .window(3), .window(2)]))\n        assertEquals(focus.windowOrNil?.windowId, 3)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/command/WorkspaceCommandTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class WorkspaceCommandTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testParseWorkspaceCommand() {\n        testParseCommandFail(\"workspace my mail\", msg: \"ERROR: Unknown argument 'mail'\")\n        testParseCommandFail(\"workspace 'my mail'\", msg: \"ERROR: Whitespace characters are forbidden in workspace names\")\n        assertEquals(parseCommand(\"workspace\").errorOrNil, \"ERROR: Argument '(<workspace-name>|next|prev)' is mandatory\")\n        testParseCommandSucc(\"workspace next\", WorkspaceCmdArgs(target: .relative(.next)))\n        testParseCommandSucc(\"workspace --auto-back-and-forth W\", WorkspaceCmdArgs(target: .direct(.parse(\"W\").getOrDie()), autoBackAndForth: true))\n        assertEquals(parseCommand(\"workspace --wrap-around W\").errorOrNil, \"--wrapAround requires using (next|prev) argument\")\n        assertEquals(parseCommand(\"workspace --auto-back-and-forth next\").errorOrNil, \"--auto-back-and-forth is incompatible with (next|prev)\")\n        testParseCommandSucc(\"workspace next --wrap-around\", WorkspaceCmdArgs(target: .relative(.next), wrapAround: true))\n        assertEquals(parseCommand(\"workspace --stdin foo\").errorOrNil, \"--stdin and --no-stdin require using (next|prev) argument\")\n        testParseCommandSucc(\"workspace --stdin next\", WorkspaceCmdArgs(target: .relative(.next)).copy(\\.explicitStdinFlag, true))\n        testParseCommandSucc(\"workspace --no-stdin next\", WorkspaceCmdArgs(target: .relative(.next)).copy(\\.explicitStdinFlag, false))\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/config/ConfigTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class ConfigTest: XCTestCase {\n    func testParseI3Config() {\n        let toml = try! String(contentsOf: projectRoot.appending(component: \"docs/config-examples/i3-like-config-example.toml\"), encoding: .utf8)\n        let (i3Config, errors) = parseConfig(toml)\n        assertEquals(errors, [])\n        assertEquals(i3Config.execConfig, defaultConfig.execConfig)\n        assertEquals(i3Config.enableNormalizationFlattenContainers, false)\n        assertEquals(i3Config.enableNormalizationOppositeOrientationForNestedContainers, false)\n    }\n\n    func testParseDefaultConfig() {\n        let toml = try! String(contentsOf: projectRoot.appending(component: \"docs/config-examples/default-config.toml\"), encoding: .utf8)\n        let (_, errors) = parseConfig(toml)\n        assertEquals(errors, [])\n    }\n\n    func testConfigVersionOutOfBounds() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            config-version = 0\n            \"\"\",\n        )\n        assertEquals(errors.descriptions, [\"config-version: Must be in [1, 2] range\"])\n    }\n\n    func testExecOnWorkspaceChangeDifferentTypesError() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            exec-on-workspace-change = ['', 1]\n            \"\"\",\n        )\n        assertEquals(errors.descriptions, [\"exec-on-workspace-change[1]: Expected type is \\'string\\'. But actual type is \\'integer\\'\"])\n    }\n\n    func testDuplicatedPersistentWorkspaces() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            config-version = 2\n            persistent-workspaces = ['a', 'a']\n            \"\"\",\n        )\n        assertEquals(errors.descriptions, [\"persistent-workspaces: Contains duplicated workspace names\"])\n    }\n\n    func testPersistentWorkspacesAreAvailableOnlySinceVersion2() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            persistent-workspaces = ['a']\n            \"\"\",\n        )\n        assertEquals(errors.descriptions, [\"persistent-workspaces: This config option is only available since \\'config-version = 2\\'\"])\n    }\n\n    func testQueryCantBeUsedInConfig() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            [mode.main.binding]\n                alt-a = 'list-apps'\n            \"\"\",\n        )\n        XCTAssertTrue(errors.descriptions.singleOrNil()?.contains(\"cannot be used in config\") == true)\n    }\n\n    func testDropBindings() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            mode.main = {}\n            \"\"\",\n        )\n        assertEquals(errors, [])\n        XCTAssertTrue(config.modes[mainModeId]?.bindings.isEmpty == true)\n    }\n\n    func testParseMode() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            [mode.main.binding]\n                alt-h = 'focus left'\n            \"\"\",\n        )\n        assertEquals(errors, [])\n        let binding = HotkeyBinding(.option, .h, [FocusCommand.new(direction: .left)])\n        assertEquals(\n            config.modes[mainModeId],\n            Mode(bindings: [binding.descriptionWithKeyCode: binding]),\n        )\n    }\n\n    func testModesMustContainDefaultModeError() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            [mode.foo.binding]\n                alt-h = 'focus left'\n            \"\"\",\n        )\n        assertEquals(\n            errors.descriptions,\n            [\"mode: Please specify \\'main\\' mode\"],\n        )\n        assertEquals(config.modes[mainModeId], nil)\n    }\n\n    func testHotkeyParseError() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            [mode.main.binding]\n                alt-hh = 'focus left'\n                aalt-j = 'focus down'\n                alt-k = 'focus up'\n            \"\"\",\n        )\n        assertEquals(\n            errors.descriptions,\n            [\n                \"mode.main.binding.aalt-j: Can\\'t parse modifiers in \\'aalt-j\\' binding\",\n                \"mode.main.binding.alt-hh: Can\\'t parse the key in \\'alt-hh\\' binding\",\n            ],\n        )\n        let binding = HotkeyBinding(.option, .k, [FocusCommand.new(direction: .up)])\n        assertEquals(\n            config.modes[mainModeId],\n            Mode(bindings: [binding.descriptionWithKeyCode: binding]),\n        )\n    }\n\n    func testPermanentWorkspaceNames() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            [mode.main.binding]\n                alt-1 = 'workspace 1'\n                alt-2 = 'workspace 2'\n                alt-3 = ['workspace 3']\n                alt-4 = ['workspace 4', 'focus left']\n            \"\"\",\n        )\n        assertEquals(errors.descriptions, [])\n        assertEquals(config.persistentWorkspaces.sorted(), [\"1\", \"2\", \"3\", \"4\"])\n    }\n\n    func testUnknownTopLevelKeyParseError() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            unknownKey = true\n            enable-normalization-flatten-containers = false\n            \"\"\",\n        )\n        assertEquals(\n            errors.descriptions,\n            [\"unknownKey: Unknown top-level key\"],\n        )\n        assertEquals(config.enableNormalizationFlattenContainers, false)\n    }\n\n    func testUnknownKeyParseError() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            enable-normalization-flatten-containers = false\n            [gaps]\n                unknownKey = true\n            \"\"\",\n        )\n        assertEquals(\n            errors.descriptions,\n            [\"gaps.unknownKey: Unknown key\"],\n        )\n        assertEquals(config.enableNormalizationFlattenContainers, false)\n    }\n\n    func testTypeMismatch() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            enable-normalization-flatten-containers = 'true'\n            \"\"\",\n        )\n        assertEquals(\n            errors.descriptions,\n            [\"enable-normalization-flatten-containers: Expected type is \\'bool\\'. But actual type is \\'string\\'\"],\n        )\n    }\n\n    func testTomlParseError() {\n        let (_, errors) = parseConfig(\"true\")\n        assertEquals(\n            errors.descriptions,\n            [\"Error while parsing key-value pair: encountered end-of-file (at line 1, column 5)\"],\n        )\n    }\n\n    func testMoveWorkspaceToMonitorCommandParsing() {\n        XCTAssertTrue(parseCommand(\"move-workspace-to-monitor --wrap-around next\").cmdOrNil is MoveWorkspaceToMonitorCommand)\n        XCTAssertTrue(parseCommand(\"move-workspace-to-display --wrap-around next\").cmdOrNil is MoveWorkspaceToMonitorCommand)\n    }\n\n    func testParseTiles() {\n        let command = parseCommand(\"layout tiles h_tiles v_tiles list h_list v_list\").cmdOrNil\n        XCTAssertTrue(command is LayoutCommand)\n        assertEquals((command as! LayoutCommand).args.toggleBetween.val, [.tiles, .h_tiles, .v_tiles, .tiles, .h_tiles, .v_tiles])\n\n        guard case .help = parseCommand(\"layout tiles -h\") else {\n            XCTFail()\n            return\n        }\n    }\n\n    func testSplitCommandAndFlattenContainersNormalization() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            enable-normalization-flatten-containers = true\n            [mode.main.binding]\n            [mode.foo.binding]\n                alt-s = 'split horizontal'\n            \"\"\",\n        )\n        assertEquals(\n            errors.descriptions,\n            [\"\"\"\n                The config contains:\n                1. usage of 'split' command\n                2. enable-normalization-flatten-containers = true\n                These two settings don't play nicely together. 'split' command has no effect when enable-normalization-flatten-containers is disabled.\n\n                My recommendation: keep the normalizations enabled, and prefer 'join-with' over 'split'.\n                \"\"\"],\n        )\n    }\n\n    func testParseWorkspaceToMonitorAssignment() {\n        let (parsed, errors) = parseConfig(\n            \"\"\"\n            [workspace-to-monitor-force-assignment]\n                workspace_name_1 = 1                            # Sequence number of the monitor (from left to right, 1-based indexing)\n                workspace_name_2 = 'main'                       # main monitor\n                workspace_name_3 = 'secondary'                  # non-main monitor (in case when there are only two monitors)\n                workspace_name_4 = 'built-in'                   # case insensitive regex substring\n                workspace_name_5 = '^built-in retina display$'  # case insensitive regex match\n                workspace_name_6 = ['secondary', 1]             # you can specify multiple patterns. The first matching pattern will be used\n                7 = \"foo\"\n                w7 = ['', 'main']\n                w8 = 0\n                workspace_name_x = '2'                          # Sequence number of the monitor (from left to right, 1-based indexing)\n            \"\"\",\n        )\n        assertEquals(\n            parsed.workspaceToMonitorForceAssignment,\n            [\n                \"workspace_name_1\": [.sequenceNumber(1)],\n                \"workspace_name_2\": [.main],\n                \"workspace_name_3\": [.secondary],\n                \"workspace_name_4\": [.caseSensitivePattern(\"built-in\")!],\n                \"workspace_name_5\": [.caseSensitivePattern(\"^built-in retina display$\")!],\n                \"workspace_name_6\": [.secondary, .sequenceNumber(1)],\n                \"workspace_name_x\": [.sequenceNumber(2)],\n                \"7\": [.caseSensitivePattern(\"foo\")!],\n                \"w7\": [.main],\n                \"w8\": [],\n            ],\n        )\n        assertEquals([\n            \"workspace-to-monitor-force-assignment.w7[0]: Empty string is an illegal monitor description\",\n            \"workspace-to-monitor-force-assignment.w8: Monitor sequence numbers uses 1-based indexing. Values less than 1 are illegal\",\n        ], errors.descriptions)\n        assertEquals([:], defaultConfig.workspaceToMonitorForceAssignment)\n    }\n\n    func testParseOnWindowDetected() {\n        let (parsed, errors) = parseConfig(\n            \"\"\"\n            [[on-window-detected]] # 0\n                check-further-callbacks = true\n                run = ['layout floating', 'move-node-to-workspace W']\n            [[on-window-detected]] # 1\n                if.app-id = 'com.apple.systempreferences'\n                run = []\n            [[on-window-detected]] # 2\n            [[on-window-detected]] # 3\n                run = ['move-node-to-workspace S', 'layout tiling']\n            [[on-window-detected]] # 4\n                run = ['move-node-to-workspace S', 'move-node-to-workspace W']\n            [[on-window-detected]] # 5\n                run = ['move-node-to-workspace S', 'layout h_tiles']\n            \"\"\",\n        )\n        assertEquals(parsed.onWindowDetected, [\n            WindowDetectedCallback( // 0\n                matcher: WindowDetectedCallbackMatcher(\n                    appId: nil,\n                    appNameRegexSubstring: nil,\n                    windowTitleRegexSubstring: nil,\n                ),\n                checkFurtherCallbacks: true,\n                rawRun: [\n                    LayoutCommand(args: LayoutCmdArgs(rawArgs: [], toggleBetween: [.floating])),\n                    MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"W\")),\n                ],\n            ),\n            WindowDetectedCallback( // 1\n                matcher: WindowDetectedCallbackMatcher(\n                    appId: \"com.apple.systempreferences\",\n                    appNameRegexSubstring: nil,\n                    windowTitleRegexSubstring: nil,\n                ),\n                rawRun: [],\n            ),\n            WindowDetectedCallback( // 3\n                rawRun: [\n                    MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"S\")),\n                    LayoutCommand(args: LayoutCmdArgs(rawArgs: [], toggleBetween: [.tiling])),\n                ],\n            ),\n            WindowDetectedCallback( // 4\n                rawRun: [\n                    MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"S\")),\n                    MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"W\")),\n                ],\n            ),\n            WindowDetectedCallback( // 5\n                rawRun: [\n                    MoveNodeToWorkspaceCommand(args: MoveNodeToWorkspaceCmdArgs(workspace: \"S\")),\n                    LayoutCommand(args: LayoutCmdArgs(rawArgs: [], toggleBetween: [.h_tiles])),\n                ],\n            ),\n        ])\n\n        assertEquals(errors.descriptions, [\n            \"on-window-detected[2]: \\'run\\' is mandatory key\",\n        ])\n    }\n\n    func testParseOnWindowDetectedRegex() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            [[on-window-detected]]\n                if.app-name-regex-substring = '^system settings$'\n                run = []\n            \"\"\",\n        )\n        XCTAssertTrue(config.onWindowDetected.singleOrNil()!.matcher.appNameRegexSubstring != nil)\n        assertEquals(errors, [])\n    }\n\n    func testRegex() {\n        var devNull: [String] = []\n        XCTAssertTrue(\"System Settings\".contains(parseCaseInsensitiveRegex(\"settings\").getOrNil(appendErrorTo: &devNull)!))\n        XCTAssertTrue(!\"System Settings\".contains(parseCaseInsensitiveRegex(\"^settings^\").getOrNil(appendErrorTo: &devNull)!))\n    }\n\n    func testParseGaps() {\n        let (config, errors1) = parseConfig(\n            \"\"\"\n            [gaps]\n                inner.horizontal = 10\n                inner.vertical = [{ monitor.\"main\" = 1 }, { monitor.\"secondary\" = 2 }, 5]\n                outer.left = 12\n                outer.bottom = 13\n                outer.top = [{ monitor.\"built-in\" = 3 }, { monitor.\"secondary\" = 4 }, 6]\n                outer.right = [{ monitor.2 = 7 }, 8]\n            \"\"\",\n        )\n        assertEquals(errors1, [])\n        assertEquals(\n            config.gaps,\n            Gaps(\n                inner: .init(\n                    vertical: .perMonitor(\n                        [PerMonitorValue(description: .main, value: 1), PerMonitorValue(description: .secondary, value: 2)],\n                        default: 5,\n                    ),\n                    horizontal: .constant(10),\n                ),\n                outer: .init(\n                    left: .constant(12),\n                    bottom: .constant(13),\n                    top: .perMonitor(\n                        [\n                            PerMonitorValue(description: .caseSensitivePattern(\"built-in\")!, value: 3),\n                            PerMonitorValue(description: .secondary, value: 4),\n                        ],\n                        default: 6,\n                    ),\n                    right: .perMonitor([PerMonitorValue(description: .sequenceNumber(2), value: 7)], default: 8),\n                ),\n            ),\n        )\n\n        let (_, errors2) = parseConfig(\n            \"\"\"\n            [gaps]\n                inner.horizontal = [true]\n                inner.vertical = [{ foo.main = 1 }, { monitor = { foo = 2, bar = 3 } }, 1]\n            \"\"\",\n        )\n        assertEquals(errors2.descriptions, [\n            \"gaps.inner.horizontal: The last item in the array must be of type Int\",\n            \"gaps.inner.vertical[0]: The table is expected to have a single key \\'monitor\\'\",\n            \"gaps.inner.vertical[1].monitor: The table is expected to have a single key\",\n        ])\n    }\n\n    func testParseKeyMapping() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            [key-mapping.key-notation-to-key-code]\n                q = 'q'\n                unicorn = 'u'\n\n            [mode.main.binding]\n                alt-unicorn = 'workspace wonderland'\n            \"\"\",\n        )\n        assertEquals(errors.descriptions, [])\n        assertEquals(config.keyMapping, KeyMapping(preset: .qwerty, rawKeyNotationToKeyCode: [\n            \"q\": .q,\n            \"unicorn\": .u,\n        ]))\n        let binding = HotkeyBinding(.option, .u, [WorkspaceCommand(args: WorkspaceCmdArgs(target: .direct(.parse(\"unicorn\").getOrDie())))])\n        assertEquals(config.modes[mainModeId]?.bindings, [binding.descriptionWithKeyCode: binding])\n\n        let (_, errors1) = parseConfig(\n            \"\"\"\n            [key-mapping.key-notation-to-key-code]\n                q = 'qw'\n                ' f' = 'f'\n            \"\"\",\n        )\n        assertEquals(errors1.descriptions, [\n            \"key-mapping.key-notation-to-key-code: ' f' is invalid key notation\",\n            \"key-mapping.key-notation-to-key-code.q: 'qw' is invalid key code\",\n        ])\n\n        let (dvorakConfig, dvorakErrors) = parseConfig(\n            \"\"\"\n            key-mapping.preset = 'dvorak'\n            \"\"\",\n        )\n        assertEquals(dvorakErrors, [])\n        assertEquals(dvorakConfig.keyMapping, KeyMapping(preset: .dvorak, rawKeyNotationToKeyCode: [:]))\n        assertEquals(dvorakConfig.keyMapping.resolve()[\"quote\"], .q)\n        let (colemakConfig, colemakErrors) = parseConfig(\n            \"\"\"\n            key-mapping.preset = 'colemak'\n            \"\"\",\n        )\n        assertEquals(colemakErrors, [])\n        assertEquals(colemakConfig.keyMapping, KeyMapping(preset: .colemak, rawKeyNotationToKeyCode: [:]))\n        assertEquals(colemakConfig.keyMapping.resolve()[\"f\"], .e)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/config/ParseEnvVariablesTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\n@MainActor\nfinal class ParseEnvVariablesTest: XCTestCase {\n    func testInterpolation() {\n        testSucInterpolation(\"echo ${foo}\", [\"foo\": \"bar\"], expected: \"echo bar\")\n        testSucInterpolation(\"echo $foo\", expected: \"echo $foo\")\n        testSucInterpolation(\"echo $$foo\", expected: \"echo $$foo\")\n        testSucInterpolation(\"echo $${foo}\", [\"foo\": \"bar\"], expected: \"echo $bar\")\n        testSucInterpolation(\"echo $\", expected: \"echo $\")\n\n        testFailInterpolation(\"echo ${foo\")\n        testFailInterpolation(\"echo ${foo{bar}\")\n        testFailInterpolation(\"echo ${foo$bar}\")\n        testFailInterpolation(\"echo ${foo}\")\n    }\n\n    func testInherit() {\n        let (config1, errors1) = parseConfig(\"exec.inherit-env-vars = false\")\n        assertEquals(errors1, [])\n        assertEquals(config1.execConfig.envVariables, [:])\n\n        let (config2, errors2) = parseConfig(\"exec.inherit-env-vars = true\")\n        assertEquals(errors2, [])\n        assertEquals(config2.execConfig.envVariables, testEnv)\n    }\n\n    func testAddVars() {\n        let (config, errors) = parseConfig(\n            \"\"\"\n            [exec.env-vars]\n            FOO = 'BAR'\n            \"\"\",\n        )\n        assertEquals(errors, [])\n        assertEquals(config.execConfig.envVariables, testEnv + [\"FOO\": \"BAR\"])\n    }\n\n    func testCyclicDep() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            [exec.env-vars]\n            FOO = '${BAR}'\n            BAR = '${FOO}'\n            \"\"\",\n        )\n        assertEquals(errors.descriptions, [\n            \"exec.env-vars.BAR: Env variable 'FOO' isn't presented in AeroSpace.app env vars, or not available for interpolation (because it's mutated)\",\n            \"exec.env-vars.FOO: Env variable 'BAR' isn't presented in AeroSpace.app env vars, or not available for interpolation (because it's mutated)\",\n        ])\n    }\n\n    func testForbidPwd() {\n        let (_, errors) = parseConfig(\n            \"\"\"\n            [exec.env-vars]\n            PWD = ''\n            \"\"\",\n        )\n        assertEquals(errors.descriptions, [\"exec.env-vars.PWD: Changing 'PWD' is not allowed\"])\n    }\n}\n\nprivate func testSucInterpolation(_ str: String, _ vars: [String: String] = [:], expected: String) {\n    switch str.interpolate(with: vars) {\n        case .success(let actual): assertEquals(actual, expected)\n        case .failure(let actual): assertEquals(actual, [])\n    }\n}\n\nprivate func testFailInterpolation(_ str: String, _ vars: [String: String] = [:]) {\n    switch str.interpolate(with: vars) {\n        case .success(let actual): failExpectedActual(nil, actual)\n        case .failure: break\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/config/SplitArgsTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class SplitArgsTest: XCTestCase {\n    func testSplit() {\n        testSucSplit(\"echo foo\", expected: [\"echo\", \"foo\"])\n        testSucSplit(\"echo 'foo'\", expected: [\"echo\", \"foo\"])\n        testSucSplit(\"'echo' foo\", expected: [\"echo\", \"foo\"])\n        testSucSplit(\"echo \\\"'\\\"\", expected: [\"echo\", \"'\"])\n        testSucSplit(\"echo '\\\"'\", expected: [\"echo\", \"\\\"\"])\n        testSucSplit(\"  echo '  foo bar'\", expected: [\"echo\", \"  foo bar\"])\n\n        testFailSplit(\"echo 'foo\")\n        testFailSplit(\"echo foo'\")\n    }\n}\n\nprivate func testSucSplit(_ str: String, expected: [String]) {\n    let result = str.splitArgs()\n    switch result {\n        case .success(let actual): assertEquals(actual, expected)\n        case .failure: XCTFail(\"\\(str) split is not successful\")\n    }\n}\n\nprivate func testFailSplit(_ str: String) {\n    let result = str.splitArgs()\n    switch result {\n        case .success: XCTFail(\"\\(str) is expected to fail to split\")\n        case .failure: break\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/model/ClientServerTest.swift",
    "content": "@testable import AppBundle\nimport Common\nimport XCTest\n\nfinal class ClientServerTest: XCTestCase {\n    func testClientRequestJsonV1_decoding() {\n        let data = \"\"\"\n            { \"command\": \"deprecated\", \"args\": [\"foo\", \"bar\"], \"stdin\": \"stdin\" }\n            \"\"\".data(using: .utf8)!\n        let expected = ClientRequest(args: [\"foo\", \"bar\"], stdin: \"stdin\", windowId: nil, workspace: nil)\n            .copy(\\.windowId, nil)\n            .copy(\\.workspace, nil)\n        assertSucc(ClientRequest.decodeJson(data), expected)\n    }\n\n    func testClientRequestJsonV2_decoding() {\n        let data = \"\"\"\n            { \"args\": [\"foo\", \"bar\"], \"stdin\": \"stdin\" }\n            \"\"\".data(using: .utf8)!\n        let expected = ClientRequest(args: [\"foo\", \"bar\"], stdin: \"stdin\", windowId: nil, workspace: nil)\n            .copy(\\.windowId, nil)\n            .copy(\\.workspace, nil)\n        assertSucc(ClientRequest.decodeJson(data), expected)\n    }\n\n    func testClientRequestJsonV3_decoding() {\n        let data = \"\"\"\n            { \"args\": [\"foo\", \"bar\"], \"stdin\": \"stdin\", \"windowId\": null, \"workspace\": null }\n            \"\"\".data(using: .utf8)!\n        let expected = ClientRequest(args: [\"foo\", \"bar\"], stdin: \"stdin\", windowId: nil, workspace: nil)\n        assertSucc(ClientRequest.decodeJson(data), expected)\n    }\n\n    func testClientRequestJsonV3_decoding2() {\n        let data = \"\"\"\n            { \"args\": [\"foo\", \"bar\"], \"stdin\": \"stdin\", \"windowId\": 1, \"workspace\": \"foo\" }\n            \"\"\".data(using: .utf8)!\n        let expected = ClientRequest(args: [\"foo\", \"bar\"], stdin: \"stdin\", windowId: 1, workspace: \"foo\")\n        assertSucc(ClientRequest.decodeJson(data), expected)\n    }\n\n    func testClientRequestJsonV9999_decoding() {\n        let data = \"\"\"\n            { \"args\": [\"foo\", \"bar\"], \"stdin\": \"stdin\", \"yet another future field\": 1 }\n            \"\"\".data(using: .utf8)!\n        assertSucc(ClientRequest.decodeJson(data))\n    }\n\n    func testClientRequestJsonCompatibility_encoding() {\n        let encoder = JSONEncoder()\n        encoder.outputFormatting = [.sortedKeys]\n        let testData = [\n            (ClientRequest(args: [\"args\"], stdin: \"stdin\", windowId: 0, workspace: \"foo\"), \"\"\"\n                {\"args\":[\"args\"],\"stdin\":\"stdin\",\"windowId\":0,\"workspace\":\"foo\"}\n                \"\"\"),\n            (ClientRequest(args: [\"args\"], stdin: \"stdin\", windowId: nil, workspace: nil), \"\"\"\n                {\"args\":[\"args\"],\"stdin\":\"stdin\",\"windowId\":null,\"workspace\":null}\n                \"\"\"),\n        ]\n        for (req, expectedJson) in testData {\n            let data = try! encoder.encode(req)\n            let str = String.init(data: data, encoding: .utf8)!\n            assertEquals(str, expectedJson)\n        }\n    }\n\n    func testServerEventEncoding() {\n        let encoder = JSONEncoder()\n        encoder.outputFormatting = [.sortedKeys]\n        let testData: [(ServerEvent, String)] = [\n            (.focusChanged(windowId: 123, workspace: \"1\"),\n             #\"{\"_event\":\"focus-changed\",\"windowId\":123,\"workspace\":\"1\"}\"#),\n\n            (.focusedMonitorChanged(workspace: \"2\", monitorId_oneBased: 1),\n             #\"{\"_event\":\"focused-monitor-changed\",\"monitorId\":1,\"workspace\":\"2\"}\"#),\n\n            (.workspaceChanged(workspace: \"2\", prevWorkspace: \"1\"),\n             #\"{\"_event\":\"focused-workspace-changed\",\"prevWorkspace\":\"1\",\"workspace\":\"2\"}\"#),\n\n            (.modeChanged(mode: \"resize\"),\n             #\"{\"_event\":\"mode-changed\",\"mode\":\"resize\"}\"#),\n\n            (.windowDetected(windowId: 456, workspace: \"1\", appBundleId: \"com.example\", appName: \"Example\"),\n             #\"{\"_event\":\"window-detected\",\"appBundleId\":\"com.example\",\"appName\":\"Example\",\"windowId\":456,\"workspace\":\"1\"}\"#),\n\n            (.bindingTriggered(mode: \"main\", binding: \"alt-h\"),\n             #\"{\"_event\":\"binding-triggered\",\"binding\":\"alt-h\",\"mode\":\"main\"}\"#),\n        ]\n        for (event, expectedJson) in testData {\n            let data = try! encoder.encode(event)\n            let str = String(data: data, encoding: .utf8)!\n            assertEquals(str, expectedJson)\n        }\n    }\n\n    func testServerEventDecoding() {\n        let testData: [(String, ServerEventType)] = [\n            (#\"{\"_event\":\"focus-changed\",\"windowId\":123,\"workspace\":\"1\",\"monitorId\":1}\"#, .focusChanged),\n            (#\"{\"_event\":\"focused-monitor-changed\",\"workspace\":\"2\",\"monitorId\":1}\"#, .focusedMonitorChanged),\n            (#\"{\"_event\":\"focused-workspace-changed\",\"workspace\":\"2\",\"prevWorkspace\":\"1\"}\"#, .workspaceChanged),\n            (#\"{\"_event\":\"mode-changed\",\"mode\":\"resize\"}\"#, .modeChanged),\n            (#\"{\"_event\":\"window-detected\",\"windowId\":456}\"#, .windowDetected),\n            (#\"{\"_event\":\"binding-triggered\",\"mode\":\"main\",\"binding\":\"alt-h\"}\"#, .bindingTriggered),\n        ]\n        for (json, expectedEventType) in testData {\n            let data = json.data(using: .utf8)!\n            let event = try! JSONDecoder().decode(ServerEvent.self, from: data)\n            assertEquals(event.eventType, expectedEventType)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/shell/ShellTest.swift",
    "content": "// todo do something about ShellTest. They are commented out to reduce test log verbosity\n// @testable import AppBundle\n// import Common\n// import XCTest\n//\n// final class ShellTest: XCTestCase {\n//     let a = cmd(\"a\")\n//     let b = cmd(\"b\")\n//     let c = cmd(\"c\")\n//     let d = cmd(\"d\")\n//     let e = cmd(\"e\")\n//     let f = cmd(\"f\")\n//     let g = cmd(\"g\")\n//     let k = cmd(\"k\")\n//     let backslash = \"\\\\\"\n//     let space = \" \"\n//\n//     func testParse() {\n//         assertSucc(\"echo \\\"foo \\\\\\\" bar \\(backslash)\\(backslash)\\(backslash)\\(backslash)\\\" bar\".parseShell(), cmd(\"echo\", \"foo \\\" bar \\(backslash)\\(backslash)\", \"bar\"))\n//         assertSucc(\"  \\n\".parseShell(), .empty)\n//         assertSucc(\"a | b && c | d\".parseShell(), .and(.pipe(a, b), .pipe(c, d)))\n//         assertSucc(\"foo && bar || a && baz\".parseShell(), .or(.and(cmd(\"foo\"), cmd(\"bar\")), .and(cmd(\"a\"), cmd(\"baz\"))))\n//         assertSucc(\"foo a b; bar duh\\n baz bro\".parseShell(), .seqV(cmd(\"foo\", \"a\", \"b\"), cmd(\"bar\", \"duh\"), cmd(\"baz\", \"bro\")))\n//         assertSucc(\"(a || b) && (c || d)\".parseShell(), .and(.or(a, b), .or(c, d)))\n//         assertSucc(\"\"\"\n//             a # comment 1\n//             b && c # comment 2\n//             d; # comment 3\n//             \"\"\".parseShell(), .seqV(a, .and(b, c), d))\n//         assertEquals(\"\"\"\n//             a && b # comment 1\n//                 # comment 2\n//                 # comment 3\n//                 || c && d\n//             \"\"\".parseShell(), .success(.or(.and(a, b), .and(c, d))))\n//         assertSucc(\"\"\"\n//             a \\(backslash)\\(space)\n//                 b c \\(backslash) # comment 2\n//                 d && e \\(backslash)\n//                 && f\n//             \"\"\".parseShell(), .and(.and(cmd(\"a\", \"b\", \"c\", \"d\"), e), f))\n//         assertSucc(\n//             \"\"\"\n//             echo \"hi \\\\n $(foo bar)\"\n//             \"\"\".parseShell(),\n//             .args([.text(\"echo\"), .concatV(.text(\"hi \\n \"), .interpolation(cmd(\"foo\", \"bar\")))]),\n//         )\n//         assertSucc(\"echo \\\"\\\\n\\\\t\\\\$\\\"\".parseShell(), cmd(\"echo\", \"\\n\\t$\"))\n//         assertSucc(\"echo 'single quoted \\\\n'\".parseShell(), cmd(\"echo\", \"single quoted \\\\n\"))\n//\n//         assertFail(\"echo \\\"\\\\f\\\"\".parseShell(), \"ERROR: ERROR: Unknown ESCAPE_SEQUENCE '\\\\f'\")\n//         assertFail(\"echo <\".parseShell(), \"ERROR: Syntax error at 1:5 extraneous input '<' expecting <EOF>. Please put the character/word in quotes, if you want to use it as an argument\")\n//         assertFail(\"echo `\".parseShell(), \"ERROR: Syntax error at 1:5 extraneous input '`' expecting <EOF>. Please put the character/word in quotes, if you want to use it as an argument\")\n//         assertFail(\"echo \\\"\\\"\\\"\\\"\".parseShell(), \"ERROR: Triple quotes are reserved for future use. Please put spaces in between if you meant separate args\")\n//         assertFail(\"echo do\".parseShell(), \"ERROR: Syntax error at 1:5 extraneous input 'do' expecting <EOF>. DO is a reserved keyword. Please, put quotes around it, if you want to use it as an argument\")\n//         assertFail(\"echo \\\"foo \\(backslash)\\\"\".parseShell(), \"ERROR: Syntax error at 1:12 Unbalanced quotes\")\n//         assertFail(\"a; (b\".parseShell(), \"ERROR: Syntax error at 1:5 Unbalanced parenthesis\")\n//         assertFail(\"a; (b))\".parseShell(), \"ERROR: Syntax error at 1:7 Unbalanced parenthesis\")\n//         assertFail(\"|| foo\".parseShell())\n//         assertFail(\"a && (b || c) foo\".parseShell())\n//     }\n//\n//     func testParseIf() {\n//         assertSucc(\"if a then b else c end\".parseShell(), .ifElse((a, b), elseB: c))\n//         assertSucc(\"\"\"\n//             if a && b then\n//                 c\n//             else\n//                 d\n//             end\n//             \"\"\".parseShell(), .ifElse((.and(a, b), c), elseB: d))\n//         assertSucc(\"\"\"\n//             if a && b then\n//                 c\n//             end\n//             \"\"\".parseShell(), .ifElse((.and(a, b), c), elseB: nil))\n//         assertSucc(\"\"\"\n//             if a && b then\n//                 c\n//             elif d then\n//                 e\n//             elif f then\n//                 g\n//             end\n//             \"\"\".parseShell(), .ifElse((.and(a, b), c), (d, e), (f, g), elseB: nil))\n//         assertSucc(\"\"\"\n//             if a && b then\n//             end\n//             \"\"\".parseShell(), .ifElse((.and(a, b), nil), elseB: nil))\n//         assertSucc(\"\"\"\n//             if a && b then\n//             else\n//                 c\n//             end\n//             \"\"\".parseShell(), .ifElse((.and(a, b), nil), elseB: c))\n//         assertSucc(\"\"\"\n//             echo foo\n//\n//             echo bar;;\n//\n//             if a && b then\n//                 c\n//             elif d then\n//                 e\n//             elif f then\n//                 g\n//                 k\n//             end\n//             \"\"\".parseShell(), .seqV(cmd(\"echo\", \"foo\"), cmd(\"echo\", \"bar\"), .ifElse((.and(a, b), c), (d, e), (f, .seqV(g, k)), elseB: nil)))\n//     }\n// }\n//\n// func cmd(_ args: String...) -> Shell<String> { .args(args.map(ShellString.text)) }\n// extension Shell {\n//     static func seqV(_ seq: Shell<T>...) -> Shell<T> { .seq(seq) }\n// }\n//\n// extension ShellString {\n//     static func concatV(_ fragments: ShellString<T>...) -> ShellString<T> { .concat(fragments) }\n// }\n"
  },
  {
    "path": "Sources/AppBundleTests/testExtensions.swift",
    "content": "@testable import AppBundle\nimport Common\nimport Foundation\nimport TOMLKit\n\nextension [TomlParseError] {\n    var descriptions: [String] { map(\\.description) }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/testUtil.swift",
    "content": "@testable import AppBundle\nimport Common\nimport Foundation\nimport HotKey\nimport XCTest\n\nlet projectRoot: URL = {\n    var url = URL(filePath: #filePath).absoluteURL\n    check(FileManager.default.fileExists(atPath: url.path))\n    while !FileManager.default.fileExists(atPath: url.appending(component: \".git\").path) {\n        url.deleteLastPathComponent()\n    }\n    return url\n}()\n\n@MainActor\nfunc setUpWorkspacesForTests() {\n    config = defaultConfig\n    configUrl = defaultConfigUrl\n    config.enableNormalizationFlattenContainers = false // Make layout tests more predictable\n    config.enableNormalizationOppositeOrientationForNestedContainers = false // Make layout tests more predictable\n    config.defaultRootContainerOrientation = .horizontal // Make default layout predictable\n\n    // Don't create any bindings and workspaces for tests\n    config.modes = [mainModeId: Mode(bindings: [:])]\n    config.persistentWorkspaces = []\n\n    for workspace in Workspace.all {\n        for child in workspace.children {\n            child.unbindFromParent()\n        }\n    }\n    check(Workspace.get(byName: \"setUpWorkspacesForTests\").focusWorkspace())\n    Workspace.garbageCollectUnusedWorkspaces()\n    check(focus.workspace.isEffectivelyEmpty)\n    check(focus.workspace === Workspace.all.singleOrNil(), Workspace.all.map(\\.description).joined(separator: \", \"))\n    check(mainMonitor.setActiveWorkspace(focus.workspace))\n\n    TestApp.shared.focusedWindow = nil\n    TestApp.shared.windows = []\n}\n\nextension ParsedCmd {\n    var errorOrNil: String? {\n        if case .failure(let e) = self {\n            return e\n        } else {\n            return nil\n        }\n    }\n\n    var cmdOrDie: T { cmdOrNil ?? dieT() }\n}\n\nfunc testParseCommandFail(_ command: String, msg expected: String) {\n    let parsed = parseCommand(command)\n    switch parsed {\n        case .cmd(let command): XCTFail(\"\\(command) isn't supposed to be parcelable\")\n        case .failure(let msg): assertEquals(msg, expected)\n        case .help: die() // todo test help\n    }\n}\n\nextension WorkspaceCmdArgs {\n    init(target: WorkspaceTarget, autoBackAndForth: Bool? = nil, wrapAround: Bool? = nil) {\n        self = WorkspaceCmdArgs(rawArgs: [])\n        self.target = .initialized(target)\n        self._autoBackAndForth = autoBackAndForth\n        self._wrapAround = wrapAround\n    }\n}\n\nextension MoveNodeToWorkspaceCmdArgs {\n    init(target: WorkspaceTarget, wrapAround: Bool? = nil) {\n        self = MoveNodeToWorkspaceCmdArgs(rawArgs: [])\n        self.target = .initialized(target)\n        self._wrapAround = wrapAround\n    }\n\n    init(workspace: String) {\n        self = MoveNodeToWorkspaceCmdArgs(rawArgs: [])\n        self.target = .initialized(.direct(.parse(workspace).getOrDie()))\n    }\n}\n\nextension HotkeyBinding {\n    init(_ modifiers: NSEvent.ModifierFlags, _ keyCode: Key, _ commands: [any Command]) {\n        let descriptionWithKeyNotation = modifiers.isEmpty\n            ? keyCode.toString()\n            : modifiers.toString() + \"-\" + keyCode.toString()\n        self.init(modifiers, keyCode, commands, descriptionWithKeyNotation: descriptionWithKeyNotation)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/tree/TestApp.swift",
    "content": "@testable import AppBundle\nimport Common\n\nfinal class TestApp: AbstractApp {\n    let pid: Int32\n    let rawAppBundleId: String?\n    let name: String?\n    let execPath: String? = nil\n    let bundlePath: String? = nil\n    @MainActor\n    static let shared = TestApp()\n\n    private init() {\n        self.pid = 0\n        self.rawAppBundleId = \"bobko.AeroSpace.test-app\"\n        self.name = rawAppBundleId\n    }\n\n    var _windows: [Window] = []\n    var windows: [Window] {\n        get { _windows }\n        set {\n            if let focusedWindow {\n                check(newValue.contains(focusedWindow))\n            }\n            _windows = newValue\n        }\n    }\n\n    private var _focusedWindow: Window? = nil\n    var focusedWindow: Window? {\n        get { _focusedWindow }\n        set {\n            if let window = newValue {\n                check(windows.contains(window))\n            }\n            _focusedWindow = newValue\n        }\n    }\n    @MainActor func getFocusedWindow() -> Window? { _focusedWindow }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/tree/TestWindow.swift",
    "content": "@testable import AppBundle\nimport AppKit\n\nfinal class TestWindow: Window, CustomStringConvertible {\n    private var _rect: Rect?\n\n    @MainActor\n    private init(_ id: UInt32, _ parent: NonLeafTreeNodeObject, _ adaptiveWeight: CGFloat, _ rect: Rect?) {\n        _rect = rect\n        super.init(id: id, TestApp.shared, lastFloatingSize: nil, parent: parent, adaptiveWeight: adaptiveWeight, index: INDEX_BIND_LAST)\n    }\n\n    @discardableResult\n    @MainActor\n    static func new(id: UInt32, parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat = 1, rect: Rect? = nil) -> TestWindow {\n        let wi = TestWindow(id, parent, adaptiveWeight, rect)\n        TestApp.shared._windows.append(wi)\n        return wi\n    }\n\n    nonisolated var description: String { \"TestWindow(\\(windowId))\" }\n\n    @MainActor\n    override func nativeFocus() {\n        appForTests = TestApp.shared\n        TestApp.shared.focusedWindow = self\n    }\n\n    override func closeAxWindow() {\n        unbindFromParent()\n    }\n\n    override var title: String {\n        get async { // redundant async. todo create bug report to Swift\n            description\n        }\n    }\n\n    @MainActor override func getAxRect() async throws -> Rect? { // todo change to not Optional\n        _rect\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/tree/TilingContainer.swift",
    "content": "@testable import AppBundle\nimport AppKit\n\nextension TilingContainer {\n    @MainActor\n    static func newHTiles(parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat) -> TilingContainer {\n        newHTiles(parent: parent, adaptiveWeight: adaptiveWeight, index: INDEX_BIND_LAST)\n    }\n\n    @MainActor\n    static func newVTiles(parent: NonLeafTreeNodeObject, adaptiveWeight: CGFloat) -> TilingContainer {\n        newVTiles(parent: parent, adaptiveWeight: adaptiveWeight, index: INDEX_BIND_LAST)\n    }\n}\n"
  },
  {
    "path": "Sources/AppBundleTests/tree/TreeNodeTest.swift",
    "content": "@testable import AppBundle\nimport XCTest\n\n@MainActor\nfinal class TreeNodeTest: XCTestCase {\n    override func setUp() async throws { setUpWorkspacesForTests() }\n\n    func testChildParentCyclicReferenceMemoryLeak() {\n        let workspace = Workspace.get(byName: name) // Don't cache root node\n        let window = TestWindow.new(id: 1, parent: workspace.rootTilingContainer)\n\n        XCTAssertTrue(window.parent != nil)\n        workspace.rootTilingContainer.unbindFromParent()\n        XCTAssertTrue(window.parent == nil)\n    }\n\n    func testIsEffectivelyEmpty() {\n        let workspace = Workspace.get(byName: name)\n\n        XCTAssertTrue(workspace.isEffectivelyEmpty)\n        weak let window: TestWindow? = .new(id: 1, parent: workspace.rootTilingContainer)\n        XCTAssertNotEqual(window, nil)\n        XCTAssertTrue(!workspace.isEffectivelyEmpty)\n        window!.unbindFromParent()\n        XCTAssertTrue(workspace.isEffectivelyEmpty)\n\n        // Don't save to local variable\n        TestWindow.new(id: 2, parent: workspace.rootTilingContainer)\n        XCTAssertTrue(!workspace.isEffectivelyEmpty)\n    }\n\n    func testNormalizeContainers_dontRemoveRoot() {\n        let workspace = Workspace.get(byName: name)\n        weak let root = workspace.rootTilingContainer\n        func test() {\n            XCTAssertNotEqual(root, nil)\n            XCTAssertTrue(root!.isEffectivelyEmpty)\n            workspace.normalizeContainers()\n            XCTAssertNotEqual(root, nil)\n        }\n        test()\n\n        config.enableNormalizationFlattenContainers = true\n        test()\n    }\n\n    func testNormalizeContainers_singleWindowChild() {\n        config.enableNormalizationFlattenContainers = true\n        let workspace = Workspace.get(byName: name)\n        workspace.rootTilingContainer.apply {\n            TestWindow.new(id: 0, parent: $0)\n            TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1).apply {\n                TestWindow.new(id: 1, parent: $0)\n            }\n        }\n        workspace.normalizeContainers()\n        assertEquals(\n            .h_tiles([.window(0), .window(1)]),\n            workspace.rootTilingContainer.layoutDescription,\n        )\n    }\n\n    func testNormalizeContainers_removeEffectivelyEmpty() {\n        let workspace = Workspace.get(byName: name)\n        workspace.rootTilingContainer.apply {\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                _ = TilingContainer.newHTiles(parent: $0, adaptiveWeight: 1)\n            }\n        }\n        assertEquals(workspace.rootTilingContainer.children.count, 1)\n        workspace.normalizeContainers()\n        assertEquals(workspace.rootTilingContainer.children.count, 0)\n    }\n\n    func testNormalizeContainers_flattenContainers() {\n        let workspace = Workspace.get(byName: name) // Don't cache root node\n        workspace.rootTilingContainer.apply {\n            TilingContainer.newVTiles(parent: $0, adaptiveWeight: 1).apply {\n                TestWindow.new(id: 1, parent: $0, adaptiveWeight: 1)\n            }\n        }\n        workspace.normalizeContainers()\n        XCTAssertTrue(workspace.rootTilingContainer.children.singleOrNil() is TilingContainer)\n\n        config.enableNormalizationFlattenContainers = true\n        workspace.normalizeContainers()\n        XCTAssertTrue(workspace.rootTilingContainer.children.singleOrNil() is TestWindow)\n    }\n}\n"
  },
  {
    "path": "Sources/Cli/_main.swift",
    "content": "import Common\nimport Darwin\nimport Foundation\nimport Network\n\nlet usage =\n    \"\"\"\n    USAGE: \\(CommandLine.arguments.first ?? \"aerospace\") [-h|--help] [-v|--version] <subcommand> [<args>...]\n\n    SUBCOMMANDS:\n    \\(subcommandDescriptions.sortedBy { $0[0] }.toPaddingTable(columnSeparator: \"   \").joined(separator: \"\\n\"))\n    \"\"\"\n\n@main\nstruct Main {\n    static func main() async {\n        let args = CommandLine.arguments.slice(1...) ?? []\n\n        if args.isEmpty {\n            exit(1, err: usage)\n        }\n        if args.first == \"--help\" || args.first == \"-h\" {\n            exit(0, out: usage)\n        }\n\n        if args.first == \"--version\" || args.first == \"-v\" {\n            let connection = NWConnection(to: NWEndpoint.unix(path: socketPath), using: .tcp)\n            let serverVersionAndHash: String?\n            if await connection.startBlocking().error == nil {\n                let ans = await run(connection, [], stdin: \"\", windowId: nil, workspace: nil)\n                serverVersionAndHash = ans.serverVersionAndHash\n            } else {\n                serverVersionAndHash = nil\n            }\n            print(\n                \"\"\"\n                aerospace CLI client version: \\(cliClientVersionAndHash)\n                AeroSpace.app server version: \\(serverVersionAndHash ?? \"Unknown. The server is not running\")\n                \"\"\",\n            )\n            if serverVersionAndHash != nil && cliClientVersionAndHash != serverVersionAndHash {\n                eprint(\n                    \"\"\"\n                    Warning: AeroSpace client/server versions don't match. Possible fixes:\n                      - Restart AeroSpace.app (server restart is required after each update)\n                      - Reinstall and restart AeroSpace (corrupted installation)\n                    \"\"\",\n                )\n            }\n            exit(0)\n        }\n\n        let parsedArgs: any CmdArgs\n        switch parseCmdArgs(args) {\n            case .cmd(let _parsedArgs):\n                parsedArgs = _parsedArgs\n            case .help(let help):\n                exit(0, out: help)\n            case .failure(let e):\n                exit(1, err: e)\n        }\n\n        let connection = NWConnection(to: NWEndpoint.unix(path: socketPath), using: .tcp)\n\n        if let e = await connection.startBlocking().error {\n            exit(1, err: \"Can't connect to AeroSpace server. Is AeroSpace.app running?\\n\\(e.localizedDescription)\")\n        }\n\n        var stdin = \"\"\n        if (parsedArgs is WorkspaceCmdArgs && (parsedArgs as! WorkspaceCmdArgs).target.val.isRelatve\n            || parsedArgs is MoveNodeToWorkspaceCmdArgs && (parsedArgs as! MoveNodeToWorkspaceCmdArgs).target.val.isRelatve)\n            && hasStdin()\n        {\n            if parsedArgs is WorkspaceCmdArgs && (parsedArgs as! WorkspaceCmdArgs).explicitStdinFlag == nil ||\n                parsedArgs is MoveNodeToWorkspaceCmdArgs && (parsedArgs as! MoveNodeToWorkspaceCmdArgs).explicitStdinFlag == nil\n            {\n                exit(\n                    1,\n                    err: \"\"\"\n                        ERROR: Implicit stdin is detected (stdin is not TTY). Implicit stdin was forbidden in AeroSpace v0.20.0.\n                        1. Please supply '--stdin' flag to make stdin explicit and preserve old AeroSpace behavior\n                        2. You can also use '--no-stdin' flag to behave as if no stdin was supplied\n                        Breaking change issue: https://github.com/nikitabobko/AeroSpace/issues/1683\n                        \"\"\",\n                )\n            }\n            var index = 0\n            while let line = readLine(strippingNewline: false) {\n                stdin += line\n                index += 1\n                if index > 1000 {\n                    exit(1, err: \"stdin number of lines limit is exceeded\")\n                }\n            }\n        }\n\n        let windowId = ProcessInfo.processInfo.environment[AEROSPACE_WINDOW_ID].flatMap(UInt32.init)\n        let workspace = ProcessInfo.processInfo.environment[AEROSPACE_WORKSPACE]\n\n        // Handle subscribe command specially\n        if parsedArgs is SubscribeCmdArgs {\n            await runSubscribe(connection, args, windowId: windowId, workspace: workspace)\n            exit(0) // Should not reach here\n        }\n\n        let ans = await run(connection, args, stdin: stdin, windowId: windowId, workspace: workspace)\n\n        if !ans.stdout.isEmpty { print(ans.stdout) }\n        if !ans.stderr.isEmpty { eprint(ans.stderr) }\n        if ans.exitCode != 0 && ans.serverVersionAndHash != cliClientVersionAndHash {\n            eprint(\n                \"\"\"\n                Warning: AeroSpace client/server versions don't match\n                  - aerospace CLI client version: \\(cliClientVersionAndHash)\n                  - AeroSpace.app server version: \\(ans.serverVersionAndHash)\n                  Possible fixes:\n                  - Restart AeroSpace.app (server restart is required after each update)\n                  - Reinstall and restart AeroSpace (corrupted installation)\n                \"\"\",\n            )\n        }\n        exit(ans.exitCode)\n    }\n}\n\nfunc runSubscribe(_ connection: NWConnection, _ args: StrArrSlice, windowId: UInt32?, workspace: String?) async {\n    if let e = await connection.writeAtomic(ClientRequest(args: args.toArray(), stdin: \"\", windowId: windowId, workspace: workspace)).error {\n        exit(1, err: \"Failed to write to server socket: \\(e)\")\n    }\n\n    while true {\n        switch await connection.readNonAtomic() {\n            case .success(let data):\n                if let str = String(data: data, encoding: .utf8) {\n                    print(str)\n                    fflush(stdout)\n                } else {\n                    exit(1, err: \"Can't convert bytes to utf8 String\")\n                }\n            case .failure(let e):\n                exit(1, err: \"runSubscribe error: \\(e)\")\n        }\n    }\n}\n\nfunc run(_ connection: NWConnection, _ args: StrArrSlice, stdin: String, windowId: UInt32?, workspace: String?) async -> ServerAnswer {\n    if let e = await connection.writeAtomic(ClientRequest(args: args.toArray(), stdin: stdin, windowId: windowId, workspace: workspace)).error {\n        exit(1, err: \"Failed to write to server socket: \\(e)\")\n    }\n\n    switch await connection.readNonAtomic() {\n        case .success(let answer):\n            return (try? JSONDecoder().decode(ServerAnswer.self, from: answer)) ?? exitT(1, err: \"Failed to parse server response: \\(String(data: answer, encoding: .utf8).prettyDescription)\")\n        case .failure(let error):\n            exit(1, err: \"Failed to read from server socket: \\(error)\")\n    }\n}\n"
  },
  {
    "path": "Sources/Cli/cliUtil.swift",
    "content": "import Common\nimport Darwin\nimport Foundation\n\nlet cliClientVersionAndHash: String = \"\\(aeroSpaceAppVersion) \\(gitHash)\"\n\nfunc hasStdin() -> Bool {\n    isatty(STDIN_FILENO) != 1\n}\n"
  },
  {
    "path": "Sources/Cli/subcommandDescriptionsGenerated.swift",
    "content": "// FILE IS GENERATED FROM docs/aerospace-*.adoc files\n// TO REGENERATE THE FILE RUN generate.sh\n\nlet subcommandDescriptions = [\n    [\"  balance-sizes\", \"Balance sizes of all windows in the current workspace\"],\n    [\"  close-all-windows-but-current\", \"On the focused workspace, close all windows but current\"],\n    [\"  close\", \"Close the focused window\"],\n    [\"  config\", \"Query AeroSpace config options\"],\n    [\"  debug-windows\", \"Interactive command to record Accessibility API debug information to create bug reports\"],\n    [\"  enable\", \"Temporarily disable window management\"],\n    [\"  flatten-workspace-tree\", \"Flatten the tree of the focused workspace\"],\n    [\"  focus-back-and-forth\", \"Switch between the current and previously focused elements back and forth\"],\n    [\"  focus-monitor\", \"Focus monitor by relative direction, by order, or by pattern\"],\n    [\"  focus\", \"Set focus to a window.\"],\n    [\"  fullscreen\", \"Toggle the fullscreen mode for the focused window\"],\n    [\"  join-with\", \"Put the focused window and the nearest node in the specified direction under a common parent container\"],\n    [\"  layout\", \"Change layout of the focused window to the given layout\"],\n    [\"  list-apps\", \"Print the list of running applications that appears in the Dock and may have a user interface\"],\n    [\"  list-exec-env-vars\", \"List environment variables that exec-* commands and callbacks are run with\"],\n    [\"  list-modes\", \"Print a list of modes currently specified in the configuration\"],\n    [\"  list-monitors\", \"Print monitors that satisfy conditions\"],\n    [\"  list-windows\", \"Print windows that satisfy conditions\"],\n    [\"  list-workspaces\", \"Print workspaces that satisfy conditions\"],\n    [\"  macos-native-fullscreen\", \"Toggle macOS fullscreen for the focused window\"],\n    [\"  macos-native-minimize\", \"Minimize focused window\"],\n    [\"  mode\", \"Activate the specified binding mode\"],\n    [\"  move-mouse\", \"Move mouse to the requested position\"],\n    [\"  move-node-to-monitor\", \"Move window to monitor targeted by relative direction, by order, or by pattern\"],\n    [\"  move-node-to-workspace\", \"Move the focused window to the specified workspace\"],\n    [\"  move-workspace-to-monitor\", \"Move workspace to monitor targeted by relative direction, by order, or by pattern.\"],\n    [\"  move\", \"Move the focused window in the given direction\"],\n    [\"  reload-config\", \"Reload currently active config\"],\n    [\"  resize\", \"Resize the focused window\"],\n    [\"  split\", \"Split focused window\"],\n    [\"  subscribe\", \"Subscribe to AeroSpace events and receive notifications via socket\"],\n    [\"  summon-workspace\", \"Move the requested workspace to the focused monitor.\"],\n    [\"  swap\", \"Swaps the focused window with another window.\"],\n    [\"  trigger-binding\", \"Trigger AeroSpace binding as if it was pressed by user\"],\n    [\"  volume\", \"Manipulate volume\"],\n    [\"  workspace-back-and-forth\", \"Switch between the focused workspace and previously focused workspace back and forth\"],\n    [\"  workspace\", \"Focus the specified workspace\"],\n]\n"
  },
  {
    "path": "Sources/Common/appMetadata.swift",
    "content": "public let stableAeroSpaceAppId: String = \"bobko.aerospace\"\n#if DEBUG\n    public let aeroSpaceAppId: String = \"bobko.aerospace.debug\"\n    public let aeroSpaceAppName: String = \"AeroSpace-Debug\"\n#else\n    public let aeroSpaceAppId: String = stableAeroSpaceAppId\n    public let aeroSpaceAppName: String = \"AeroSpace\"\n#endif\n"
  },
  {
    "path": "Sources/Common/cmdArgs/ArgParser.swift",
    "content": "public typealias SendableWritableKeyPath<Root, Value> = Sendable & WritableKeyPath<Root, Value>\ntypealias ArgParserFun<Input, Value> = @Sendable (Input) -> ParsedCliArgs<Value>\nprotocol ArgParserProtocol<Input, Root, Context>: Sendable {\n    associatedtype Input\n    associatedtype Value\n    associatedtype Root\n    associatedtype Context\n    var context: Context { get }\n    var keyPath: SendableWritableKeyPath<Root, Value> { get }\n    var parse: ArgParserFun<Input, Value> { get }\n}\nstruct ArgParser<Input, Root, Value, Context: Sendable>: ArgParserProtocol {\n    let keyPath: SendableWritableKeyPath<Root, Value>\n    let parse: ArgParserFun<Input, Value>\n    let context: Context\n\n    init(\n        _ keyPath: SendableWritableKeyPath<Root, Value>,\n        _ parse: @escaping ArgParserFun<Input, Value>,\n        context: Context,\n    ) {\n        self.keyPath = keyPath\n        self.parse = parse\n        self.context = context\n    }\n\n    init(\n        _ keyPath: SendableWritableKeyPath<Root, Value>,\n        _ parse: @escaping ArgParserFun<SubArgParserInput, Value>,\n    ) where Context == (), Input == SubArgParserInput {\n        self.init(keyPath, parse, context: ())\n    }\n\n    init(\n        _ keyPath: SendableWritableKeyPath<Root, Value>,\n        _ parse: @escaping ArgParserFun<PosArgParserInput, Value>,\n        argPlaceholderIfMandatory: String? = nil,\n    ) where Context == PosArgParserContext, Input == PosArgParserInput {\n        self.init(keyPath, parse, context: PosArgParserContext(argPlaceholderIfMandatory: argPlaceholderIfMandatory))\n    }\n}\n\ntypealias PosArgParser<Root, Value> = ArgParser<PosArgParserInput, Root, Value, PosArgParserContext>\n\nstruct PosArgParserContext {\n    let argPlaceholderIfMandatory: String?\n}\n\npublic struct ParsedCliArgs<T> {\n    var value: Parsed<T>\n    var advanceBy: Int\n\n    public init(_ value: Parsed<T>, advanceBy: Int) {\n        self.value = value\n        self.advanceBy = advanceBy\n    }\n\n    public static func succ(_ value: T, advanceBy: Int) -> ParsedCliArgs<T> {\n        .init(.success(value), advanceBy: advanceBy)\n    }\n\n    public static func fail(_ msg: String, advanceBy: Int) -> ParsedCliArgs<T> {\n        .init(.failure(msg), advanceBy: advanceBy)\n    }\n\n    public func flatMap<R>(_ mapper: (T) -> ParsedCliArgs<R>) -> ParsedCliArgs<R> {\n        switch value {\n            case .failure(let msg): ParsedCliArgs<R>(.failure(msg), advanceBy: advanceBy)\n            case .success(let value): mapper(value)\n        }\n    }\n\n    public func map<R>(_ mapper: (T) -> R) -> ParsedCliArgs<R> {\n        flatMap { ParsedCliArgs<R>(.success(mapper($0)), advanceBy: advanceBy) }\n    }\n}\n\nfunc newMandatoryPosArgParser<Root, Value>(\n    _ keyPath: SendableWritableKeyPath<Root, Lateinit<Value>>,\n    _ parse: @escaping @Sendable (PosArgParserInput) -> ParsedCliArgs<Value>,\n    placeholder: String,\n) -> PosArgParser<Root, Lateinit<Value>> {\n    let parseWrapper: @Sendable (PosArgParserInput) -> ParsedCliArgs<Lateinit<Value>> = {\n        parse($0).map { .initialized($0) }\n    }\n    return ArgParser(\n        keyPath,\n        parseWrapper,\n        context: PosArgParserContext(argPlaceholderIfMandatory: placeholder),\n    )\n}\n\n// todo reuse in config\npublic func parseEnum<T: RawRepresentable>(_ raw: String, _ _: T.Type) -> Parsed<T> where T.RawValue == String, T: CaseIterable {\n    T(rawValue: raw).orFailure(\"Can't parse '\\(raw)'.\\nPossible values: \\(T.unionLiteral)\")\n}\n\nfunc parseCardinalDirectionArg(i: PosArgParserInput) -> ParsedCliArgs<CardinalDirection> {\n    .init(parseEnum(i.arg, CardinalDirection.self), advanceBy: 1)\n}\n\nfunc parseCardinalOrDfsDirection(i: PosArgParserInput) -> ParsedCliArgs<CardinalOrDfsDirection> {\n    .init(parseEnum(i.arg, CardinalOrDfsDirection.self), advanceBy: 1)\n}\n\nfunc upcastArgParserFun<Input, T>(_ fun: @escaping ArgParserFun<Input, T>) -> ArgParserFun<Input, T?> { { fun($0).map { $0 } } }\n"
  },
  {
    "path": "Sources/Common/cmdArgs/ArgParserInput.swift",
    "content": "struct PosArgParserInput: ArgParserInput {\n    /*conforms*/ let index: Int\n    /*conforms*/ let args: StrArrSlice\n\n    var arg: String { args[index] }\n}\n\nstruct SubArgParserInput: ArgParserInput {\n    let superArg: String\n    /*conforms*/ let index: Int\n    /*conforms*/ let args: StrArrSlice\n\n    var argOrNil: String? { args.getOrNil(atIndex: index) }\n}\n\nprotocol ArgParserInput {\n    var index: Int { get }\n    var args: StrArrSlice { get }\n}\n\nextension ArgParserInput {\n    func getOrNil(relativeIndex i: Int) -> String? { args.getOrNil(atIndex: index + i) }\n\n    func nonFlagArgs() -> ArrSlice<String> {\n        var i = index\n        while args.indices.contains(i) && !args[i].starts(with: \"-\") {\n            i += 1\n        }\n        return args.slice(index ..< i).orDie()\n    }\n\n    func nonFlagArgOrNil() -> String? {\n        args.getOrNil(atIndex: index)?.takeIf { !$0.starts(with: \"-\") }\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/SubArgParser.swift",
    "content": "typealias SubArgParser<Root, Value> = ArgParser<SubArgParserInput, Root, Value, ()>\n\nfunc parseUInt32SubArg(i: SubArgParserInput) -> ParsedCliArgs<UInt32> {\n    if let arg = i.nonFlagArgOrNil() {\n        return .init(UInt32(arg).orFailure(\"Can't parse '\\(arg)'. It must be a positive number\"), advanceBy: 1)\n    } else {\n        return .fail(\"'\\(i.superArg)' must be followed by mandatory UInt32\", advanceBy: 0)\n    }\n}\n\nfunc optionalWindowIdFlag<T: CmdArgs>() -> SubArgParser<T, UInt32?> {\n    ArgParser(\\T.windowId, upcastArgParserFun(parseUInt32SubArg))\n}\nfunc optionalWorkspaceFlag<T: CmdArgs>() -> SubArgParser<T, WorkspaceName?> {\n    ArgParser(\\T.workspaceName, upcastArgParserFun(parseWorkspaceNameSubArg))\n}\n\nfunc trueBoolFlag<T>(_ keyPath: SendableWritableKeyPath<T, Bool>) -> SubArgParser<T, Bool> {\n    ArgParser(keyPath) { _ in .succ(true, advanceBy: 0) }\n}\n\nfunc falseBoolFlag<T>(_ keyPath: SendableWritableKeyPath<T, Bool>) -> SubArgParser<T, Bool> {\n    ArgParser(keyPath) { _ in .succ(false, advanceBy: 0) }\n}\n\nfunc boolFlag<T>(_ keyPath: SendableWritableKeyPath<T, Bool?>) -> SubArgParser<T, Bool?> {\n    ArgParser(keyPath) { input in input.argOrNil == \"no\" ? .succ(false, advanceBy: 1) : .succ(true, advanceBy: 0) }\n}\n\nfunc singleValueSubArgParser<Root, Value>(\n    _ keyPath: SendableWritableKeyPath<Root, Value?>,\n    _ placeholder: String,\n    _ mapper: @escaping @Sendable (String) -> Value?,\n) -> SubArgParser<Root, Value?> {\n    ArgParser(keyPath) { input in\n        if let arg = input.nonFlagArgOrNil() {\n            if let value: Value = mapper(arg) {\n                .succ(value, advanceBy: 1)\n            } else {\n                .fail(\"Failed to convert '\\(arg)' to '\\(Value.self)'\", advanceBy: 1)\n            }\n        } else {\n            .fail(\"'\\(placeholder)' is mandatory\", advanceBy: 0)\n        }\n    }\n}\n\nfunc optionalTrueBoolFlag<T>(_ keyPath: SendableWritableKeyPath<T, Bool?>) -> SubArgParser<T, Bool?> {\n    ArgParser(keyPath) { _ in .succ(true, advanceBy: 0) }\n}\n\nfunc optionalFalseBoolFlag<T>(_ KeyPath: SendableWritableKeyPath<T, Bool?>) -> SubArgParser<T, Bool?> {\n    ArgParser(KeyPath) { _ in .succ(false, advanceBy: 0) }\n}\n\nfunc parseWorkspaceNameSubArg(i: SubArgParserInput) -> ParsedCliArgs<WorkspaceName> {\n    if let arg = i.nonFlagArgOrNil() {\n        .init(WorkspaceName.parse(arg), advanceBy: 1)\n    } else {\n        .fail(\"'\\(i.superArg)' must be followed by mandatory workspace name\", advanceBy: 0)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/cmdArgsManifest.swift",
    "content": "public enum CmdKind: String, CaseIterable, Equatable, Sendable {\n    // Sorted\n\n    case balanceSizes = \"balance-sizes\"\n    case close\n    case closeAllWindowsButCurrent = \"close-all-windows-but-current\"\n    case config\n    case debugWindows = \"debug-windows\"\n    case enable\n    case execAndForget = \"exec-and-forget\"\n    case flattenWorkspaceTree = \"flatten-workspace-tree\"\n    case focus\n    case focusBackAndForth = \"focus-back-and-forth\"\n    case focusMonitor = \"focus-monitor\"\n    case fullscreen\n    case joinWith = \"join-with\"\n    case layout\n    case listApps = \"list-apps\"\n    case listExecEnvVars = \"list-exec-env-vars\"\n    case listModes = \"list-modes\"\n    case listMonitors = \"list-monitors\"\n    case listWindows = \"list-windows\"\n    case listWorkspaces = \"list-workspaces\"\n    case macosNativeFullscreen = \"macos-native-fullscreen\"\n    case macosNativeMinimize = \"macos-native-minimize\"\n    case mode\n    case move = \"move\"\n    case moveMouse = \"move-mouse\"\n    case moveNodeToMonitor = \"move-node-to-monitor\"\n    case moveNodeToWorkspace = \"move-node-to-workspace\"\n    case moveWorkspaceToMonitor = \"move-workspace-to-monitor\"\n    case reloadConfig = \"reload-config\"\n    case resize\n    case split\n    case subscribe\n    case summonWorkspace = \"summon-workspace\"\n    case swap\n    case triggerBinding = \"trigger-binding\"\n    case volume\n    case workspace\n    case workspaceBackAndForth = \"workspace-back-and-forth\"\n}\n\nfunc initSubcommands() -> [String: any SubCommandParserProtocol] {\n    var result: [String: any SubCommandParserProtocol] = [:]\n    for kind in CmdKind.allCases {\n        switch kind {\n            case .balanceSizes:\n                result[kind.rawValue] = SubCommandParser(BalanceSizesCmdArgs.init)\n            case .close:\n                result[kind.rawValue] = SubCommandParser(CloseCmdArgs.init)\n            case .closeAllWindowsButCurrent:\n                result[kind.rawValue] = SubCommandParser(CloseAllWindowsButCurrentCmdArgs.init)\n            case .config:\n                result[kind.rawValue] = SubCommandParser(parseConfigCmdArgs)\n            case .debugWindows:\n                result[kind.rawValue] = SubCommandParser(DebugWindowsCmdArgs.init)\n            case .enable:\n                result[kind.rawValue] = SubCommandParser(parseEnableCmdArgs)\n            case .execAndForget:\n                break // exec-and-forget is parsed separately\n            case .flattenWorkspaceTree:\n                result[kind.rawValue] = SubCommandParser(FlattenWorkspaceTreeCmdArgs.init)\n            case .focus:\n                result[kind.rawValue] = SubCommandParser(parseFocusCmdArgs)\n            case .focusBackAndForth:\n                result[kind.rawValue] = SubCommandParser(FocusBackAndForthCmdArgs.init)\n            case .focusMonitor:\n                result[kind.rawValue] = SubCommandParser(parseFocusMonitorCmdArgs)\n            case .fullscreen:\n                result[kind.rawValue] = SubCommandParser(parseFullscreenCmdArgs)\n            case .joinWith:\n                result[kind.rawValue] = SubCommandParser(JoinWithCmdArgs.init)\n            case .layout:\n                result[kind.rawValue] = SubCommandParser(parseLayoutCmdArgs)\n            case .listApps:\n                result[kind.rawValue] = SubCommandParser(parseListAppsCmdArgs)\n            case .listExecEnvVars:\n                result[kind.rawValue] = SubCommandParser(ListExecEnvVarsCmdArgs.init)\n            case .listModes:\n                result[kind.rawValue] = SubCommandParser(parseListModesCmdArgs)\n            case .listMonitors:\n                result[kind.rawValue] = SubCommandParser(parseListMonitorsCmdArgs)\n            case .listWindows:\n                result[kind.rawValue] = SubCommandParser(parseListWindowsCmdArgs)\n            case .listWorkspaces:\n                result[kind.rawValue] = SubCommandParser(parseListWorkspacesCmdArgs)\n            case .macosNativeFullscreen:\n                result[kind.rawValue] = SubCommandParser(parseMacosNativeFullscreenCmdArgs)\n            case .macosNativeMinimize:\n                result[kind.rawValue] = SubCommandParser(MacosNativeMinimizeCmdArgs.init)\n            case .mode:\n                result[kind.rawValue] = SubCommandParser(ModeCmdArgs.init)\n            case .move:\n                result[kind.rawValue] = SubCommandParser(parseMoveCmdArgs)\n                // deprecated\n                result[\"move-through\"] = SubCommandParser(parseMoveCmdArgs)\n            case .moveMouse:\n                result[kind.rawValue] = SubCommandParser(parseMoveMouseCmdArgs)\n            case .moveNodeToMonitor:\n                result[kind.rawValue] = SubCommandParser(parseMoveNodeToMonitorCmdArgs)\n            case .moveNodeToWorkspace:\n                result[kind.rawValue] = SubCommandParser(parseMoveNodeToWorkspaceCmdArgs)\n            case .moveWorkspaceToMonitor:\n                result[kind.rawValue] = SubCommandParser(parseWorkspaceToMonitorCmdArgs)\n                // deprecated\n                result[\"move-workspace-to-display\"] = SubCommandParser(MoveWorkspaceToMonitorCmdArgs.init)\n            case .reloadConfig:\n                result[kind.rawValue] = SubCommandParser(ReloadConfigCmdArgs.init)\n            case .resize:\n                result[kind.rawValue] = SubCommandParser(parseResizeCmdArgs)\n            case .split:\n                result[kind.rawValue] = SubCommandParser(parseSplitCmdArgs)\n            case .subscribe:\n                result[kind.rawValue] = SubCommandParser(parseSubscribeCmdArgs)\n            case .summonWorkspace:\n                result[kind.rawValue] = SubCommandParser(SummonWorkspaceCmdArgs.init)\n            case .swap:\n                result[kind.rawValue] = SubCommandParser(parseSwapCmdArgs)\n            case .triggerBinding:\n                result[kind.rawValue] = SubCommandParser(parseTriggerBindingCmdArgs)\n            case .volume:\n                result[kind.rawValue] = SubCommandParser(VolumeCmdArgs.init)\n            case .workspace:\n                result[kind.rawValue] = SubCommandParser(parseWorkspaceCmdArgs)\n            case .workspaceBackAndForth:\n                result[kind.rawValue] = SubCommandParser(WorkspaceBackAndForthCmdArgs.init)\n        }\n    }\n    return result\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/BalanceSizesCmdArgs.swift",
    "content": "public struct BalanceSizesCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .balanceSizes,\n        allowInConfig: true,\n        help: balance_sizes_help_generated,\n        flags: [\n            \"--workspace\": optionalWorkspaceFlag(),\n        ],\n        posArgs: [],\n    )\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/CloseAllWindowsButCurrentCmdArgs.swift",
    "content": "public struct CloseAllWindowsButCurrentCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .closeAllWindowsButCurrent,\n        allowInConfig: true,\n        help: close_all_windows_but_current_help_generated,\n        flags: [\n            \"--quit-if-last-window\": trueBoolFlag(\\.closeArgs.quitIfLastWindow),\n        ],\n        posArgs: [],\n    )\n\n    public var closeArgs = CloseCmdArgs(rawArgs: [])\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/CloseCmdArgs.swift",
    "content": "public struct CloseCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .close,\n        allowInConfig: true,\n        help: close_help_generated,\n        flags: [\n            \"--quit-if-last-window\": trueBoolFlag(\\.quitIfLastWindow),\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [],\n    )\n\n    public var quitIfLastWindow: Bool = false\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ConfigCmdArgs.swift",
    "content": "public struct ConfigCmdArgs: CmdArgs, Equatable {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public static let parser: CmdParser<Self> = .init(\n        kind: .config,\n        allowInConfig: false,\n        help: config_help_generated,\n        flags: [\n            \"--json\": trueBoolFlag(\\.json),\n            \"--keys\": trueBoolFlag(\\.keys),\n            \"--major-keys\": trueBoolFlag(\\.majorKeys),\n            \"--all-keys\": trueBoolFlag(\\.allKeys),\n            \"--config-path\": trueBoolFlag(\\.configPath),\n            \"--get\": singleValueSubArgParser(\\.keyNameToGet, \"<name>\") { $0 },\n        ],\n        posArgs: [],\n    )\n\n    public var json: Bool = false\n    public var majorKeys: Bool = false\n    public var keys: Bool = false\n    public var allKeys: Bool = false\n    public var configPath: Bool = false\n    public var keyNameToGet: String? = nil\n}\n\nextension ConfigCmdArgs {\n    public enum Mode {\n        case getKey(key: String), majorKeys, allKeys, configPath\n    }\n\n    public var mode: Mode {\n        if let keyNameToGet { return .getKey(key: keyNameToGet) }\n        if majorKeys { return .majorKeys }\n        if allKeys { return .allKeys }\n        if configPath { return .configPath }\n        die(\"At least one mode must be specified\")\n    }\n}\n\nfunc parseConfigCmdArgs(_ args: StrArrSlice) -> ParsedCmd<ConfigCmdArgs> {\n    parseSpecificCmdArgs(ConfigCmdArgs(commonState: .init(args)), args)\n        .flatMap { raw in\n            var conflicting: Set<String> = []\n            if raw.keyNameToGet != nil { conflicting.insert(\"--get\") }\n            if raw.majorKeys { conflicting.insert(\"--major-keys\") }\n            if raw.allKeys { conflicting.insert(\"--all-keys\") }\n            if raw.configPath { conflicting.insert(\"--config-path\") }\n            return switch conflicting.count {\n                case 1: .cmd(raw)\n                case 0: .failure(\"Mandatory flag is not specified (--get|--major-keys|--all-keys|--config-path)\")\n                default: .failure(\"Conflicting flags are specified: \\(conflicting.joined(separator: \", \"))\")\n            }\n        }\n        .filter(\"--keys flag requires --get flag\") { !$0.keys || $0.keyNameToGet != nil }\n        .filter(\"--json flag requires --get flag\") { !$0.json || $0.keyNameToGet != nil }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/DebugWindowsCmdArgs.swift",
    "content": "public struct DebugWindowsCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .debugWindows,\n        allowInConfig: false,\n        help: debug_windows_help_generated,\n        flags: [\n            \"--window-id\": ArgParser(\\.windowId, upcastArgParserFun(parseUInt32SubArg)),\n        ],\n        posArgs: [],\n    )\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/EnableCmdArgs.swift",
    "content": "public struct EnableCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .enable,\n        allowInConfig: true,\n        help: enable_help_generated,\n        flags: [\n            \"--fail-if-noop\": trueBoolFlag(\\.failIfNoop),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.targetState, parseState, placeholder: EnableCmdArgs.State.unionLiteral)],\n    )\n    public var targetState: Lateinit<State> = .uninitialized\n    public var failIfNoop: Bool = false\n\n    public init(rawArgs: [String], targetState: State) {\n        self.commonState = .init(rawArgs.slice)\n        self.targetState = .initialized(targetState)\n    }\n\n    public enum State: String, CaseIterable, Sendable {\n        case on, off, toggle\n    }\n}\n\nfunc parseEnableCmdArgs(_ args: StrArrSlice) -> ParsedCmd<EnableCmdArgs> {\n    return parseSpecificCmdArgs(EnableCmdArgs(rawArgs: args), args)\n        .filterNot(\"--fail-if-noop is incompatible with 'toggle' argument\") { $0.targetState.val == .toggle && $0.failIfNoop }\n}\n\nprivate func parseState(i: PosArgParserInput) -> ParsedCliArgs<EnableCmdArgs.State> {\n    .init(parseEnum(i.arg, EnableCmdArgs.State.self), advanceBy: 1)\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ExecAndForgetCmdArgs.swift",
    "content": "public struct ExecAndForgetCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public static let parser: CmdParser<Self> = .init(\n        kind: .execAndForget,\n        allowInConfig: true,\n        help: exec_and_forget_help_generated,\n        flags: [:],\n        posArgs: [],\n    )\n\n    public init(bashScript: String) {\n        self.commonState = .init([bashScript])\n        self.bashScript = bashScript\n    }\n\n    public let bashScript: String\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/FlattenWorkspaceTreeCmdArgs.swift",
    "content": "public struct FlattenWorkspaceTreeCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .flattenWorkspaceTree,\n        allowInConfig: true,\n        help: flatten_workspace_tree_help_generated,\n        flags: [\n            \"--workspace\": optionalWorkspaceFlag(),\n        ],\n        posArgs: [],\n    )\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/FocusBackAndForthCmdArgs.swift",
    "content": "public struct FocusBackAndForthCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .focusBackAndForth,\n        allowInConfig: true,\n        help: focus_back_and_forth_help_generated,\n        flags: [:],\n        posArgs: [],\n    )\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/FocusCmdArgs.swift",
    "content": "public struct FocusCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .focus,\n        allowInConfig: true,\n        help: focus_help_generated,\n        flags: [\n            \"--ignore-floating\": falseBoolFlag(\\.floatingAsTiling),\n            \"--window-id\": ArgParser(\\.windowId, upcastArgParserFun(parseUInt32SubArg)),\n            \"--dfs-index\": ArgParser(\\.dfsIndex, upcastArgParserFun(parseUInt32SubArg)),\n\n            \"--boundaries\": ArgParser(\\.rawBoundaries, upcastArgParserFun(parseBoundaries)),\n            \"--boundaries-action\": ArgParser(\\.rawBoundariesAction, upcastArgParserFun(parseBoundariesAction)),\n            \"--wrap-around\": trueBoolFlag(\\.wrapAroundAlias),\n        ],\n        posArgs: [ArgParser(\\.cardinalOrDfsDirection, upcastArgParserFun(parseCardinalOrDfsDirection))],\n        conflictingOptions: [\n            [\"--wrap-around\", \"--boundaries-action\"],\n            [\"--wrap-around\", \"--boundaries\"],\n        ],\n    )\n\n    public var rawBoundaries: Boundaries? = nil // todo cover boundaries wrapping with tests\n    public var rawBoundariesAction: WhenBoundariesCrossed? = nil\n    fileprivate var wrapAroundAlias: Bool = false\n    public var dfsIndex: UInt32? = nil\n    public var cardinalOrDfsDirection: CardinalOrDfsDirection? = nil\n    public var floatingAsTiling: Bool = true\n\n    public init(rawArgs: StrArrSlice, cardinalOrDfsDirection: CardinalOrDfsDirection) {\n        self.commonState = .init(rawArgs)\n        self.cardinalOrDfsDirection = cardinalOrDfsDirection\n    }\n\n    public init(rawArgs: StrArrSlice, windowId: UInt32) {\n        self.commonState = .init(rawArgs)\n        self.windowId = windowId\n    }\n\n    public init(rawArgs: StrArrSlice, dfsIndex: UInt32) {\n        self.commonState = .init(rawArgs)\n        self.dfsIndex = dfsIndex\n    }\n\n    public enum Boundaries: String, CaseIterable, Equatable, Sendable {\n        case workspace\n        case allMonitorsOuterFrame = \"all-monitors-outer-frame\"\n    }\n    public enum WhenBoundariesCrossed: String, CaseIterable, Equatable, Sendable {\n        case stop = \"stop\"\n        case fail = \"fail\"\n        case wrapAroundTheWorkspace = \"wrap-around-the-workspace\"\n        case wrapAroundAllMonitors = \"wrap-around-all-monitors\"\n    }\n}\n\npublic enum FocusCmdTarget {\n    case direction(CardinalDirection)\n    case windowId(UInt32)\n    case dfsIndex(UInt32)\n    case dfsRelative(DfsNextPrev)\n\n    var isDfsRelative: Bool {\n        if case .dfsRelative = self {\n            return true\n        } else {\n            return false\n        }\n    }\n}\n\nextension FocusCmdArgs {\n    public var target: FocusCmdTarget {\n        if let cardinalOrDfsDirection {\n            return switch cardinalOrDfsDirection {\n                case .direction(let dir): .direction(dir)\n                case .dfsRelative(let nextPrev): .dfsRelative(nextPrev)\n            }\n        }\n        if let windowId {\n            return .windowId(windowId)\n        }\n        if let dfsIndex {\n            return .dfsIndex(dfsIndex)\n        }\n        die(\"Parser invariants are broken\")\n    }\n\n    public var boundaries: Boundaries { rawBoundaries ?? .workspace }\n    public var boundariesAction: WhenBoundariesCrossed {\n        wrapAroundAlias ? .wrapAroundTheWorkspace : (rawBoundariesAction ?? .stop)\n    }\n}\n\nfunc parseFocusCmdArgs(_ args: StrArrSlice) -> ParsedCmd<FocusCmdArgs> {\n    return parseSpecificCmdArgs(FocusCmdArgs(rawArgs: args), args)\n        .flatMap { (raw: FocusCmdArgs) -> ParsedCmd<FocusCmdArgs> in\n            raw.boundaries == .workspace && raw.boundariesAction == .wrapAroundAllMonitors\n                ? .failure(\"\\(raw.boundaries.rawValue) and \\(raw.boundariesAction.rawValue) is an invalid combination of values\")\n                : .cmd(raw)\n        }\n        .filter(\"Mandatory argument is missing. \\(CardinalOrDfsDirection.unionLiteral), --window-id or --dfs-index is required\") {\n            $0.cardinalOrDfsDirection != nil || $0.windowId != nil || $0.dfsIndex != nil\n        }\n        .filter(\"--window-id is incompatible with other options\") {\n            $0.windowId == nil || $0 == FocusCmdArgs(rawArgs: args, windowId: $0.windowId.orDie())\n        }\n        .filter(\"--dfs-index is incompatible with other options\") {\n            $0.dfsIndex == nil || $0 == FocusCmdArgs(rawArgs: args, dfsIndex: $0.dfsIndex.orDie())\n        }\n        .filter(\"(dfs-next|dfs-prev) only supports --boundaries workspace\") {\n            $0.target.isDfsRelative.implies($0.boundaries == .workspace)\n        }\n}\n\nprivate func parseBoundariesAction(i: SubArgParserInput) -> ParsedCliArgs<FocusCmdArgs.WhenBoundariesCrossed> {\n    if let arg = i.nonFlagArgOrNil() {\n        return .init(parseEnum(arg, FocusCmdArgs.WhenBoundariesCrossed.self), advanceBy: 1)\n    } else {\n        return .fail(\"<action> is mandatory\", advanceBy: 0)\n    }\n}\n\nprivate func parseBoundaries(i: SubArgParserInput) -> ParsedCliArgs<FocusCmdArgs.Boundaries> {\n    if let arg = i.nonFlagArgOrNil() {\n        return .init(parseEnum(arg, FocusCmdArgs.Boundaries.self), advanceBy: 1)\n    } else {\n        return .fail(\"<boundary> is mandatory\", advanceBy: 0)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/FocusMonitorCmdArgs.swift",
    "content": "public struct FocusMonitorCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .focusMonitor,\n        allowInConfig: true,\n        help: focus_monitor_help_generated,\n        flags: [\n            \"--wrap-around\": trueBoolFlag(\\.wrapAround),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.target, parseTarget, placeholder: MonitorTarget.cases.joinedCliArgs)],\n    )\n\n    public var wrapAround: Bool = false\n    public var target: Lateinit<MonitorTarget> = .uninitialized\n}\n\nfunc parseFocusMonitorCmdArgs(_ args: StrArrSlice) -> ParsedCmd<FocusMonitorCmdArgs> {\n    parseSpecificCmdArgs(FocusMonitorCmdArgs(rawArgs: args), args)\n        .filter(\"--wrap-around is incompatible with <monitor-pattern> argument\") { !$0.wrapAround || !$0.target.val.isPatterns }\n}\n\nfunc parseTarget(i: PosArgParserInput) -> ParsedCliArgs<MonitorTarget> {\n    switch i.arg {\n        case \"next\":\n            return .succ(.relative(.next), advanceBy: 1)\n        case \"prev\":\n            return .succ(.relative(.prev), advanceBy: 1)\n        case \"left\":\n            return .succ(.direction(.left), advanceBy: 1)\n        case \"down\":\n            return .succ(.direction(.down), advanceBy: 1)\n        case \"up\":\n            return .succ(.direction(.up), advanceBy: 1)\n        case \"right\":\n            return .succ(.direction(.right), advanceBy: 1)\n        default:\n            let args = i.nonFlagArgs()\n            return .init(args.mapAllOrFailure(parseMonitorDescription).map { .patterns($0) }, advanceBy: args.count)\n    }\n}\n\npublic enum MonitorTarget: Equatable, Sendable {\n    case direction(CardinalDirection)\n    case relative(NextPrev)\n    case patterns([MonitorDescription])\n\n    var isPatterns: Bool {\n        switch self {\n            case .patterns: true\n            default: false\n        }\n    }\n\n    static var casesExceptPatterns: [String] { CardinalDirection.cliArgsCases + NextPrev.cliArgsCases }\n    static var cases: [String] { casesExceptPatterns + [\"<monitor-pattern>\"] }\n\n    public var directionOrNil: CardinalDirection? {\n        switch self {\n            case .direction(let direction): direction\n            default: nil\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/FullscreenCmdArgs.swift",
    "content": "public struct FullscreenCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .fullscreen,\n        allowInConfig: true,\n        help: fullscreen_help_generated,\n        flags: [\n            \"--no-outer-gaps\": trueBoolFlag(\\.noOuterGaps),\n            \"--fail-if-noop\": trueBoolFlag(\\.failIfNoop),\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [ArgParser(\\.toggle, parseToggleEnum)],\n    )\n\n    public var toggle: ToggleEnum = .toggle\n    public var noOuterGaps: Bool = false\n    public var failIfNoop: Bool = false\n}\n\nfunc parseFullscreenCmdArgs(_ args: StrArrSlice) -> ParsedCmd<FullscreenCmdArgs> {\n    parseSpecificCmdArgs(FullscreenCmdArgs(rawArgs: args), args)\n        .filterNot(\"--no-outer-gaps is incompatible with 'off' argument\") { $0.toggle == .off && $0.noOuterGaps }\n        .filter(\"--fail-if-noop requires 'on' or 'off' argument\") { $0.failIfNoop.implies($0.toggle == .on || $0.toggle == .off) }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/JoinWithCmdArgs.swift",
    "content": "public struct JoinWithCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .joinWith,\n        allowInConfig: true,\n        help: join_with_help_generated,\n        flags: [\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.direction, parseCardinalDirectionArg, placeholder: CardinalDirection.unionLiteral)],\n    )\n\n    public var direction: Lateinit<CardinalDirection> = .uninitialized\n\n    public init(rawArgs: [String], direction: CardinalDirection) {\n        self.commonState = .init(rawArgs.slice)\n        self.direction = .initialized(direction)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/LayoutCmdArgs.swift",
    "content": "public struct LayoutCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .layout,\n        allowInConfig: true,\n        help: layout_help_generated,\n        flags: [\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.toggleBetween, parseToggleBetween, placeholder: LayoutDescription.unionLiteral)],\n    )\n\n    public var toggleBetween: Lateinit<[LayoutDescription]> = .uninitialized\n\n    public init(rawArgs: [String], toggleBetween: [LayoutDescription]) {\n        self.commonState = .init(rawArgs.slice)\n        self.toggleBetween = .initialized(toggleBetween)\n    }\n\n    public enum LayoutDescription: String, CaseIterable, Equatable, Sendable {\n        case accordion, tiles\n        case horizontal, vertical\n        case h_accordion, v_accordion, h_tiles, v_tiles\n        case tiling, floating\n    }\n}\n\nprivate func parseToggleBetween(input: PosArgParserInput) -> ParsedCliArgs<[LayoutCmdArgs.LayoutDescription]> {\n    let args = input.nonFlagArgs()\n\n    var result: [LayoutCmdArgs.LayoutDescription] = []\n    var i = 0\n    for arg in args {\n        if let layout = arg.parseLayoutDescription() {\n            result.append(layout)\n        } else {\n            return .fail(\n                \"Can't parse '\\(arg)'\\nPossible values: \\(LayoutCmdArgs.LayoutDescription.unionLiteral)\",\n                advanceBy: i + 1,\n            )\n        }\n        i += 1\n    }\n\n    return .succ(result, advanceBy: args.count)\n}\n\nfunc parseLayoutCmdArgs(_ args: StrArrSlice) -> ParsedCmd<LayoutCmdArgs> {\n    parseSpecificCmdArgs(LayoutCmdArgs(rawArgs: args), args).map {\n        check(!$0.toggleBetween.val.isEmpty)\n        return $0\n    }\n}\n\nextension String {\n    fileprivate func parseLayoutDescription() -> LayoutCmdArgs.LayoutDescription? {\n        if let parsed = LayoutCmdArgs.LayoutDescription(rawValue: self) {\n            return parsed\n        } else if self == \"list\" {\n            return .tiles\n        } else if self == \"h_list\" {\n            return .h_tiles\n        } else if self == \"v_list\" {\n            return .v_tiles\n        }\n        return nil\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ListAppsCmdArgs.swift",
    "content": "public struct ListAppsCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .listApps,\n        allowInConfig: false,\n        help: list_apps_help_generated,\n        flags: [\n            \"--macos-native-hidden\": boolFlag(\\.macosHidden),\n\n            // Formatting flags\n            \"--format\": formatParser(\\._format, for: .app),\n            \"--count\": trueBoolFlag(\\.outputOnlyCount),\n            \"--json\": trueBoolFlag(\\.json),\n        ],\n        posArgs: [],\n        conflictingOptions: [\n            [\"--count\", \"--format\"],\n            [\"--count\", \"--json\"],\n        ],\n    )\n\n    public var macosHidden: Bool?\n    public var _format: [StringInterToken] = []\n    public var outputOnlyCount: Bool = false\n    public var json: Bool = false\n}\n\nextension ListAppsCmdArgs {\n    public var format: [StringInterToken] {\n        _format.isEmpty\n            ? [\n                .interVar(\"app-pid\"), .interVar(\"right-padding\"), .literal(\" | \"),\n                .interVar(\"app-bundle-id\"), .interVar(\"right-padding\"), .literal(\" | \"),\n                .interVar(\"app-name\"),\n            ]\n            : _format\n    }\n}\n\nfunc parseListAppsCmdArgs(_ args: StrArrSlice) -> ParsedCmd<ListAppsCmdArgs> {\n    parseSpecificCmdArgs(ListAppsCmdArgs(rawArgs: args), args)\n        .flatMap { if $0.json, let msg = getErrorIfFormatIsIncompatibleWithJson($0._format) { .failure(msg) } else { .cmd($0) } }\n}\n\nfunc getErrorIfFormatIsIncompatibleWithJson(_ format: [StringInterToken]) -> String? {\n    for x in format {\n        switch x {\n            case .interVar(\"right-padding\"):\n                return \"%{right-padding} interpolation variable is not allowed when --json is used\"\n            case .interVar: break // skip\n            case .literal(let literal):\n                if literal.contains(where: { $0 != \" \" }) {\n                    return \"Only interpolation variables and spaces are allowed in '--format' when '--json' is used\"\n                }\n        }\n    }\n    return nil\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ListExecEnvVarsCmdArgs.swift",
    "content": "public struct ListExecEnvVarsCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .listExecEnvVars,\n        allowInConfig: true,\n        help: list_exec_env_vars_help_generated,\n        flags: [:],\n        posArgs: [],\n    )\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ListModesCmdArgs.swift",
    "content": "public struct ListModesCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) {\n        self.commonState = .init(rawArgs)\n    }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .listModes,\n        allowInConfig: false,\n        help: list_modes_help_generated,\n        flags: [\n            \"--count\": trueBoolFlag(\\.outputOnlyCount),\n            \"--current\": trueBoolFlag(\\.current),\n            \"--json\": trueBoolFlag(\\.json),\n        ],\n        posArgs: [],\n        conflictingOptions: [\n            [\"--count\", \"--current\"],\n            [\"--count\", \"--json\"],\n        ],\n    )\n\n    public var current: Bool = false\n    public var json: Bool = false\n    public var outputOnlyCount: Bool = false\n}\n\nfunc parseListModesCmdArgs(_ args: StrArrSlice) -> ParsedCmd<ListModesCmdArgs> {\n    parseSpecificCmdArgs(ListModesCmdArgs(rawArgs: args), args)\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ListMonitorsCmdArgs.swift",
    "content": "public struct ListMonitorsCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .listMonitors,\n        allowInConfig: false,\n        help: list_monitors_help_generated,\n        flags: [\n            \"--focused\": boolFlag(\\.focused),\n            \"--mouse\": boolFlag(\\.mouse),\n\n            // Formatting flags\n            \"--format\": formatParser(\\._format, for: .monitor),\n            \"--count\": trueBoolFlag(\\.outputOnlyCount),\n            \"--json\": trueBoolFlag(\\.json),\n        ],\n        posArgs: [],\n        conflictingOptions: [\n            [\"--count\", \"--format\"],\n            [\"--count\", \"--json\"],\n        ],\n    )\n\n    public var focused: Bool?\n    public var mouse: Bool?\n    public var _format: [StringInterToken] = []\n    public var outputOnlyCount: Bool = false\n    public var json: Bool = false\n}\n\nextension ListMonitorsCmdArgs {\n    public var format: [StringInterToken] {\n        _format.isEmpty\n            ? [\n                .interVar(\"monitor-id\"), .interVar(\"right-padding\"), .literal(\" | \"),\n                .interVar(\"monitor-name\"),\n            ]\n            : _format\n    }\n}\n\nfunc parseListMonitorsCmdArgs(_ args: StrArrSlice) -> ParsedCmd<ListMonitorsCmdArgs> {\n    parseSpecificCmdArgs(ListMonitorsCmdArgs(rawArgs: args), args)\n        .flatMap { if $0.json, let msg = getErrorIfFormatIsIncompatibleWithJson($0._format) { .failure(msg) } else { .cmd($0) } }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ListWindowsCmdArgs.swift",
    "content": "import OrderedCollections\n\nprivate let workspace = \"<workspace>\"\nprivate let workspaces = \"\\(workspace)...\"\n\npublic struct ListWindowsCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public static let parser: CmdParser<Self> = .init(\n        kind: .listWindows,\n        allowInConfig: false,\n        help: list_windows_help_generated,\n        flags: [\n            \"--all\": trueBoolFlag(\\.allAlias),\n\n            // Filtering flags\n            \"--focused\": trueBoolFlag(\\.filteringOptions.focused),\n            \"--monitor\": ArgParser(\\.filteringOptions.monitors, parseMonitorIds),\n            \"--workspace\": ArgParser(\\.filteringOptions.workspaces, parseWorkspaces),\n            \"--pid\": singleValueSubArgParser(\\.filteringOptions.pidFilter, \"<pid>\", Int32.init),\n            \"--app-bundle-id\": singleValueSubArgParser(\\.filteringOptions.appIdFilter, \"<app-bundle-id>\") { $0 },\n\n            // Formatting flags\n            \"--format\": formatParser(\\._format, for: .window),\n            \"--count\": trueBoolFlag(\\.outputOnlyCount),\n            \"--json\": trueBoolFlag(\\.json),\n        ],\n        posArgs: [],\n        conflictingOptions: [\n            [\"--all\", \"--focused\", \"--workspace\"],\n            [\"--all\", \"--focused\", \"--monitor\"],\n            [\"--count\", \"--format\"],\n            [\"--count\", \"--json\"],\n        ],\n    )\n\n    fileprivate var allAlias: Bool = false\n\n    public var filteringOptions = FilteringOptions()\n    public var _format: [StringInterToken] = []\n    public var outputOnlyCount: Bool = false\n    public var json: Bool = false\n\n    public struct FilteringOptions: ConvenienceCopyable, Equatable, Sendable {\n        public var monitors: [MonitorId] = []\n        public var focused: Bool = false\n        public var workspaces: [WorkspaceFilter] = []\n        public var pidFilter: Int32?\n        public var appIdFilter: String?\n    }\n}\n\nextension ListWindowsCmdArgs {\n    public var format: [StringInterToken] {\n        _format.isEmpty\n            ? [\n                .interVar(\"window-id\"), .interVar(\"right-padding\"), .literal(\" | \"),\n                .interVar(\"app-name\"), .interVar(\"right-padding\"), .literal(\" | \"),\n                .interVar(\"window-title\"),\n            ]\n            : _format\n    }\n}\n\nfunc parseListWindowsCmdArgs(_ args: StrArrSlice) -> ParsedCmd<ListWindowsCmdArgs> {\n    let args = args.map { $0 == \"--app-id\" ? \"--app-bundle-id\" : $0 }.slice // Compatibility\n    return parseSpecificCmdArgs(ListWindowsCmdArgs(commonState: .init(args)), args)\n        .filter(\"Mandatory option is not specified (--focused|--all|--monitor|--workspace)\") { raw in\n            raw.filteringOptions.focused || raw.allAlias || !raw.filteringOptions.monitors.isEmpty || !raw.filteringOptions.workspaces.isEmpty\n        }\n        .filter(\"--all conflicts with \\\"filtering\\\" flags. Please use '--monitor all' instead of '--all' alias\") { raw in\n            raw.allAlias.implies(raw.filteringOptions == ListWindowsCmdArgs.FilteringOptions())\n        }\n        .filter(\"--focused conflicts with other \\\"filtering\\\" flags\") { raw in\n            raw.filteringOptions.focused.implies(raw.filteringOptions.copy(\\.focused, false) == ListWindowsCmdArgs.FilteringOptions())\n        }\n        .map { raw in\n            raw.allAlias ? raw.copy(\\.filteringOptions.monitors, [.all]).copy(\\.allAlias, false) : raw // Normalize alias\n        }\n        .flatMap { if $0.json, let msg = getErrorIfFormatIsIncompatibleWithJson($0._format) { .failure(msg) } else { .cmd($0) } }\n}\n\nfunc formatParser<Root>(\n    _ keyPath: SendableWritableKeyPath<Root, [StringInterToken]>,\n    for kind: AeroObjKind,\n) -> SubArgParser<Root, [StringInterToken]> {\n    return ArgParser(keyPath) { input in\n        if let arg = input.nonFlagArgOrNil() {\n            return switch arg.interpolationTokens(interpolationChar: \"%\") {\n                case .success(let tokens): .succ(tokens, advanceBy: 1)\n                case .failure(let err): .fail(\"Failed to parse <output-format>. \\(err)\", advanceBy: 1)\n            }\n        } else {\n            let values = getAvailableInterVars(for: kind).joined(separator: \"\\n\").prependLines(\"  \")\n            return .fail(\"<output-format> is mandatory. Possible values:\\n\\(values)\", advanceBy: 0)\n        }\n    }\n}\n\nprivate func parseWorkspaces(input: SubArgParserInput) -> ParsedCliArgs<[WorkspaceFilter]> {\n    let args = input.nonFlagArgs()\n    let possibleValues = \"\\(workspace) possible values: (<workspace-name>|focused|visible)\"\n    if args.isEmpty {\n        return .fail(\"\\(workspaces) is mandatory. \\(possibleValues)\", advanceBy: args.count)\n    }\n    var workspaces: [WorkspaceFilter] = []\n    var i = 0\n    for workspaceRaw in args {\n        switch workspaceRaw {\n            case \"visible\": workspaces.append(.visible)\n            case \"focused\": workspaces.append(.focused)\n            default:\n                switch WorkspaceName.parse(workspaceRaw) {\n                    case .success(let unwrapped): workspaces.append(.name(unwrapped))\n                    case .failure(let msg): return .fail(msg, advanceBy: i + 1)\n                }\n        }\n        i += 1\n    }\n    return .succ(workspaces, advanceBy: workspaces.count)\n}\n\npublic enum WorkspaceFilter: Equatable, Sendable {\n    case focused\n    case visible\n    case name(WorkspaceName)\n}\n\npublic enum FormatVar: Equatable {\n    case window(WindowFormatVar)\n    case workspace(WorkspaceFormatVar)\n    case app(AppFormatVar)\n    case monitor(MonitorFormatVar)\n\n    public enum WindowFormatVar: String, Equatable, CaseIterable {\n        case windowId = \"window-id\"\n        case windowIsFullscreen = \"window-is-fullscreen\"\n        case windowTitle = \"window-title\"\n        case windowLayout = \"window-layout\" // An alias for windowParentContainerLayout\n        case windowParentContainerLayout = \"window-parent-container-layout\"\n    }\n\n    public enum WorkspaceFormatVar: String, Equatable, CaseIterable {\n        case workspaceName = \"workspace\"\n        case workspaceFocused = \"workspace-is-focused\"\n        case workspaceVisible = \"workspace-is-visible\"\n        case workspaceRootContainerLayout = \"workspace-root-container-layout\"\n    }\n\n    public enum AppFormatVar: String, Equatable, CaseIterable {\n        case appBundleId = \"app-bundle-id\"\n        case appName = \"app-name\"\n        case appPid = \"app-pid\"\n        case appExecPath = \"app-exec-path\"\n        case appBundlePath = \"app-bundle-path\"\n    }\n\n    public enum MonitorFormatVar: String, Equatable, CaseIterable {\n        case monitorId_oneBased = \"monitor-id\"\n        case monitorAppKitNsScreenScreensId = \"monitor-appkit-nsscreen-screens-id\"\n        case monitorName = \"monitor-name\"\n        case monitorIsMain = \"monitor-is-main\"\n    }\n}\n\npublic enum PlainInterVar: String, CaseIterable {\n    case rightPadding = \"right-padding\"\n    case newline = \"newline\"\n    case tab = \"tab\"\n}\n\npublic enum AeroObjKind: CaseIterable, Sendable {\n    case window, workspace, app, monitor\n}\n\npublic func getAvailableInterVars(for kind: AeroObjKind) -> [String] {\n    _getAvailableInterVars(for: kind) + PlainInterVar.allCases.map(\\.rawValue)\n}\n\nprivate func _getAvailableInterVars(for kind: AeroObjKind) -> [String] {\n    switch kind {\n        case .app: FormatVar.AppFormatVar.allCases.map(\\.rawValue)\n        case .monitor: FormatVar.MonitorFormatVar.allCases.map(\\.rawValue)\n        case .workspace:\n            FormatVar.WorkspaceFormatVar.allCases.map(\\.rawValue) +\n                _getAvailableInterVars(for: .monitor)\n        case .window:\n            FormatVar.WindowFormatVar.allCases.map(\\.rawValue) +\n                _getAvailableInterVars(for: .workspace) +\n                _getAvailableInterVars(for: .app)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ListWorkspacesCmdArgs.swift",
    "content": "import OrderedCollections\n\nlet onitor = \"<monitor>\"\nlet _monitors = \"\\(onitor)...\"\n\npublic struct ListWorkspacesCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public static let parser: CmdParser<Self> = .init(\n        kind: .listWorkspaces,\n        allowInConfig: false,\n        help: list_workspaces_help_generated,\n        flags: [\n            // Aliases\n            \"--focused\": trueBoolFlag(\\.focused),\n            \"--all\": trueBoolFlag(\\.all),\n\n            // Filtering flags\n            \"--visible\": boolFlag(\\.filteringOptions.visible),\n            \"--empty\": boolFlag(\\.filteringOptions.empty),\n            \"--monitor\": ArgParser(\\.filteringOptions.onMonitors, parseMonitorIds),\n\n            // Formatting flags\n            \"--format\": formatParser(\\._format, for: .workspace),\n            \"--count\": trueBoolFlag(\\.outputOnlyCount),\n            \"--json\": trueBoolFlag(\\.json),\n        ],\n        posArgs: [],\n        conflictingOptions: [\n            [\"--all\", \"--focused\", \"--monitor\"],\n            [\"--count\", \"--format\"],\n            [\"--count\", \"--json\"],\n        ],\n    )\n\n    fileprivate var all: Bool = false // Alias\n    fileprivate var focused: Bool = false // Alias\n\n    public var filteringOptions = FilteringOptions()\n    public var _format: [StringInterToken] = [.interVar(\"workspace\")]\n    public var outputOnlyCount: Bool = false\n    public var json: Bool = false\n\n    public struct FilteringOptions: ConvenienceCopyable, Equatable, Sendable {\n        public var onMonitors: [MonitorId] = []\n        public var visible: Bool?\n        public var empty: Bool?\n    }\n}\n\nextension ListWorkspacesCmdArgs {\n    public var format: [StringInterToken] { _format.isEmpty ? [.interVar(\"workspace\")] : _format }\n}\n\nfunc parseListWorkspacesCmdArgs(_ args: StrArrSlice) -> ParsedCmd<ListWorkspacesCmdArgs> {\n    parseSpecificCmdArgs(ListWorkspacesCmdArgs(commonState: .init(args)), args)\n        .filter(\"Mandatory option is not specified (--all|--focused|--monitor)\") { raw in\n            raw.all || raw.focused || !raw.filteringOptions.onMonitors.isEmpty\n        }\n        .filter(\"--all conflicts with any other \\\"filtering\\\" options\") { raw in\n            raw.all.implies(raw.filteringOptions == ListWorkspacesCmdArgs.FilteringOptions())\n        }\n        .filter(\"--focused conflicts with all other \\\"filtering\\\" options\") { raw in\n            raw.focused.implies(raw.filteringOptions == ListWorkspacesCmdArgs.FilteringOptions())\n        }\n        .map { raw in\n            raw.all ? raw.copy(\\.filteringOptions.onMonitors, [.all]).copy(\\.all, false) : raw\n        }\n        .map { raw in // Expand alias\n            raw.focused\n                ? raw.copy(\\.filteringOptions.onMonitors, [.focused])\n                    .copy(\\.filteringOptions.visible, true)\n                    .copy(\\.focused, false)\n                : raw\n        }\n        .flatMap { if $0.json, let msg = getErrorIfFormatIsIncompatibleWithJson($0._format) { .failure(msg) } else { .cmd($0) } }\n}\n\nfunc parseMonitorIds(input: SubArgParserInput) -> ParsedCliArgs<[MonitorId]> {\n    let args = input.nonFlagArgs()\n    let possibleValues = \"\\(onitor) possible values: (<monitor-id>|focused|mouse|all)\"\n    if args.isEmpty {\n        return .fail(\"\\(_monitors) is mandatory. \\(possibleValues)\", advanceBy: args.count)\n    }\n    var monitors: [MonitorId] = []\n    var i = 0\n    for monitor in args {\n        switch Int.init(monitor) {\n            case .some(let unwrapped):\n                monitors.append(.index(unwrapped - 1))\n            case _ where monitor == \"mouse\":\n                monitors.append(.mouse)\n            case _ where monitor == \"all\":\n                monitors.append(.all)\n            case _ where monitor == \"focused\":\n                monitors.append(.focused)\n            default:\n                return .fail(\"Can't parse monitor ID '\\(monitor)'. \\(possibleValues)\", advanceBy: i + 1)\n        }\n        i += 1\n    }\n    return .succ(monitors, advanceBy: monitors.count)\n}\n\npublic enum MonitorId: Equatable, Sendable {\n    case focused\n    case all\n    case mouse\n    case index(Int)\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/MacosNativeFullscreenCmdArgs.swift",
    "content": "public struct MacosNativeFullscreenCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .macosNativeFullscreen,\n        allowInConfig: true,\n        help: macos_native_fullscreen_help_generated,\n        flags: [\n            \"--fail-if-noop\": trueBoolFlag(\\.failIfNoop),\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [ArgParser(\\.toggle, parseToggleEnum)],\n    )\n\n    public var toggle: ToggleEnum = .toggle\n    public var failIfNoop: Bool = false\n}\n\nfunc parseMacosNativeFullscreenCmdArgs(_ args: StrArrSlice) -> ParsedCmd<MacosNativeFullscreenCmdArgs> {\n    parseSpecificCmdArgs(MacosNativeFullscreenCmdArgs(rawArgs: args), args)\n        .filter(\"--fail-if-noop requires 'on' or 'off' argument\") { $0.failIfNoop.implies($0.toggle == .on || $0.toggle == .off) }\n}\n\npublic enum ToggleEnum: Sendable {\n    case on, off, toggle\n}\n\nfunc parseToggleEnum(i: PosArgParserInput) -> ParsedCliArgs<ToggleEnum> {\n    switch i.arg {\n        case \"on\": .succ(.on, advanceBy: 1)\n        case \"off\": .succ(.off, advanceBy: 1)\n        default: .fail(\"Can't parse '\\(i.arg)'. Possible values: on|off\", advanceBy: 1)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/MacosNativeMinimizeCmdArgs.swift",
    "content": "public struct MacosNativeMinimizeCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .macosNativeMinimize,\n        allowInConfig: true,\n        help: macos_native_minimize_help_generated,\n        flags: [\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [],\n    )\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ModeCmdArgs.swift",
    "content": "public struct ModeCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .mode,\n        allowInConfig: true,\n        help: mode_help_generated,\n        flags: [:],\n        posArgs: [newMandatoryPosArgParser(\\.targetMode, consumeStrCliArg, placeholder: \"<binding-mode>\")],\n    )\n\n    public var targetMode: Lateinit<String> = .uninitialized\n}\n\nfunc consumeStrCliArg(i: PosArgParserInput) -> ParsedCliArgs<String> { .succ(i.arg, advanceBy: 1) }\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/MoveCmdArgs.swift",
    "content": "public struct MoveCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .move,\n        allowInConfig: true,\n        help: move_help_generated,\n        flags: [\n            \"--window-id\": optionalWindowIdFlag(),\n            \"--boundaries\": ArgParser(\\.rawBoundaries, upcastArgParserFun(parseBoundaries)),\n            \"--boundaries-action\": ArgParser(\\.rawBoundariesAction, upcastArgParserFun(parseBoundariesAction)),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.direction, parseCardinalDirectionArg, placeholder: CardinalDirection.unionLiteral)],\n    )\n\n    public var direction: Lateinit<CardinalDirection> = .uninitialized\n    public var rawBoundaries: Boundaries? = nil\n    public var rawBoundariesAction: WhenBoundariesCrossed? = nil\n\n    public init(rawArgs: [String], _ direction: CardinalDirection) {\n        self.commonState = .init(rawArgs.slice)\n        self.direction = .initialized(direction)\n    }\n\n    public enum Boundaries: String, CaseIterable, Equatable, Sendable {\n        case workspace\n        case allMonitorsOuterFrame = \"all-monitors-outer-frame\"\n    }\n\n    public enum WhenBoundariesCrossed: String, CaseIterable, Equatable, Sendable {\n        case stop = \"stop\"\n        case fail = \"fail\"\n        case createImplicitContainer = \"create-implicit-container\"\n    }\n}\n\nextension MoveCmdArgs {\n    public var boundaries: Boundaries { rawBoundaries ?? .workspace }\n    public var boundariesAction: WhenBoundariesCrossed { rawBoundariesAction ?? .createImplicitContainer }\n}\n\nfunc parseMoveCmdArgs(_ args: StrArrSlice) -> ParsedCmd<MoveCmdArgs> {\n    parseSpecificCmdArgs(MoveCmdArgs(rawArgs: args), args)\n}\n\nprivate func parseBoundaries(i: SubArgParserInput) -> ParsedCliArgs<MoveCmdArgs.Boundaries> {\n    if let arg = i.nonFlagArgOrNil() {\n        return .init(parseEnum(arg, MoveCmdArgs.Boundaries.self), advanceBy: 1)\n    } else {\n        return .fail(\"<boundary> is mandatory\", advanceBy: 0)\n    }\n}\n\nprivate func parseBoundariesAction(i: SubArgParserInput) -> ParsedCliArgs<MoveCmdArgs.WhenBoundariesCrossed> {\n    if let arg = i.nonFlagArgOrNil() {\n        return .init(parseEnum(arg, MoveCmdArgs.WhenBoundariesCrossed.self), advanceBy: 1)\n    } else {\n        return .fail(\"<action> is mandatory\", advanceBy: 0)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/MoveMouseCmdArgs.swift",
    "content": "public struct MoveMouseCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .moveMouse,\n        allowInConfig: true,\n        help: move_mouse_help_generated,\n        flags: [\n            \"--fail-if-noop\": trueBoolFlag(\\.failIfNoop),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.mouseTarget, parseMouseTarget, placeholder: \"<mouse-position>\")],\n    )\n\n    public var failIfNoop: Bool = false\n    public var mouseTarget: Lateinit<MouseTarget> = .uninitialized\n}\n\nfunc parseMouseTarget(i: PosArgParserInput) -> ParsedCliArgs<MouseTarget> {\n    .init(parseEnum(i.arg, MouseTarget.self), advanceBy: 1)\n}\n\nfunc parseMoveMouseCmdArgs(_ args: StrArrSlice) -> ParsedCmd<MoveMouseCmdArgs> {\n    parseSpecificCmdArgs(MoveMouseCmdArgs(rawArgs: args), args)\n        .filter(\"--fail-if-noop is only compatible with window-lazy-center or monitor-lazy-center\") {\n            $0.failIfNoop.implies($0.mouseTarget.val == .windowLazyCenter || $0.mouseTarget.val == .monitorLazyCenter)\n        }\n}\n\npublic enum MouseTarget: String, CaseIterable, Sendable {\n    case monitorLazyCenter = \"monitor-lazy-center\"\n    case monitorForceCenter = \"monitor-force-center\"\n\n    case windowLazyCenter = \"window-lazy-center\"\n    case windowForceCenter = \"window-force-center\"\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/MoveNodeToMonitorCmdArgs.swift",
    "content": "public struct MoveNodeToMonitorCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .moveNodeToMonitor,\n        allowInConfig: true,\n        help: move_node_to_monitor_help_generated,\n        flags: [\n            // \"Own\" option\n            \"--wrap-around\": trueBoolFlag(\\.wrapAround),\n\n            \"--window-id\": optionalWindowIdFlag(),\n            \"--focus-follows-window\": trueBoolFlag(\\.focusFollowsWindow),\n            \"--fail-if-noop\": trueBoolFlag(\\.failIfNoop),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.target, parseTarget, placeholder: MonitorTarget.cases.joinedCliArgs)],\n    )\n\n    public init(target: MonitorTarget) {\n        self.commonState = .init([])\n        self.target = .initialized(target)\n    }\n\n    public var failIfNoop: Bool = false\n    public var focusFollowsWindow: Bool = false\n    public var wrapAround: Bool = false\n    public var target: Lateinit<MonitorTarget> = .uninitialized\n}\n\nfunc parseMoveNodeToMonitorCmdArgs(_ args: StrArrSlice) -> ParsedCmd<MoveNodeToMonitorCmdArgs> {\n    parseSpecificCmdArgs(MoveNodeToMonitorCmdArgs(rawArgs: args), args)\n        .filter(\"--wrap-around is incompatible with <monitor-pattern> argument\") { $0.wrapAround.implies(!$0.target.val.isPatterns) }\n        .filter(\"--fail-if-noop is incompatible with \\(MonitorTarget.casesExceptPatterns.joinedCliArgs)\") { $0.failIfNoop.implies($0.target.val.isPatterns) }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/MoveNodeToWorkspaceCmdArgs.swift",
    "content": "public struct MoveNodeToWorkspaceCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public static let parser: CmdParser<Self> = .init(\n        kind: .moveNodeToWorkspace,\n        allowInConfig: true,\n        help: move_node_to_workspace_help_generated,\n        flags: [\n            \"--wrap-around\": optionalTrueBoolFlag(\\._wrapAround),\n            \"--fail-if-noop\": trueBoolFlag(\\.failIfNoop),\n            \"--window-id\": optionalWindowIdFlag(),\n            \"--focus-follows-window\": trueBoolFlag(\\.focusFollowsWindow),\n\n            \"--stdin\": optionalTrueBoolFlag(\\.explicitStdinFlag),\n            \"--no-stdin\": optionalFalseBoolFlag(\\.explicitStdinFlag),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.target, parseWorkspaceTarget, placeholder: workspaceTargetPlaceholder)],\n        conflictingOptions: [\n            [\"--stdin\", \"--no-stdin\"],\n        ],\n    )\n\n    public var _wrapAround: Bool?\n    public var explicitStdinFlag: Bool? = nil\n    public var failIfNoop: Bool = false\n    public var focusFollowsWindow: Bool = false\n    public var target: Lateinit<WorkspaceTarget> = .uninitialized\n\n    public init(rawArgs: StrArrSlice) {\n        self.commonState = .init(rawArgs)\n    }\n}\n\nextension MoveNodeToWorkspaceCmdArgs {\n    public var wrapAround: Bool { _wrapAround ?? false }\n    public var useStdin: Bool { explicitStdinFlag ?? false }\n}\n\nfunc parseMoveNodeToWorkspaceCmdArgs(_ args: StrArrSlice) -> ParsedCmd<MoveNodeToWorkspaceCmdArgs> {\n    parseSpecificCmdArgs(MoveNodeToWorkspaceCmdArgs(rawArgs: args), args)\n        .filter(\"--wrapAround requires using (prev|next) argument\") { ($0._wrapAround != nil).implies($0.target.val.isRelatve) }\n        .filterNot(\"--fail-if-noop is incompatible with (next|prev)\") { $0.failIfNoop && $0.target.val.isRelatve }\n        .filterNot(\"--window-id is incompatible with (next|prev)\") { $0.windowId != nil && $0.target.val.isRelatve }\n        .filter(\"--stdin and --no-stdin require using \\(NextPrev.unionLiteral) argument\") { ($0.explicitStdinFlag != nil).implies($0.target.val.isRelatve) }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/MoveWorkpsaceToMonitorCmdArgs.swift",
    "content": "public struct MoveWorkspaceToMonitorCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .moveWorkspaceToMonitor,\n        allowInConfig: true,\n        help: move_workspace_to_monitor_help_generated,\n        flags: [\n            \"--wrap-around\": trueBoolFlag(\\.wrapAround),\n            \"--workspace\": optionalWorkspaceFlag(),\n        ],\n        posArgs: [\n            newMandatoryPosArgParser(\\.target, parseTarget, placeholder: MonitorTarget.cases.joinedCliArgs),\n        ],\n    )\n\n    public var wrapAround: Bool = false\n    public var target: Lateinit<MonitorTarget> = .uninitialized\n}\n\nfunc parseWorkspaceToMonitorCmdArgs(_ args: StrArrSlice) -> ParsedCmd<MoveWorkspaceToMonitorCmdArgs> {\n    parseSpecificCmdArgs(MoveWorkspaceToMonitorCmdArgs(rawArgs: args), args)\n        .filter(\"--wrap-around is incompatible with <monitor-pattern> argument\") {\n            $0.wrapAround.implies(!$0.target.val.isPatterns)\n        }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ReloadConfigCmdArgs.swift",
    "content": "public struct ReloadConfigCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .reloadConfig,\n        allowInConfig: true,\n        help: reload_config_help_generated,\n        flags: [\n            \"--no-gui\": trueBoolFlag(\\.noGui),\n            \"--dry-run\": trueBoolFlag(\\.dryRun),\n        ],\n        posArgs: [],\n    )\n\n    public var noGui: Bool = false\n    public var dryRun: Bool = false\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/ResizeCmdArgs.swift",
    "content": "public struct ResizeCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .resize,\n        allowInConfig: true,\n        help: resize_help_generated,\n        flags: [\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [\n            newMandatoryPosArgParser(\\.dimension, parseDimension, placeholder: \"(smart|smart-opposite|width|height)\"),\n            newMandatoryPosArgParser(\\.units, parseUnits, placeholder: \"[+|-]<number>\"),\n        ],\n    )\n\n    public var dimension: Lateinit<ResizeCmdArgs.Dimension> = .uninitialized\n    public var units: Lateinit<ResizeCmdArgs.Units> = .uninitialized\n\n    public init(\n        rawArgs: [String],\n        dimension: Dimension,\n        units: Units,\n    ) {\n        self.commonState = .init(rawArgs.slice)\n        self.dimension = .initialized(dimension)\n        self.units = .initialized(units)\n    }\n\n    public enum Dimension: String, CaseIterable, Equatable, Sendable {\n        case width, height, smart\n        case smartOpposite = \"smart-opposite\"\n    }\n\n    public enum Units: Equatable, Sendable {\n        case set(UInt)\n        case add(UInt)\n        case subtract(UInt)\n    }\n}\n\nfunc parseResizeCmdArgs(_ args: StrArrSlice) -> ParsedCmd<ResizeCmdArgs> {\n    parseSpecificCmdArgs(ResizeCmdArgs(rawArgs: args), args)\n}\n\nprivate func parseDimension(i: PosArgParserInput) -> ParsedCliArgs<ResizeCmdArgs.Dimension> {\n    .init(parseEnum(i.arg, ResizeCmdArgs.Dimension.self), advanceBy: 1)\n}\n\nprivate func parseUnits(i: PosArgParserInput) -> ParsedCliArgs<ResizeCmdArgs.Units> {\n    if let number = UInt(i.arg.removePrefix(\"+\").removePrefix(\"-\")) {\n        switch true {\n            case i.arg.starts(with: \"+\"): .succ(.add(number), advanceBy: 1)\n            case i.arg.starts(with: \"-\"): .succ(.subtract(number), advanceBy: 1)\n            default: .succ(.set(number), advanceBy: 1)\n        }\n    } else {\n        .fail(\"<number> argument must be a number\", advanceBy: 1)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/SplitCmdArgs.swift",
    "content": "public struct SplitCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .split,\n        allowInConfig: true,\n        help: split_help_generated,\n        flags: [\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.arg, parseSplitArg, placeholder: SplitArg.unionLiteral)],\n    )\n\n    public var arg: Lateinit<SplitArg> = .uninitialized\n\n    public init(rawArgs: [String], _ arg: SplitArg) {\n        self.commonState = .init(rawArgs.slice)\n        self.arg = .initialized(arg)\n    }\n\n    public enum SplitArg: String, CaseIterable, Sendable {\n        case horizontal, vertical, opposite\n    }\n}\n\nfunc parseSplitCmdArgs(_ args: StrArrSlice) -> ParsedCmd<SplitCmdArgs> {\n    parseSpecificCmdArgs(SplitCmdArgs(rawArgs: args), args)\n}\n\nprivate func parseSplitArg(i: PosArgParserInput) -> ParsedCliArgs<SplitCmdArgs.SplitArg> {\n    .init(parseEnum(i.arg, SplitCmdArgs.SplitArg.self), advanceBy: 1)\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/SubscribeCmdArgs.swift",
    "content": "public struct SubscribeCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    fileprivate init(rawArgs: StrArrSlice) {\n        self.commonState = .init(rawArgs)\n    }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .subscribe,\n        allowInConfig: false,\n        help: subscribe_help_generated,\n        flags: [\n            \"--all\": trueBoolFlag(\\.allAlias),\n            \"--no-send-initial\": falseBoolFlag(\\.sendInitial),\n        ],\n        posArgs: [ArgParser(\\.events, parseEventTypes)],\n    )\n\n    fileprivate var allAlias: Bool = false\n    public var sendInitial = true\n    public var events: Set<ServerEventType> = []\n}\n\npublic func parseSubscribeCmdArgs(_ args: StrArrSlice) -> ParsedCmd<SubscribeCmdArgs> {\n    parseSpecificCmdArgs(SubscribeCmdArgs(rawArgs: args), args)\n        .filter(\"Either --all or at least one <event> must be specified\") { raw in\n            raw.allAlias || !raw.events.isEmpty\n        }\n        .filter(\"--all conflicts with specifying individual events\") { raw in\n            raw.allAlias.implies(raw.events.isEmpty)\n        }\n        .map { raw in\n            raw.allAlias ? raw.copy(\\.events, Set(ServerEventType.allCases)).copy(\\.allAlias, false) : raw\n        }\n}\n\nprivate func parseEventTypes(_ input: ArgParserInput) -> ParsedCliArgs<Set<ServerEventType>> {\n    let args = input.nonFlagArgs()\n    var events: Set<ServerEventType> = []\n    var errorMsg: String? = nil\n    for arg in args {\n        switch parseEnum(arg, ServerEventType.self) {\n            case .success(let event):\n                if events.contains(event) {\n                    errorMsg = \"Duplicate event '\\(arg)'\"\n                }\n                events.insert(event)\n            case .failure(let errorMsg):\n                return .fail(errorMsg, advanceBy: events.count + 1)\n        }\n    }\n    if let errorMsg {\n        return .fail(errorMsg, advanceBy: args.count)\n    } else {\n        return .succ(events, advanceBy: args.count)\n    }\n}\n\npublic enum ServerEventType: String, Codable, CaseIterable, Sendable {\n    case focusChanged = \"focus-changed\"\n    case focusedMonitorChanged = \"focused-monitor-changed\"\n    case workspaceChanged = \"focused-workspace-changed\"\n    case modeChanged = \"mode-changed\"\n    case windowDetected = \"window-detected\"\n    case bindingTriggered = \"binding-triggered\"\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/SummonWorkspaceCmdArgs.swift",
    "content": "public struct SummonWorkspaceCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .summonWorkspace,\n        allowInConfig: true,\n        help: summon_workspace_help_generated,\n        flags: [\n            \"--fail-if-noop\": trueBoolFlag(\\.failIfNoop),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.target, parseWorkspaceName, placeholder: \"<workspace>\")],\n    )\n\n    public var target: Lateinit<WorkspaceName> = .uninitialized\n    public var failIfNoop: Bool = false\n}\n\nprivate func parseWorkspaceName(i: PosArgParserInput) -> ParsedCliArgs<WorkspaceName> {\n    .init(WorkspaceName.parse(i.arg), advanceBy: 1)\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/SwapCmdArgs.swift",
    "content": "public struct SwapCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .swap,\n        allowInConfig: true,\n        help: swap_help_generated,\n        flags: [\n            \"--swap-focus\": trueBoolFlag(\\.swapFocus),\n            \"--wrap-around\": trueBoolFlag(\\.wrapAround),\n            \"--window-id\": optionalWindowIdFlag(),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.target, parseCardinalOrDfsDirection, placeholder: CardinalOrDfsDirection.unionLiteral)],\n    )\n\n    public var target: Lateinit<CardinalOrDfsDirection> = .uninitialized\n    public var swapFocus: Bool = false\n    public var wrapAround: Bool = false\n\n    public init(rawArgs: [String], target: CardinalOrDfsDirection) {\n        self.commonState = .init(rawArgs.slice)\n        self.target = .initialized(target)\n    }\n}\n\nfunc parseSwapCmdArgs(_ args: StrArrSlice) -> ParsedCmd<SwapCmdArgs> {\n    return parseSpecificCmdArgs(SwapCmdArgs(rawArgs: args), args)\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/TriggerBindingCmdArgs.swift",
    "content": "public struct TriggerBindingCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public static let parser: CmdParser<Self> = .init(\n        kind: .triggerBinding,\n        allowInConfig: true,\n        help: trigger_binding_help_generated,\n        flags: [\n            \"--mode\": singleValueSubArgParser(\\._mode, \"<mode-id>\") { $0 },\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.binding, consumeStrCliArg, placeholder: \"<binding>\")],\n    )\n\n    public var _mode: String? = nil\n    public var binding: Lateinit<String> = .uninitialized\n}\n\nextension TriggerBindingCmdArgs {\n    public var mode: String { _mode.orDie() }\n}\n\nfunc parseTriggerBindingCmdArgs(_ args: StrArrSlice) -> ParsedCmd<TriggerBindingCmdArgs> {\n    parseSpecificCmdArgs(TriggerBindingCmdArgs(commonState: .init(args)), args)\n        .filter(\"--mode flag is mandatory\") { $0._mode != nil }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/VolumeCmdArgs.swift",
    "content": "public struct VolumeCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .volume,\n        allowInConfig: true,\n        help: volume_help_generated,\n        flags: [\n            \"--no-gui\": falseBoolFlag(\\.gui),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.action, parseVolumeAction, placeholder: VolumeAction.argsUnion)],\n    )\n\n    public var gui: Bool = true\n    public var action: Lateinit<VolumeAction> = .uninitialized\n}\n\npublic enum VolumeAction: Equatable, Sendable {\n    case up, down, muteToggle, muteOn, muteOff\n    case set(Int)\n\n    static let argsUnion: String = \"(up|down|mute-toggle|mute-on|mute-off|set)\"\n}\n\nfunc parseVolumeAction(i: PosArgParserInput) -> ParsedCliArgs<VolumeAction> {\n    switch i.arg {\n        case \"up\": return .succ(.up, advanceBy: 1)\n        case \"down\": return .succ(.down, advanceBy: 1)\n        case \"mute-toggle\": return .succ(.muteToggle, advanceBy: 1)\n        case \"mute-off\": return .succ(.muteOff, advanceBy: 1)\n        case \"mute-on\": return .succ(.muteOn, advanceBy: 1)\n        case \"set\":\n            guard let arg = i.getOrNil(relativeIndex: 1) else { return .fail(\"set argument must be followed by <number>\", advanceBy: 1) }\n            guard let int = Int(arg) else { return .fail(\"Can't parse number '\\(arg)'\", advanceBy: 2) }\n            if !(0 ... 100).contains(int) { return .fail(\"\\(int) must be in range from 0 to 100\", advanceBy: 2) }\n            return .succ(.set(int), advanceBy: 2)\n        default:\n            return .fail(\"Unknown argument '\\(i.arg)'. Possible values: \\(VolumeAction.argsUnion)\", advanceBy: 1)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/WorkspaceBackAndForthCmdArgs.swift",
    "content": "public struct WorkspaceBackAndForthCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .workspaceBackAndForth,\n        allowInConfig: true,\n        help: workspace_back_and_forth_help_generated,\n        flags: [:],\n        posArgs: [],\n    )\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/impl/WorkspaceCmdArgs.swift",
    "content": "public struct WorkspaceCmdArgs: CmdArgs {\n    /*conforms*/ public var commonState: CmdArgsCommonState\n    public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) }\n    public static let parser: CmdParser<Self> = .init(\n        kind: .workspace,\n        allowInConfig: true,\n        help: workspace_help_generated,\n        flags: [\n            \"--auto-back-and-forth\": optionalTrueBoolFlag(\\._autoBackAndForth),\n            \"--wrap-around\": optionalTrueBoolFlag(\\._wrapAround),\n            \"--fail-if-noop\": trueBoolFlag(\\.failIfNoop),\n\n            \"--stdin\": optionalTrueBoolFlag(\\.explicitStdinFlag),\n            \"--no-stdin\": optionalFalseBoolFlag(\\.explicitStdinFlag),\n        ],\n        posArgs: [newMandatoryPosArgParser(\\.target, parseWorkspaceTarget, placeholder: workspaceTargetPlaceholder)],\n        conflictingOptions: [\n            [\"--stdin\", \"--no-stdin\"],\n        ],\n    )\n\n    public var target: Lateinit<WorkspaceTarget> = .uninitialized\n    public var _autoBackAndForth: Bool?\n    public var failIfNoop: Bool = false\n    public var _wrapAround: Bool?\n    public var explicitStdinFlag: Bool? = nil\n}\n\nfunc parseWorkspaceCmdArgs(_ args: StrArrSlice) -> ParsedCmd<WorkspaceCmdArgs> {\n    parseSpecificCmdArgs(WorkspaceCmdArgs(rawArgs: args), args)\n        .filter(\"--wrapAround requires using \\(NextPrev.unionLiteral) argument\") { ($0._wrapAround != nil).implies($0.target.val.isRelatve) }\n        .filterNot(\"--auto-back-and-forth is incompatible with \\(NextPrev.unionLiteral)\") { $0._autoBackAndForth != nil && $0.target.val.isRelatve }\n        .filterNot(\"--fail-if-noop is incompatible with \\(NextPrev.unionLiteral)\") { $0.failIfNoop && $0.target.val.isRelatve }\n        .filterNot(\"--fail-if-noop is incompatible with --auto-back-and-forth\") { $0.autoBackAndForth && $0.failIfNoop }\n        .filter(\"--stdin and --no-stdin require using \\(NextPrev.unionLiteral) argument\") { ($0.explicitStdinFlag != nil).implies($0.target.val.isRelatve) }\n}\n\nextension WorkspaceCmdArgs {\n    public var wrapAround: Bool { _wrapAround ?? false }\n    public var autoBackAndForth: Bool { _autoBackAndForth ?? false }\n    public var useStdin: Bool { explicitStdinFlag ?? false }\n}\n\npublic enum WorkspaceTarget: Equatable, Sendable {\n    case relative(NextPrev)\n    case direct(WorkspaceName)\n\n    public var isRelatve: Bool {\n        switch self {\n            case .relative: true\n            default: false\n        }\n    }\n\n    public func workspaceNameOrNil() -> WorkspaceName? {\n        switch self {\n            case .direct(let name): name\n            case .relative: nil\n        }\n    }\n}\n\nlet workspaceTargetPlaceholder = \"(<workspace-name>|next|prev)\"\n\nfunc parseWorkspaceTarget(i: PosArgParserInput) -> ParsedCliArgs<WorkspaceTarget> {\n    switch i.arg {\n        case \"next\": .succ(.relative(.next), advanceBy: 1)\n        case \"prev\": .succ(.relative(.prev), advanceBy: 1)\n        default: .init(WorkspaceName.parse(i.arg).map(WorkspaceTarget.direct), advanceBy: 1)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/parseCmdArgs.swift",
    "content": "public func parseCmdArgs(_ args: StrArrSlice) -> ParsedCmd<any CmdArgs> {\n    let subcommand = String(args.first ?? \"\")\n    if subcommand.isEmpty {\n        return .failure(\"Can't parse empty string command\")\n    }\n    if let subcommandParser: any SubCommandParserProtocol = subcommandParsers[subcommand] {\n        return subcommandParser.parse(args: args.slice(1...).orDie())\n    } else {\n        return .failure(\"Unrecognized subcommand '\\(subcommand)'\")\n    }\n}\n\npublic protocol CmdArgs: ConvenienceCopyable, Equatable, CustomStringConvertible, AeroAny, Sendable {\n    static var parser: CmdParser<Self> { get }\n    var commonState: CmdArgsCommonState { get set }\n}\n\npublic struct CmdArgsCommonState: ConvenienceCopyable, Equatable, Sendable {\n    let rawArgsForStrRepr: EquatableNoop<StrArrSlice>\n    var windowId: UInt32? = nil\n    var workspaceName: WorkspaceName? = nil\n\n    public init(_ raw: StrArrSlice) { rawArgsForStrRepr = .init(raw) }\n}\n\nextension CmdArgs {\n    public static var info: CmdStaticInfo { Self.parser.info }\n\n    public var windowId: UInt32? {\n        get { commonState.windowId }\n        set(value) { commonState.windowId = value }\n    }\n\n    public var workspaceName: WorkspaceName? {\n        get { commonState.workspaceName }\n        set(value) { commonState.workspaceName = value }\n    }\n\n    public func equals(_ other: any CmdArgs) -> Bool { // My brain is cursed with Java\n        (other as? Self).flatMap { self == $0 } ?? false\n    }\n\n    public var description: String {\n        switch Self.info.kind {\n            case .execAndForget:\n                CmdKind.execAndForget.rawValue + \" \" + (self as! ExecAndForgetCmdArgs).bashScript\n            default:\n                ([Self.info.kind.rawValue] + commonState.rawArgsForStrRepr.value.toArray()).joinArgs()\n        }\n    }\n}\n\npublic struct CmdParser<Root>: Sendable {\n    let info: CmdStaticInfo\n    let flags: [String: any ArgParserProtocol<SubArgParserInput, Root, ()>]\n    let positionalArgs: [any ArgParserProtocol<PosArgParserInput, Root, PosArgParserContext>]\n    let conflictingOptions: [Set<String>]\n\n    init(\n        kind: CmdKind,\n        allowInConfig: Bool,\n        help: String,\n        flags: [String: any ArgParserProtocol<SubArgParserInput, Root, ()>],\n        posArgs: [any ArgParserProtocol<PosArgParserInput, Root, PosArgParserContext>],\n        conflictingOptions: [Set<String>] = [],\n    ) {\n        self.info = CmdStaticInfo(help: help, kind: kind, allowInConfig: allowInConfig)\n        self.flags = flags\n        self.positionalArgs = posArgs\n        self.conflictingOptions = conflictingOptions\n    }\n}\n\npublic struct CmdStaticInfo: Equatable, Sendable {\n    public let help: String\n    public let kind: CmdKind\n    public let allowInConfig: Bool // Query commands are prohibited in config\n\n    public init(\n        help: String,\n        kind: CmdKind,\n        allowInConfig: Bool,\n    ) {\n        self.help = help\n        self.kind = kind\n        self.allowInConfig = allowInConfig\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/parseSpecificCmdArgs.swift",
    "content": "func parseSpecificCmdArgs<T: CmdArgs>(_ raw: T, _ args: StrArrSlice) -> ParsedCmd<T> {\n    var raw = raw\n    var errors: [String] = []\n\n    var posArgumentParserIndex = 0\n    var options: Set<String> = Set()\n    var index = 0\n\n    while index < args.count {\n        let arg = args[index]\n        if arg == \"-h\" || arg == \"--help\" {\n            return .help(T.info.help)\n        } else if arg.starts(with: \"-\") && !isResizeNegativeUnitsArg(raw, arg: arg) {\n            if let optionParser = T.parser.flags[arg] {\n                index += 1\n                if !options.insert(arg).inserted {\n                    errors.append(\"Duplicated option \\(arg.singleQuoted)\")\n                }\n                raw = optionParser.transformRaw(raw, &index, SubArgParserInput(superArg: arg, index: index, args: args), &errors)\n            } else {\n                errors.append(\"Unknown flag \\(arg.singleQuoted)\")\n                break\n            }\n        } else if let parser = T.parser.positionalArgs.getOrNil(atIndex: posArgumentParserIndex) {\n            raw = parser.transformRaw(raw, &index, PosArgParserInput(index: index, args: args), &errors)\n            posArgumentParserIndex += 1\n        } else {\n            errors.append(\"Unknown argument \\(arg.singleQuoted)\")\n            break\n        }\n    }\n\n    for arg in T.parser.positionalArgs[posArgumentParserIndex...] {\n        if let placeholder = arg.context.argPlaceholderIfMandatory {\n            errors.append(\"Argument \\(placeholder.singleQuoted) is mandatory\")\n        }\n    }\n\n    for conflictSet in T.parser.conflictingOptions {\n        let mutualOptions = conflictSet.intersection(options)\n        if mutualOptions.count > 1 {\n            errors.append(\"Conflicting options: \\(mutualOptions.sorted().joined(separator: \", \"))\")\n            break\n        }\n    }\n\n    return errors.isEmpty ? .cmd(raw) : .failure(errors.joinErrors())\n}\n\npublic enum ParsedCmd<T: Sendable>: Sendable {\n    case cmd(T)\n    case help(String)\n    case failure(String)\n\n    public func map<R>(_ mapper: (T) -> R) -> ParsedCmd<R> {\n        flatMap { .cmd(mapper($0)) }\n    }\n\n    public func filter(_ msg: @autoclosure () -> String, _ predicate: (T) -> Bool) -> ParsedCmd<T> {\n        flatMap { this in predicate(this) ? .cmd(this) : .failure(msg()) }\n    }\n\n    public func filterNot(_ msg: @autoclosure () -> String, _ predicate: (T) -> Bool) -> ParsedCmd<T> {\n        flatMap { this in !predicate(this) ? .cmd(this) : .failure(msg()) }\n    }\n\n    public func flatMap<R>(_ mapper: (T) -> ParsedCmd<R>) -> ParsedCmd<R> {\n        return switch self {\n            case .cmd(let cmd): mapper(cmd)\n            case .help(let help): .help(help)\n            case .failure(let fail): .failure(fail)\n        }\n    }\n\n    public var cmdOrNil: T? {\n        switch self {\n            case .cmd(let t): t\n            default: nil\n        }\n    }\n\n    public func unwrap() -> (T?, String?, String?) {\n        switch self {\n            case .cmd(let command):   (command, nil, nil)\n            case .help(let help):     (nil, help, nil)\n            case .failure(let error): (nil, nil, error)\n        }\n    }\n}\n\nextension ArgParserProtocol where Root: ConvenienceCopyable {\n    fileprivate func transformRaw(_ raw: consuming Root, _ index: inout Int, _ input: Input, _ errors: inout [String]) -> Root {\n        let parsedCliArgs = parse(input)\n        index += parsedCliArgs.advanceBy\n        if let value = parsedCliArgs.value.getOrNil(appendErrorTo: &errors) {\n            return raw.copy(keyPath, value)\n        } else {\n            return raw\n        }\n    }\n}\n\n// Hack to preserve backwards compatibility\nprivate func isResizeNegativeUnitsArg(_ raw: any CmdArgs, arg: String) -> Bool {\n    var iter = arg.makeIterator()\n    return raw is ResizeCmdArgs && iter.next() == \"-\" && iter.next()?.isNumber == true\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/splitArgs.swift",
    "content": "extension String {\n    // Input: \"  foo   bar \". Output: [\"foo\", \"bar\"]\n    // Input \"foo 'bar baz'\". Output [\"foo\", \"bar baz\"]\n    public func splitArgs() -> Parsed<[String]> {\n        var result: [String] = []\n        var arg: String = \"\"\n        var state: State = .parseArgWhitespaceSeparator\n        for char in self {\n            switch state { // State machine\n                case .parseArgWhitespaceSeparator:\n                    if char == \"\\\"\" || char == \"\\'\" {\n                        state = .parseArg(quoteChar: char)\n                    } else if !char.isWhitespace {\n                        state = .parseArg(quoteChar: nil)\n                        arg.append(char)\n                    }\n                case .parseArg(let quoteChar):\n                    if quoteChar == char {\n                        result.append(arg)\n                        arg = \"\"\n                        state = .parseArgWhitespaceSeparator\n                    } else if quoteChar == nil && char.isWhitespace {\n                        result.append(arg)\n                        state = .parseArgWhitespaceSeparator\n                        arg = \"\"\n                    } else if quoteChar == nil && char.isQuote {\n                        return .failure(\"Unexpected quote \\(char) in argument '\\(arg)'\")\n                    } else {\n                        arg.append(char)\n                    }\n            }\n        }\n        if case .parseArg(let quoteChar) = state {\n            if let quoteChar {\n                return .failure(\"Last quote \\(quoteChar) isn't closed\")\n            } else {\n                result.append(arg)\n            }\n        }\n        return .success(result)\n    }\n}\n\nextension Character {\n    fileprivate var isQuote: Bool { self == \"\\'\" || self == \"\\\"\" }\n}\n\nprivate enum State {\n    case parseArg(quoteChar: Character?)\n    case parseArgWhitespaceSeparator\n}\n\nextension [String] {\n    public func joinArgs() -> String {\n        self.map {\n            let containsWhitespaces = $0.rangeOfCharacter(from: .whitespacesAndNewlines) != nil\n            let containsSingleQuote = $0.contains(\"'\")\n            let containsDoubleQuote = $0.contains(\"\\\"\")\n            return switch true {\n                case containsDoubleQuote && !containsSingleQuote:\n                    $0.quoted(with: \"'\")\n                case containsSingleQuote && !containsDoubleQuote:\n                    $0.quoted(with: \"\\\"\")\n                case containsSingleQuote && containsDoubleQuote:\n                    // Technically shouldn't be possible according to splitArgs\n                    $0.replacing(\"'\", with: \"\\\\'\").replacing(\"\\\"\", with: \"\\\\\\\"\").quoted(with: \"\\\"\")\n                case containsWhitespaces:\n                    $0.quoted(with: \"'\")\n                default:\n                    $0\n            }\n        }.joined(separator: \" \")\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdArgs/subcommandParsers.swift",
    "content": "let subcommandParsers: [String: any SubCommandParserProtocol] = initSubcommands()\n\nprotocol SubCommandParserProtocol<T>: Sendable {\n    associatedtype T where T: CmdArgs\n    var _parse: @Sendable (StrArrSlice) -> ParsedCmd<T> { get }\n}\n\nextension SubCommandParserProtocol {\n    func parse(args: StrArrSlice) -> ParsedCmd<any CmdArgs> {\n        _parse(args).map { $0 }\n    }\n}\n\nstruct SubCommandParser<T: CmdArgs>: SubCommandParserProtocol, Sendable {\n    let _parse: @Sendable (StrArrSlice) -> ParsedCmd<T>\n\n    init(_ parser: @escaping @Sendable (StrArrSlice) -> ParsedCmd<T>) {\n        _parse = parser\n    }\n\n    init(_ raw: @escaping @Sendable (StrArrSlice) -> T) {\n        _parse = { args in parseSpecificCmdArgs(raw(args), args) }\n    }\n}\n"
  },
  {
    "path": "Sources/Common/cmdHelpGenerated.swift",
    "content": "// FILE IS GENERATED FROM docs/aerospace-*.adoc files\n// TO REGENERATE THE FILE RUN generate.sh\n\nlet balance_sizes_help_generated = \"\"\"\n    USAGE: balance-sizes [-h|--help] [--workspace <workspace>]\n    \"\"\"\nlet close_all_windows_but_current_help_generated = \"\"\"\n    USAGE: close-all-windows-but-current [-h|--help] [--quit-if-last-window]\n    \"\"\"\nlet close_help_generated = \"\"\"\n    USAGE: close [-h|--help] [--quit-if-last-window] [--window-id <window-id>]\n    \"\"\"\nlet config_help_generated = \"\"\"\n    USAGE: config [-h|--help] --get <name> [--json] [--keys]\n       OR: config [-h|--help] --major-keys\n       OR: config [-h|--help] --all-keys\n       OR: config [-h|--help] --config-path\n    \"\"\"\nlet debug_windows_help_generated = \"\"\"\n    USAGE: debug-windows [-h|--help] [--window-id <window-id>]\n    \"\"\"\nlet enable_help_generated = \"\"\"\n    USAGE: enable [-h|--help] toggle\n       OR: enable [-h|--help] on [--fail-if-noop]\n       OR: enable [-h|--help] off [--fail-if-noop]\n    \"\"\"\nlet exec_and_forget_help_generated = \"\"\"\n    USAGE: exec-and-forget <bash-script>\n    \"\"\"\nlet flatten_workspace_tree_help_generated = \"\"\"\n    USAGE: flatten-workspace-tree [-h|--help] [--workspace <workspace>]\n    \"\"\"\nlet focus_back_and_forth_help_generated = \"\"\"\n    USAGE: focus-back-and-forth [-h|--help]\n    \"\"\"\nlet focus_monitor_help_generated = \"\"\"\n    USAGE: focus-monitor [-h|--help] [--wrap-around] (left|down|up|right)\n       OR: focus-monitor [-h|--help] [--wrap-around] (next|prev)\n       OR: focus-monitor [-h|--help] <monitor-pattern>...\n    \"\"\"\nlet focus_help_generated = \"\"\"\n    USAGE: focus [-h|--help] [--ignore-floating] [--wrap-around]\n                 [--boundaries <boundary>] [--boundaries-action <action>]\n                 (left|down|up|right)\n       OR: focus [-h|--help] [--ignore-floating] [--wrap-around]\n                 [--boundaries <boundary>] [--boundaries-action <action>]\n                 (dfs-next|dfs-prev)\n       OR: focus [-h|--help] --window-id <window-id>\n       OR: focus [-h|--help] --dfs-index <dfs-index>\n    \"\"\"\nlet fullscreen_help_generated = \"\"\"\n    USAGE: fullscreen [-h|--help]     [--window-id <window-id>] [--no-outer-gaps]\n       OR: fullscreen [-h|--help] on  [--window-id <window-id>] [--no-outer-gaps] [--fail-if-noop]\n       OR: fullscreen [-h|--help] off [--window-id <window-id>] [--fail-if-noop]\n    \"\"\"\nlet join_with_help_generated = \"\"\"\n    USAGE: join-with [-h|--help] [--window-id <window-id>] (left|down|up|right)\n    \"\"\"\nlet layout_help_generated = \"\"\"\n    USAGE: layout [-h|--help] [--window-id <window-id>]\n                  (h_tiles|v_tiles|h_accordion|v_accordion|tiles|accordion|horizontal|vertical|tiling|floating)...\n    \"\"\"\nlet list_apps_help_generated = \"\"\"\n    USAGE: list-apps [-h|--help] [--macos-native-hidden [no]] [--format <output-format>] [--count] [--json]\n    \"\"\"\nlet list_exec_env_vars_help_generated = \"\"\"\n    USAGE: list-exec-env-vars [-h|--help]\n    \"\"\"\nlet list_modes_help_generated = \"\"\"\n    USAGE: list-modes [-h|--help] [--current] [--count] [--json]\n    \"\"\"\nlet list_monitors_help_generated = \"\"\"\n    USAGE: list-monitors [-h|--help] [--focused [no]] [--mouse [no]] [--format <output-format>] [--count] [--json]\n    \"\"\"\nlet list_windows_help_generated = \"\"\"\n    USAGE: list-windows [-h|--help] (--workspace <workspace>...|--monitor <monitor>...)\n                        [--monitor <monitor>...] [--workspace <workspace>...]\n                        [--pid <pid>] [--app-bundle-id <app-bundle-id>] [--format <output-format>]\n                        [--count] [--json]\n       OR: list-windows [-h|--help] --all [--format <output-format>] [--count] [--json]\n       OR: list-windows [-h|--help] --focused [--format <output-format>] [--count] [--json]\n    \"\"\"\nlet list_workspaces_help_generated = \"\"\"\n    USAGE: list-workspaces [-h|--help] --monitor <monitor>... [--visible [no]] [--empty [no]] [--format <output-format>] [--count] [--json]\n       OR: list-workspaces [-h|--help] --all [--format <output-format>] [--count] [--json]\n       OR: list-workspaces [-h|--help] --focused [--format <output-format>] [--count] [--json]\n    \"\"\"\nlet macos_native_fullscreen_help_generated = \"\"\"\n    USAGE: macos-native-fullscreen [-h|--help] [--window-id <window-id>]\n       OR: macos-native-fullscreen [-h|--help] [--window-id <window-id>] [--fail-if-noop] on\n       OR: macos-native-fullscreen [-h|--help] [--window-id <window-id>] [--fail-if-noop] off\n    \"\"\"\nlet macos_native_minimize_help_generated = \"\"\"\n    USAGE: macos-native-minimize [-h|--help] [--window-id <window-id>]\n    \"\"\"\nlet mode_help_generated = \"\"\"\n    USAGE: mode [-h|--help] <binding-mode>\n    \"\"\"\nlet move_mouse_help_generated = \"\"\"\n    USAGE: move-mouse [-h|--help] [--fail-if-noop] <mouse-position>\n    \"\"\"\nlet move_node_to_monitor_help_generated = \"\"\"\n    USAGE: move-node-to-monitor [-h|--help] [--window-id <window-id>] [--focus-follows-window]\n                                [--wrap-around] (left|down|up|right|next|prev)\n       OR: move-node-to-monitor [-h|--help] [--window-id <window-id>] [--focus-follows-window]\n                                [--fail-if-noop] <monitor-pattern>...\n    \"\"\"\nlet move_node_to_workspace_help_generated = \"\"\"\n    USAGE: move-node-to-workspace [-h|--help] [--focus-follows-window] [--wrap-around]\n                                  [--stdin|--no-stdin]\n                                  (next|prev)\n       OR: move-node-to-workspace [-h|--help] [--focus-follows-window] [--fail-if-noop]\n                                  [--window-id <window-id>] <workspace-name>\n    \"\"\"\nlet move_workspace_to_monitor_help_generated = \"\"\"\n    USAGE: move-workspace-to-monitor [-h|--help] [--workspace <workspace>] [--wrap-around] (left|down|up|right)\n       OR: move-workspace-to-monitor [-h|--help] [--workspace <workspace>] [--wrap-around] (next|prev)\n       OR: move-workspace-to-monitor [-h|--help] [--workspace <workspace>] <monitor-pattern>...\n    \"\"\"\nlet move_help_generated = \"\"\"\n    USAGE: move [-h|--help] [--window-id <window-id>] [--boundaries <boundary>] [--boundaries-action <boundary-action>] (left|down|up|right)\n    \"\"\"\nlet reload_config_help_generated = \"\"\"\n    USAGE: reload-config [-h|--help] [--no-gui] [--dry-run]\n    \"\"\"\nlet resize_help_generated = \"\"\"\n    USAGE: resize [-h|--help] [--window-id <window-id>] (smart|smart-opposite|width|height) [+|-]<number>\n    \"\"\"\nlet split_help_generated = \"\"\"\n    USAGE: split [-h|--help] [--window-id <window-id>] (horizontal|vertical|opposite)\n    \"\"\"\nlet subscribe_help_generated = \"\"\"\n    USAGE: subscribe [-h|--help] [--all] [--no-send-initial] [<event>...]\n    \"\"\"\nlet summon_workspace_help_generated = \"\"\"\n    USAGE: summon-workspace [-h|--help] [--fail-if-noop] <workspace>\n    \"\"\"\nlet swap_help_generated = \"\"\"\n    USAGE: swap [-h|--help] [--window-id <window-id>] [--swap-focus]\n                [--wrap-around]\n                (left|down|up|right|dfs-next|dfs-prev)\n    \"\"\"\nlet trigger_binding_help_generated = \"\"\"\n    USAGE: trigger-binding [-h|--help] <binding> --mode <mode-id>\n    \"\"\"\nlet volume_help_generated = \"\"\"\n    USAGE: volume [-h|--help] (up|down) [--no-gui]\n       OR: volume [-h|--help] (mute-toggle|mute-off|mute-on) [--no-gui]\n       OR: volume [-h|--help] set <number> [--no-gui]\n    \"\"\"\nlet workspace_back_and_forth_help_generated = \"\"\"\n    USAGE: workspace-back-and-forth [-h|--help]\n    \"\"\"\nlet workspace_help_generated = \"\"\"\n    USAGE: workspace [-h|--help] [--auto-back-and-forth] [--fail-if-noop] <workspace-name>\n       OR: workspace [-h|--help] [--wrap-around] [--stdin|--no-stdin] (next|prev)\n    \"\"\"\n"
  },
  {
    "path": "Sources/Common/gitHashGenerated.swift",
    "content": "// FILE IS GENERATED BY generate.sh\npublic let gitHash = \"SNAPSHOT\"\npublic let gitShortHash = \"SNAPSHOT\"\n"
  },
  {
    "path": "Sources/Common/model/AeroSpaceEnvVars.swift",
    "content": "public let AEROSPACE_WINDOW_ID = \"AEROSPACE_WINDOW_ID\"\npublic let AEROSPACE_WORKSPACE = \"AEROSPACE_WORKSPACE\"\n"
  },
  {
    "path": "Sources/Common/model/AxAppThreadToken.swift",
    "content": "import Foundation\n\n@TaskLocal\npublic var axTaskLocalAppThreadToken: AxAppThreadToken? = nil\n\npublic struct AxAppThreadToken: Sendable, Equatable, CustomStringConvertible {\n    public let pid: pid_t\n    public let idForDebug: String\n\n    public init(pid: pid_t, idForDebug: String) {\n        self.pid = pid\n        self.idForDebug = idForDebug\n    }\n\n    public static func == (lhs: Self, rhs: Self) -> Bool { lhs.pid == rhs.pid }\n\n    public func checkEquals(_ other: AxAppThreadToken?) {\n        check(self == other, \"\\(self) != \\(other.prettyDescription)\")\n    }\n\n    public var description: String { idForDebug }\n}\n"
  },
  {
    "path": "Sources/Common/model/CardinalDirection.swift",
    "content": "public enum CardinalDirection: String, CaseIterable, Equatable, Sendable {\n    case left, down, up, right\n\n    public var orientation: Orientation { self == .up || self == .down ? .v : .h }\n    public var isPositive: Bool { self == .down || self == .right }\n    public var opposite: CardinalDirection {\n        return switch self {\n            case .left: .right\n            case .down: .up\n            case .up: .down\n            case .right: .left\n        }\n    }\n    public var focusOffset: Int { isPositive ? 1 : -1 }\n    public var insertionOffset: Int { isPositive ? 1 : 0 }\n}\n"
  },
  {
    "path": "Sources/Common/model/CardinalOrDfsDirection.swift",
    "content": "public enum CardinalOrDfsDirection: Equatable, Sendable {\n    case direction(CardinalDirection)\n    case dfsRelative(DfsNextPrev)\n}\n\nextension CardinalOrDfsDirection: CaseIterable {\n    public static var allCases: [CardinalOrDfsDirection] {\n        CardinalDirection.allCases.map { .direction($0) } + DfsNextPrev.allCases.map { .dfsRelative($0) }\n    }\n}\n\nextension CardinalOrDfsDirection: RawRepresentable {\n    public typealias RawValue = String\n\n    public init?(rawValue: RawValue) {\n        if let d = CardinalDirection(rawValue: rawValue) {\n            self = .direction(d)\n        } else if let np = DfsNextPrev(rawValue: rawValue) {\n            self = .dfsRelative(np)\n        } else {\n            return nil\n        }\n    }\n\n    public var rawValue: RawValue {\n        return switch self {\n            case .direction(let d): d.rawValue\n            case .dfsRelative(let np): np.rawValue\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/Common/model/DfsNextPrev.swift",
    "content": "public enum DfsNextPrev: String, CaseIterable, Equatable, Sendable {\n    case dfsNext = \"dfs-next\"\n    case dfsPrev = \"dfs-prev\"\n}\n"
  },
  {
    "path": "Sources/Common/model/Init.swift",
    "content": "nonisolated(unsafe) public var isCli = true\nvar isServer: Bool { !isCli }\n\nnonisolated(unsafe) public var terminationHandler: TerminationHandler = EmptyTerminationHandler()\n\nstruct EmptyTerminationHandler: TerminationHandler {\n    func beforeTermination() {}\n}\n\n@MainActor\npublic protocol TerminationHandler: Sendable {\n    func beforeTermination() async throws\n}\n"
  },
  {
    "path": "Sources/Common/model/MonitorDescription.swift",
    "content": "public enum MonitorDescription: Equatable, Sendable {\n    case sequenceNumber(Int)\n    case main\n    case secondary\n    case pattern(String, SendableRegex<AnyRegexOutput>)\n\n    public static func == (lhs: MonitorDescription, rhs: MonitorDescription) -> Bool {\n        return switch (lhs, rhs) {\n            case (.main, .main): true\n            case (.secondary, .secondary): true\n            case (.sequenceNumber(let a), .sequenceNumber(let b)): a == b\n            case (.pattern(let a, _), .pattern(let b, _)): a == b\n            default: false\n        }\n    }\n\n    public static func caseSensitivePattern(_ raw: String) -> MonitorDescription? {\n        (try? SendableRegex(raw)).flatMap { .pattern(raw, $0) }\n    }\n}\n\npublic func parseMonitorDescription(_ raw: String) -> Parsed<MonitorDescription> {\n    if let int = Int(raw) {\n        return int >= 1\n            ? .success(.sequenceNumber(int))\n            : .failure(\"Monitor sequence numbers uses 1-based indexing. Values less than 1 are illegal\")\n    }\n    if raw == \"main\" {\n        return .success(.main)\n    }\n    if raw == \"secondary\" {\n        return .success(.secondary)\n    }\n\n    return raw.isEmpty\n        ? .failure(\"Empty string is an illegal monitor description\")\n        : parseCaseInsensitiveRegex(raw).map { MonitorDescription.pattern(raw, .init($0)) }\n}\n\npublic func parseCaseInsensitiveRegex(_ raw: String) -> Parsed<Regex<AnyRegexOutput>> {\n    Result { try Regex(raw) }\n        .mapError { e in \"Can't parse '\\(raw)' regex. \\(e.localizedDescription)\" }\n        .map { $0.ignoresCase() }\n}\n\n/// Circumvent Regex not being Sendable by default\npublic struct SendableRegex<Output>: Sendable {\n    nonisolated(unsafe) public let val: Regex<Output>\n    init(_ regex: Regex<Output>) { self.val = regex }\n    // init(_ str: String) { self.regex = regex }\n}\n\nextension SendableRegex where Output == AnyRegexOutput {\n    public init(_ pattern: String) throws {\n        self = SendableRegex(try Regex(pattern))\n    }\n}\n"
  },
  {
    "path": "Sources/Common/model/NextPrev.swift",
    "content": "public enum NextPrev: String, Equatable, Sendable, CaseIterable {\n    case next, prev\n}\n"
  },
  {
    "path": "Sources/Common/model/Orientation.swift",
    "content": "public enum Orientation: Sendable {\n    /// Windows are planced along the **horizontal** line\n    /// x-axis\n    case h\n    /// Windows are planced along the **vertical** line\n    /// y-axis\n    case v\n}\n\nextension Orientation {\n    public var opposite: Orientation { self == .h ? .v : .h }\n}\n"
  },
  {
    "path": "Sources/Common/model/WorkspaceName.swift",
    "content": "public struct WorkspaceName: Equatable, Sendable {\n    public let raw: String\n\n    private init(_ raw: String) {\n        self.raw = raw\n    }\n\n    public static func parse(_ raw: String) -> Parsed<WorkspaceName> {\n        // reserved names\n        if raw == \"focused\" || raw == \"non-focused\" ||\n            raw == \"visible\" || raw == \"invisible\" || raw == \"non-visible\" ||\n            raw == \"active\" || raw == \"non-active\" || raw == \"inactive\" ||\n            raw == \"back-and-forth\" || raw == \"back_and_forth\" || raw == \"previous\" ||\n            raw == \"prev\" || raw == \"next\" ||\n            raw == \"monitor\" || raw == \"workspace\" ||\n            raw == \"monitors\" || raw == \"workspaces\" ||\n            raw == \"all\" || raw == \"none\" ||\n            raw == \"mouse\" || raw == \"target\"\n        {\n            return .failure(\"'\\(raw)' is a reserved workspace name\")\n        }\n        if raw.isEmpty {\n            return .failure(\"Empty workspace name is forbidden\")\n        }\n        if raw.contains(\",\") {\n            return .failure(\"Workspace names are not allowed to contain comma\")\n        }\n        if raw.starts(with: \"_\") {\n            return .failure(\"Workspace names starting with underscore are reserved for future use\")\n        }\n        if raw.starts(with: \"-\") {\n            // The syntax conflicts with CLI options. E.g. list-windows --workspace -foo\n            return .failure(\"Workspace names starting with dash are disallowed\")\n        }\n        if raw.rangeOfCharacter(from: .whitespacesAndNewlines) != nil {\n            return .failure(\"Whitespace characters are forbidden in workspace names\")\n        }\n        return .success(WorkspaceName(raw))\n    }\n}\n"
  },
  {
    "path": "Sources/Common/model/clientServer.swift",
    "content": "import Foundation\n\n// TO EVERYONE REVERSE-ENGINEERING THE PROTOCOL\n// client-server socket API is not public yet.\n// Tracking issue for making it public: https://github.com/nikitabobko/AeroSpace/issues/1513\npublic struct ServerAnswer: Codable, Sendable {\n    public let exitCode: Int32\n    public let stdout: String\n    public var stderr: String\n    public let serverVersionAndHash: String\n\n    public init(\n        exitCode: Int32,\n        stdout: String = \"\",\n        stderr: String = \"\",\n        serverVersionAndHash: String,\n    ) {\n        self.exitCode = exitCode\n        self.stdout = stdout\n        self.stderr = stderr\n        self.serverVersionAndHash = serverVersionAndHash\n    }\n}\n\n// TO EVERYONE REVERSE-ENGINEERING THE PROTOCOL\n// client-server socket API is not public yet.\n// Tracking issue for making it public: https://github.com/nikitabobko/AeroSpace/issues/1513\npublic struct ClientRequest: Codable, Sendable, ConvenienceCopyable, Equatable {\n    // periphery:ignore - Unused. keep it for API compatibility with old servers for a couple of version\n    public var command: String? = nil\n\n    public let args: [String]\n    public let stdin: String\n\n    // Double Optional to encode explicit null into JSON\n    public var windowId: UInt32??  // Please forward AEROSPACE_WINDOW_ID env variable here\n    public var workspace: String?? // Please forward AEROSPACE_WORKSPACE env variable here\n\n    public init(\n        args: [String],\n        stdin: String,\n        windowId: UInt32?,\n        workspace: String?,\n    ) {\n        self.args = args\n        self.stdin = stdin\n        self.windowId = .some(windowId)\n        self.workspace = .some(workspace)\n    }\n\n    public static func decodeJson(_ data: Data) -> Result<ClientRequest, String> {\n        Result { try JSONDecoder().decode(Self.self, from: data) }.mapError { $0.localizedDescription }\n    }\n\n    enum CodingKeys: String, CodingKey {\n        case args\n        case stdin\n        case windowId\n        case workspace\n    }\n\n    public init(from decoder: any Decoder) throws {\n        let data = try ClientRequestData.init(from: decoder)\n        var raw = ClientRequest(\n            args: data.args,\n            stdin: data.stdin,\n            windowId: data.windowId.flatMap { $0 },\n            workspace: data.workspace.flatMap { $0 },\n        )\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        if !container.contains(.windowId) { raw.windowId = nil }\n        if !container.contains(.workspace) { raw.workspace = nil }\n        self = raw\n    }\n}\n\nprivate struct ClientRequestData: Codable, Sendable {\n    var args: [String]\n    var stdin: String\n    var windowId: UInt32??\n    var workspace: String??\n}\n"
  },
  {
    "path": "Sources/Common/model/sponsorshipPrompts.swift",
    "content": "public let sponsorshipPrompts = [\n    \"AeroSpace is a side project\\nSponsor if it helps you\",\n    \"AeroSpace is built in my free time\\nYour support means a lot\",\n    \"AeroSpace is free and open-source\\nYour support matters\",\n    \"Enjoying AeroSpace?\\nYou can help keep it going\",\n]\n"
  },
  {
    "path": "Sources/Common/util/AeroAny.swift",
    "content": "import Foundation\nimport AppKit\n\npublic protocol AeroAny {}\n\nextension AeroAny {\n    @discardableResult\n    @inlinable\n    public func apply(_ block: (Self) -> Void) -> Self {\n        block(self)\n        return self\n    }\n\n    @discardableResult\n    @inlinable\n    public func also(_ block: (Self) -> Void) -> Self {\n        block(self)\n        return self\n    }\n\n    @inlinable public func takeIf(_ predicate: (Self) -> Bool) -> Self? { predicate(self) ? self : nil }\n    @inlinable public func then<R>(_ body: (Self) -> R) -> R { body(self) }\n}\n\nextension Int: AeroAny {}\nextension String: AeroAny {}\nextension Character: AeroAny {}\nextension Regex: AeroAny {}\nextension Array: AeroAny {}\nextension URL: AeroAny {}\nextension CGFloat: AeroAny {}\nextension AXUIElement: AeroAny {}\nextension CGPoint: AeroAny {}\n"
  },
  {
    "path": "Sources/Common/util/ArrSlice.swift",
    "content": "import Foundation\n\npublic typealias StrArrSlice = ArrSlice<String>\n\n// The default ArraySlice that is shiped with Swift stdlib is wrong (my subjective opinion). Their subscript is not zero-based.\n// Their Slice is not properly encapsulated\n//\n// That's why we declare our own ArrSlice\npublic struct ArrSlice<Element>: Sequence, AeroAny, ExpressibleByArrayLiteral, RandomAccessCollection {\n    fileprivate let backing: [Element]\n    fileprivate let offsetInBacking: Int\n    /*conforms*/ public let count: Int\n\n    /*conforms*/ public init(arrayLiteral elements: Element...) {\n        self.init(elements, 0 ..< elements.count)\n    }\n\n    private init(_ backing: [Element], _ range: Range<Int>) {\n        self.backing = range.isEmpty ? [] : backing\n        self.offsetInBacking = range.isEmpty ? 0 : range.startIndex\n        self.count = range.count\n    }\n\n    public static func new(_ backing: [Element], _ range: Range<Int>) -> Self? {\n        range.isSubRange(of: backing.indices) ? .init(backing, range) : nil\n    }\n\n    public subscript(_ zeroBasedIndex: Int) -> Element {\n        check(indices.contains(zeroBasedIndex))\n        return backing[zeroBasedIndex + offsetInBacking]\n    }\n\n    /*conforms*/ public var startIndex: Int { 0 }\n    /*conforms*/ public var endIndex: Int { count }\n    /*conforms*/ public func index(after i: Int) -> Int { i + 1 }\n    public func getOrNil(atIndex index: Int) -> Element? { indices.contains(index) ? self[index] : nil }\n    /*conforms*/ public var indices: Range<Int> { 0 ..< count }\n    public func makeIterator() -> some IteratorProtocol<Element> { ArrSliceIterator(backing: self) }\n    public func toArray() -> [Element] { Array(self) }\n}\n\nprivate struct ArrSliceIterator<Element>: IteratorProtocol {\n    fileprivate let backing: ArrSlice<Element>\n    fileprivate var index: Int = 0\n\n    mutating func next() -> Element? {\n        if index < backing.count {\n            let value = backing[index]\n            index += 1\n            return value\n        } else {\n            return nil\n        }\n    }\n}\n\nextension ArrSlice: Sendable where Element: Sendable {}\n\nextension ArrSlice: Equatable where Element: Equatable {\n    public static func == (lhs: Self, rhs: Self) -> Bool {\n        if lhs.count != rhs.count { return false }\n        for i in lhs.indices {\n            if lhs[i] != rhs[i] { return false }\n        }\n        return true\n    }\n}\n\n// periphery:ignore\nextension Array {\n    public var slice: ArrSlice<Element> { slice(0 ..< count).orDie() }\n    public func slice(_ range: PartialRangeFrom<Int>) -> ArrSlice<Element>? { slice(range.lowerBound ..< count) }\n    public func slice(_ range: PartialRangeUpTo<Int>) -> ArrSlice<Element>? { slice(0 ..< range.upperBound) }\n\n    public func slice(_ range: Range<Int>) -> ArrSlice<Element>? { .new(self, range) }\n}\n\nextension Range<Int> {\n    func shift(by value: Int) -> Range<Int> { value + startIndex ..< value + endIndex }\n    func isSubRange(of outer: Range<Int>) -> Bool {\n        outer.lowerBound <= self.lowerBound && self.upperBound <= outer.upperBound\n    }\n}\n\n// periphery:ignore\nextension ArrSlice {\n    public func slice(_ range: PartialRangeFrom<Int>) -> ArrSlice<Element>? { slice(range.lowerBound ..< count) }\n    public func slice(_ range: PartialRangeUpTo<Int>) -> ArrSlice<Element>? { slice(0 ..< range.upperBound) }\n\n    public func slice(_ range: Range<Int>) -> ArrSlice<Element>? {\n        range.isSubRange(of: indices) ? .new(self.backing, range.shift(by: self.offsetInBacking)) : nil\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/BoolEx.swift",
    "content": "import Foundation\n\n// https://forums.swift.org/t/using-async-call-in-boolean-expression/52943\n// https://github.com/swiftlang/swift/issues/56869\n// https://forums.swift.org/t/potential-false-positive-sending-risks-causing-data-races/78859\nextension Bool {\n    @inlinable\n    public func andAsync(_ rhs: () async throws -> Bool) async rethrows -> Bool {\n        if self {\n            return try await rhs()\n        }\n        return false\n    }\n\n    // periphery:ignore\n    @inlinable\n    public func orAsync(_ rhs: () async throws -> Bool) async rethrows -> Bool {\n        if self {\n            return true\n        }\n        return try await rhs()\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/CollectionEx.swift",
    "content": "extension Collection {\n    public func singleOrNil() -> Element? {\n        count == 1 ? first : nil\n    }\n\n    public func getOrNil(atIndex index: Index) -> Element? {\n        indices.contains(index) ? self[index] : nil\n    }\n}\n\nextension Collection where Index == Int {\n    public func get(wrappingIndex: Int) -> Element? { isEmpty ? nil : self[((wrappingIndex % count) + count) % count] }\n}\n"
  },
  {
    "path": "Sources/Common/util/ComparableEx.swift",
    "content": "import AppKit\n\nextension Comparable {\n    public func until(incl bound: Self) -> ClosedRange<Self>? { self <= bound ? self ... bound : nil }\n    public func until(excl bound: Self) -> Range<Self>? { self < bound ? self ..< bound : nil }\n}\n"
  },
  {
    "path": "Sources/Common/util/ConvenienceCopyable.swift",
    "content": "public protocol ConvenienceCopyable {}\n\nextension ConvenienceCopyable {\n    public consuming func copy<T>(_ key: WritableKeyPath<Self, T>, _ value: T) -> Self {\n        self[keyPath: key] = value\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/DictionaryEx.swift",
    "content": "extension Dictionary {\n    @inlinable public func partition(_ predicate: (Dictionary<Key, Value>.Element) throws -> Bool) rethrows -> ([Key: Value], [Key: Value]) {\n        var matching = [Key: Value]()\n        var nonMatching = [Key: Value]()\n\n        for element in self {\n            if try predicate(element) {\n                matching[element.key] = element.value\n            } else {\n                nonMatching[element.key] = element.value\n            }\n        }\n\n        return (matching, nonMatching)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/EquatableNoop.swift",
    "content": "public struct EquatableNoop<Value>: Equatable {\n    public var value: Value\n    public init(_ value: Value) { self.value = value }\n    public static func == (lhs: EquatableNoop<Value>, rhs: EquatableNoop<Value>) -> Bool { true }\n}\n\nextension EquatableNoop: Sendable where Value: Sendable {}\n"
  },
  {
    "path": "Sources/Common/util/JsonEncoderEx.swift",
    "content": "import Foundation\n\nextension JSONEncoder {\n    public static var aeroSpaceDefault: JSONEncoder {\n        let encoder = JSONEncoder()\n        encoder.outputFormatting = [.prettyPrinted, .withoutEscapingSlashes, .sortedKeys]\n        return encoder\n    }\n\n    public func encodeToString(_ value: Encodable) -> String? {\n        guard let data = Result(catching: { try encode(value) }).getOrNil() else { return nil }\n        return String(data: data, encoding: .utf8)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/Lateinit.swift",
    "content": "// \"Happy path\" Optional\npublic enum Lateinit<T> {\n    case initialized(T)\n    case uninitialized\n\n    public var val: T {\n        switch self {\n            case .initialized(let value): return value\n            case .uninitialized: die(\"Property is not initialized\")\n        }\n    }\n\n    public var isInitialized: Bool {\n        return switch self {\n            case .initialized: true\n            case .uninitialized: false\n        }\n    }\n}\n\nextension Lateinit: Equatable where T: Equatable {\n    public static func == (lhs: Self, rhs: Self) -> Bool {\n        lhs.isInitialized && rhs.isInitialized && lhs.val == rhs.val ||\n            lhs.isInitialized == rhs.isInitialized\n    }\n}\n\nextension Lateinit: Sendable where T: Sendable {}\n"
  },
  {
    "path": "Sources/Common/util/MainActorEx.swift",
    "content": "import Foundation\n\nextension MainActor {\n    public static func checkIsolated<T>(_ operation: @MainActor () throws -> T, file: StaticString = #fileID, line: UInt = #line) rethrows -> T where T: Sendable {\n        check(Thread.isMainThread)\n        return try assumeIsolated(operation, file: file, line: line)\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/NWConnectionEx.swift",
    "content": "import Network\nimport Foundation\n\nextension NWConnection {\n    public func writeAtomic(_ msg: Codable, _ encoder: JSONEncoder = JSONEncoder()) async -> ((), error: NWError?) {\n        let payload = Result { try encoder.encode(msg) }.getOrDie()\n        var data = withUnsafeBytes(of: UInt32(payload.count)) { Data($0) }\n        check(data.count == 4)\n        data.append(payload)\n        return await withCheckedContinuation { cont in\n            send(content: data, completion: .contentProcessed { error in\n                if let error {\n                    cont.resume(returning: ((), error))\n                } else {\n                    cont.resume(returning: ((), nil))\n                }\n            })\n        }\n    }\n\n    public func startBlocking() async -> ((), error: NWError?) {\n        await withCheckedContinuation { cont in\n            let isDone = IsDone()\n            stateUpdateHandler = { state in\n                Task {\n                    let error: NWError?\n                    switch state {\n                        case .cancelled, .preparing, .setup: return\n                        case .ready: error = nil\n                        case .failed(let e), .waiting(let e): error = e\n                        @unknown default: die(\"Unknown NWConnection.State: \\(state)\")\n                    }\n                    // Make sure to resume continuation only once\n                    if await isDone.markAsDone().wasAlreadyDone {\n                        return\n                    }\n                    self.stateUpdateHandler = nil\n                    cont.resume(returning: ((), error))\n                }\n            }\n            start(queue: .global())\n        }\n    }\n\n    private func read(bytes size: Int) async -> Result<Data, NWError> {\n        var data = Data(capacity: size)\n        while data.count < size {\n            let remaining = size - data.count\n            let chunk: Result<Data, NWError> = await withCheckedContinuation { cont in\n                receive(minimumIncompleteLength: remaining, maximumLength: remaining) { data, context, isComplete, error in\n                    if let error {\n                        cont.resume(returning: .failure(error))\n                    } else {\n                        cont.resume(returning: .success(data ?? Data()))\n                    }\n                }\n            }\n            switch chunk {\n                case .success(let chunk): data.append(chunk)\n                case .failure: return chunk\n            }\n        }\n        return .success(data)\n    }\n\n    public func readTillError() async {\n        while true {\n            let isError = await withCheckedContinuation { cont in\n                receive(minimumIncompleteLength: 1, maximumLength: Int.max) { data, context, isComplete, error in\n                    cont.resume(returning: error != nil || data == nil || data?.count == 0)\n                }\n            }\n            if isError { return }\n        }\n    }\n\n    public func readNonAtomic() async -> Result<Data, NWError> {\n        switch await read(bytes: 4) {\n            case .success(let header):\n                let count = header.withUnsafeBytes { $0.load(as: UInt32.self) }\n                return await read(bytes: Int(count))\n            case .failure(let e):\n                return .failure(e)\n        }\n    }\n}\n\nprivate actor IsDone {\n    private var isDone: Bool = false\n\n    func markAsDone() -> (wasAlreadyDone: Bool, ()) {\n        let old = isDone\n        isDone = true\n        return (old, ())\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/Nullable.swift",
    "content": "/// Like Swift's built-in Optional but avoids implicit nil coercions\npublic enum Nullable<T> {\n    case just(T)\n    case null\n\n    public var valueOrNil: T? {\n        switch self {\n            case .just(let value): value\n            case .null: nil\n        }\n    }\n\n    public var isNull: Bool { valueOrNil == nil }\n}\n"
  },
  {
    "path": "Sources/Common/util/OptionalEx.swift",
    "content": "extension Optional {\n    public func orDie(\n        _ message: String = \"\",\n        file: StaticString = #fileID,\n        line: Int = #line,\n        column: Int = #column,\n        function: String = #function,\n    ) -> Wrapped {\n        self ?? dieT(\"orDie: \" + message, file: file, line: line, column: column, function: function)\n    }\n\n    public func orFailure<F: Error>(_ or: @autoclosure () -> F) -> Result<Wrapped, F> {\n        if let ok = self {\n            return .success(ok)\n        } else {\n            return .failure(or())\n        }\n    }\n\n    public func flatMapAsync<U>(_ transform: (Wrapped) async throws -> U?) async rethrows -> U? {\n        if let ok = self {\n            return try await transform(ok)\n        } else {\n            return nil\n        }\n    }\n\n    public func asList() -> [Wrapped] {\n        if let ok = self {\n            return [ok]\n        } else {\n            return []\n        }\n    }\n\n    public var prettyDescription: String {\n        if let unwrapped = self {\n            return String(describing: unwrapped)\n        }\n        return \"nil\"\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/ResultEx.swift",
    "content": "extension Result {\n    public init(catching body: () async throws(Failure) -> Success) async {\n        do {\n            self = .success(try await body())\n        } catch {\n            self = .failure(error)\n        }\n    }\n\n    public func getOrNil(appendErrorTo errors: inout [Failure]) -> Success? {\n        switch self {\n            case .success(let success):\n                return success\n            case .failure(let error):\n                errors += [error]\n                return nil\n        }\n    }\n\n    public func filter(_ failure: @autoclosure () -> Failure, _ predicate: (Success) -> Bool) -> Self {\n        flatMap { succ in predicate(succ) ? .success(succ) : .failure(failure()) }\n    }\n\n    public func getOrNil() -> Success? {\n        return switch self {\n            case .success(let success): success\n            case .failure: nil\n        }\n    }\n\n    public var failureOrNil: Failure? {\n        return switch self {\n            case .success: nil\n            case .failure(let f): f\n        }\n    }\n\n    public var isSuccess: Bool {\n        switch self {\n            case .success: true\n            case .failure: false\n        }\n    }\n}\n\nextension Result {\n    @discardableResult\n    public func getOrDie(\n        _ msgPrefix: String = \"\",\n        file: StaticString = #fileID,\n        line: Int = #line,\n        column: Int = #column,\n        function: String = #function,\n    ) -> Success {\n        switch self {\n            case .success(let suc):\n                return suc\n            case .failure(let e):\n                die(msgPrefix + e.localizedDescription, file: file, line: line, column: column, function: function)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/SequenceEx.swift",
    "content": "// periphery:ignore:all\nimport AppKit\nimport OrderedCollections\n\nextension Sequence {\n    public func filterNotNil<Unwrapped>() -> [Unwrapped] where Element == Unwrapped? {\n        compactMap { $0 }\n    }\n\n    public func filterIsInstance<R>(of _: R.Type) -> [R] {\n        var result: [R] = []\n        for elem in self {\n            if let elemR = elem as? R {\n                result.append(elemR)\n            }\n        }\n        return result\n    }\n\n    public var first: Element? {\n        var iter = makeIterator()\n        return iter.next()\n    }\n\n    public func mapAllOrFailure<T, E>(_ transform: (Self.Element) -> Result<T, E>) -> Result<[T], E> {\n        var result: [T] = []\n        for element in self {\n            switch transform(element) {\n                case .success(let element):\n                    result.append(element)\n                case .failure(let errors):\n                    return .failure(errors)\n            }\n        }\n        return .success(result)\n    }\n\n    public func mapAllOrFailures<T, E>(_ transform: (Self.Element) -> Result<T, E>) -> Result<[T], [E]> {\n        var result: [T] = []\n        var errors: [E] = []\n        for element in self {\n            switch transform(element) {\n                case .success(let element): result.append(element)\n                case .failure(let error): errors.append(error)\n            }\n        }\n        return errors.isEmpty ? .success(result) : .failure(errors)\n    }\n\n    @inlinable public func minByOrDie(_ selector: (Self.Element) -> some Comparable) -> Self.Element {\n        minBy(selector) ?? dieT(\"Empty sequence\")\n    }\n\n    @inlinable public func minBy(_ selector: (Self.Element) -> some Comparable) -> Self.Element? {\n        self.min(by: { a, b in selector(a) < selector(b) })\n    }\n\n    @inlinable public func maxByOrDie(_ selector: (Self.Element) -> some Comparable) -> Self.Element? {\n        self.maxBy(selector) ?? dieT(\"Empty sequence\")\n    }\n\n    @inlinable public func maxBy(_ selector: (Self.Element) -> some Comparable) -> Self.Element? {\n        self.max(by: { a, b in selector(a) < selector(b) })\n    }\n\n    @inlinable public func sortedBy(_ selector: (Self.Element) -> some Comparable) -> [Self.Element] {\n        sorted(by: { a, b in selector(a) < selector(b) })\n    }\n\n    @inlinable public func sortedBy(_ selectors: [(Self.Element) -> some Comparable]) -> [Self.Element] {\n        sorted(by: { a, b in\n            for selector in selectors {\n                let a = selector(a)\n                let b = selector(b)\n                if a < b { return true }\n                if a > b { return false }\n            }\n            return false\n        })\n    }\n\n    public func sumOfDouble(_ selector: (Self.Element) -> Double) -> Double {\n        var result: Double = 0\n        for elem in self {\n            result += selector(elem)\n        }\n        return result\n    }\n\n    public func sumOfInt(_ selector: (Self.Element) -> Int) -> Int {\n        var result: Int = 0\n        for elem in self {\n            result += selector(elem)\n        }\n        return result\n    }\n\n    public func grouped<Group>(by criterion: (_ transforming: Element) -> Group) -> [Group: [Element]] {\n        Dictionary(grouping: self, by: criterion)\n    }\n\n    public var withIndex: [(index: Int, value: Element)] {\n        var index = -1\n        return map {\n            index += 1\n            return (index, $0)\n        }\n    }\n}\n\nextension Sequence where Self.Element: Comparable {\n    public func minOrDie() -> Self.Element {\n        self.min() ?? dieT(\"Empty sequence\")\n    }\n\n    public func maxOrDie() -> Self.Element {\n        self.max() ?? dieT(\"Empty sequence\")\n    }\n}\n\nextension Sequence where Element: Hashable {\n    public func toSet() -> Set<Element> { Set(self) }\n    public func toOrderedSet() -> OrderedSet<Element> { OrderedSet(self) }\n}\n"
  },
  {
    "path": "Sources/Common/util/StringEx.swift",
    "content": "public typealias Parsed<T> = Result<T, String>\nextension String: @retroactive Error {} // Make it possible to use String in Result. todo migrate to self written Result monad\nextension Array: @retroactive Error where Element: Error {} // Make it possible to use [String] in Result. todo migrate to self written Result monad\n\nextension String {\n    public func trim() -> String {\n        self.trimmingCharacters(in: .whitespacesAndNewlines)\n    }\n\n    public func prefixLines(with: String) -> String {\n        split(separator: \"\\n\", omittingEmptySubsequences: false).map { with + $0 }.joined(separator: \"\\n\")\n    }\n\n    public func quoted(with char: String) -> String { char + self + char }\n    public var singleQuoted: String { \"'\" + self + \"'\" }\n    public var doubleQuoted: String { \"\\\"\" + self + \"\\\"\" }\n}\n\nextension [String] {\n    public func joinErrors() -> String { // todo reuse in config parsing?\n        map { (error: String) -> String in\n            error.split(separator: \"\\n\").enumerated()\n                .map { (i, line) in\n                    i == 0\n                        ? \"ERROR: \" + line\n                        : \"       \" + line\n                }\n                .joined(separator: \"\\n\")\n        }\n        .joined(separator: \"\\n\")\n    }\n\n    public func joinTruncating(separator: String, length maxLength: Int, trailing: String = \"…\") -> String {\n        if isEmpty {\n            return \"\"\n        }\n        var remainingLen = maxLength\n        let separatorCount = separator.count\n        var result: String = first.orDie()\n        for _elem in self.dropFirst() {\n            let elemCount = separatorCount + _elem.count\n            if remainingLen < elemCount / 2 {\n                return result + separator + trailing\n            }\n            let elem = separator + _elem\n            if elemCount < remainingLen {\n                result += elem\n                remainingLen -= elemCount\n            } else {\n                return result + elem.prefix(remainingLen) + trailing\n            }\n        }\n        return result\n    }\n}\n\nextension [[String]] {\n    public func toPaddingTable(columnSeparator: String = \" | \") -> [String] {\n        let pads: [Int] = transposed().map { column in column.map { $0.count }.max().orDie() }\n        return self.map { (row: [String]) in\n            zip(row.enumerated(), pads)\n                .map { (elem: (Int, String), pad: Int) in\n                    elem.0 != row.count - 1 ? elem.1.padding(toLength: pad, withPad: \" \", startingAt: 0) : elem.1\n                }\n                .joined(separator: columnSeparator)\n        }\n    }\n}\n\nextension Array { // todo move to ArrayEx.swift\n    public func transposed<T>() -> [[T]] where Self.Element == [T] {\n        if isEmpty {\n            return []\n        }\n        let table: [[T]] = self\n        var result: [[T]] = []\n        for columnIndex in 0... {\n            if columnIndex < table.first.orDie().count {\n                result += [table.map { row in row.getOrNil(atIndex: columnIndex).orDie() }]\n            } else {\n                break\n            }\n        }\n        return result\n    }\n}\n\nextension String {\n    public func interpolate(with variables: [String: String]) -> Result<String, [String]> {\n        interpolationTokens(interpolationChar: \"$\")\n            .mapError { [$0] }\n            .flatMap { tokens in\n                tokens.mapAllOrFailures { token in\n                    switch token {\n                        case .literal(let literal): .success(literal)\n                        case .interVar(let value):\n                            variables[value].flatMap(Result.success)\n                                ?? .failure(\"Env variable '\\(value)' isn't presented in AeroSpace.app env vars, \" +\n                                    \"or not available for interpolation (because it's mutated)\")\n                    }\n                }\n            }\n            .map { $0.joined(separator: \"\") }\n    }\n\n    public func interpolationTokens(interpolationChar: Character) -> Result<[StringInterToken], String> {\n        var mode: InterpolationParserState = .stringLiteral\n        var result: [StringInterToken] = []\n        var literal: String = \"\"\n        for char: Character? in (Array(self) + [nil]) {\n            switch (mode, char) { // State machine\n                case (.stringLiteral, interpolationChar):\n                    mode = .interpolationCharEncountered\n                case (.stringLiteral, _):\n                    if let char {\n                        literal.append(char)\n                    } else {\n                        result.append(.literal(literal))\n                    }\n                case (.interpolationCharEncountered, \"{\"):\n                    mode = .interpolatedValue(\"\")\n                    result.append(.literal(literal))\n                    literal = \"\"\n                case (.interpolationCharEncountered, interpolationChar):\n                    literal.append(interpolationChar)\n                case (.interpolationCharEncountered, _):\n                    literal.append(interpolationChar)\n                    if let char {\n                        literal.append(char)\n                    } else {\n                        result.append(.literal(literal))\n                    }\n                    mode = .stringLiteral\n                case (.interpolatedValue(let value), \"}\"):\n                    result.append(.interVar(value))\n                    mode = .stringLiteral\n                case (.interpolatedValue(let value), \"{\"):\n                    return .failure(\"Can't parse '\\(value + \"{\")' inside interpolation (Open curly brace is invalid character)\")\n                case (.interpolatedValue(let value), interpolationChar):\n                    return .failure(\"Can't parse '\\(value + .init(interpolationChar))' inside interpolation ('\\(interpolationChar)' is disallowed character)\")\n                case (.interpolatedValue(let value), _):\n                    if let char {\n                        mode = .interpolatedValue(value + .init(char))\n                    } else {\n                        return .failure(\"Unbalanced curly braces\")\n                    }\n            }\n        }\n        return .success(result.filter { $0 != .literal(\"\") })\n    }\n}\n\npublic enum StringInterToken: Equatable, Sendable {\n    case literal(String)\n    case interVar(String) // \"interpolation variable\"\n}\n\nprivate enum InterpolationParserState {\n    case stringLiteral, interpolationCharEncountered\n    case interpolatedValue(String)\n}\n"
  },
  {
    "path": "Sources/Common/util/StringLogicalSegments.swift",
    "content": "public typealias StringLogicalSegments = [StringLogicalSegment]\nextension StringLogicalSegments {\n    public static func < (lhs: Self, rhs: Self) -> Bool {\n        for (a, b) in zip(lhs, rhs) {\n            if a < b {\n                return true\n            }\n            if a > b {\n                return false\n            }\n        }\n        if lhs.count != rhs.count {\n            return lhs.count < rhs.count\n        }\n        return false\n    }\n}\n\npublic enum StringLogicalSegment: Comparable, Equatable, Sendable {\n    case string(String)\n    case number(Int)\n\n    public static func < (lhs: Self, rhs: Self) -> Bool {\n        switch (lhs, rhs) {\n            case (.string(let a), .string(let b)): a < b\n            case (.number(let a), .number(let b)): a < b\n            case (.number, _): true\n            case (.string, _): false\n        }\n    }\n}\n\nextension String {\n    public func toLogicalSegments() -> StringLogicalSegments {\n        var currentSegment: String = \"\"\n        var isPrevNumber: Bool = false // Initial value doesn't matter\n        var result: [String] = []\n        for char in self {\n            let isCurNumber = Int(char.description) != nil\n            if isCurNumber != isPrevNumber && !currentSegment.isEmpty {\n                result.append(currentSegment)\n                currentSegment = \"\"\n            }\n            currentSegment.append(char)\n            isPrevNumber = isCurNumber\n        }\n        if !currentSegment.isEmpty {\n            result.append(currentSegment)\n        }\n        return result.map { Int($0).flatMap(StringLogicalSegment.number) ?? .string($0) }\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/commonUtil.swift",
    "content": "import AppKit\nimport Darwin\nimport Foundation\n\npublic let socketPath = \"/tmp/\\(aeroSpaceAppId)-\\(unixUserName).sock\"\npublic let unixUserName = NSUserName()\npublic let mainModeId = \"main\"\n\n@TaskLocal\npublic var refreshSessionEvent: RefreshSessionEvent? = nil\n\n@TaskLocal\nprivate var recursionDetectorDuringTermination = false\n\npublic func dieT<T>(\n    _ __message: String = \"\",\n    file: StaticString = #fileID,\n    line: Int = #line,\n    column: Int = #column,\n    function: String = #function,\n) -> T {\n    let _message = __message.contains(\"\\n\") ? \"\\n\" + __message.prefixLines(with: \"    \") : __message\n    let thread = Thread.current\n    let message =\n        \"\"\"\n        Please report to:\n            https://github.com/nikitabobko/AeroSpace/discussions/categories/potential-bugs\n            Please describe what you did to trigger this error\n\n        Message: \\(_message)\n        Version: \\(aeroSpaceAppVersion)\n        Git hash: \\(gitHash)\n        refreshSessionEvent: \\(refreshSessionEvent.prettyDescription)\n        Date: \\(Date.now)\n        Thread name: \\(thread.name.prettyDescription)\n        Is main thread: \\(thread.isMainThread)\n        axTaskLocalAppThreadToken: \\(axTaskLocalAppThreadToken.prettyDescription)\n        macOS version: \\(ProcessInfo().operatingSystemVersionString)\n        Coordinate: \\(file):\\(line):\\(column) \\(function)\n        recursionDetectorDuringTermination: \\(recursionDetectorDuringTermination)\n        cli: \\(isCli)\n        Monitor count: \\(NSScreen.screens.count)\n        Displays have separate spaces: \\(NSScreen.screensHaveSeparateSpaces)\n\n        Stacktrace:\n        \\(getStringStacktrace())\n        \"\"\"\n    if !isUnitTest && isServer {\n        showMessageInGui(\n            filenameIfConsoleApp: recursionDetectorDuringTermination\n                ? \"aerospace-runtime-error-recursion.txt\"\n                : \"aerospace-runtime-error.txt\",\n            title: \"AeroSpace Runtime Error\",\n            message: message,\n        )\n    }\n    if !recursionDetectorDuringTermination {\n        let semaphore = DispatchSemaphore(value: 0)\n        Task {\n            defer { semaphore.signal() }\n            try await $recursionDetectorDuringTermination.withValue(true) {\n                try await terminationHandler.beforeTermination()\n            }\n        }\n        semaphore.wait()\n    }\n    fatalError(\"\\n\" + message)\n}\n\npublic enum RefreshSessionEvent: Sendable, CustomStringConvertible {\n    case configAutoReload\n    case globalObserver(String)\n    case globalObserverLeftMouseUp\n    case menuBarButton\n    case hotkeyBinding\n    case startup\n    case socketServer(any CmdArgs)\n    case resetManipulatedWithMouse\n    case ax(String)\n    case onFocusedMonitorChanged\n    case onFocusChanged\n    case onModeChanged\n\n    public var isStartup: Bool {\n        if case .startup = self { return true } else { return false }\n    }\n\n    public var description: String {\n        switch self {\n            case .ax(let str): \"ax(\\(str))\"\n            case .configAutoReload: \"configAutoReload\"\n            case .globalObserver(let str): \"globalObserver(\\(str))\"\n            case .globalObserverLeftMouseUp: \"globalObserverLeftMouseUp\"\n            case .hotkeyBinding: \"hotkeyBinding\"\n            case .menuBarButton: \"menuBarButton\"\n            case .resetManipulatedWithMouse: \"resetManipulatedWithMouse\"\n            case .socketServer(let args): \"socketServer: \\(args)\"\n            case .startup: \"startup\"\n            case .onFocusedMonitorChanged: \"onFocusedMonitorChanged\"\n            case .onFocusChanged: \"onFocusChanged\"\n            case .onModeChanged: \"onModeChanged\"\n        }\n    }\n}\n\npublic func throwT<T>(_ error: Error) throws -> T {\n    throw error\n}\n\npublic func getStringStacktrace() -> String { Thread.callStackSymbols.joined(separator: \"\\n\") }\n\n@inlinable public func die(\n    _ message: String = \"\",\n    file: StaticString = #fileID,\n    line: Int = #line,\n    column: Int = #column,\n    function: String = #function,\n) -> Never {\n    dieT(message, file: file, line: line, column: column, function: function)\n}\n\npublic func check(\n    _ condition: Bool,\n    _ message: @autoclosure () -> String = \"\",\n    file: StaticString = #fileID,\n    line: Int = #line,\n    column: Int = #column,\n    function: String = #function,\n) {\n    if !condition {\n        die(message(), file: file, line: line, column: column, function: function)\n    }\n}\n\npublic var isUnitTest: Bool { NSClassFromString(\"XCTestCase\") != nil }\n\nextension CaseIterable where Self: RawRepresentable, RawValue == String {\n    public static var cliArgsCases: [String] { allCases.map(\\.rawValue) }\n    public static var unionLiteral: String { cliArgsCases.joinedCliArgs }\n}\n\nextension [String] {\n    public var joinedCliArgs: String { \"(\" + self.joined(separator: \"|\") + \")\" }\n}\n\nextension Int {\n    public func toDouble() -> Double { Double(self) }\n}\n\npublic func + <K, V>(lhs: [K: V], rhs: [K: V]) -> [K: V] {\n    lhs.merging(rhs) { _, r in r }\n}\n\nextension String {\n    public func removePrefix(_ prefix: String) -> String {\n        hasPrefix(prefix) ? String(dropFirst(prefix.count)) : self\n    }\n\n    public func prependLines(_ prefix: String) -> String {\n        split(separator: \"\\n\").map { prefix + $0 }.joined(separator: \"\\n\")\n    }\n}\n\nextension Bool {\n    /// Implication\n    /// | a     | b     | a.implies(b) |\n    /// |-------|-------|--------------|\n    /// | false | false | true         |\n    /// | false | true  | true         |\n    /// | true  | false | false        |\n    /// | true  | true  | true         |\n    public func implies(_ mustHold: @autoclosure () -> Bool) -> Bool { !self || mustHold() }\n}\n\nextension URL {\n    public func open(with url: URL) {\n        NSWorkspace.shared.open([self], withApplicationAt: url, configuration: NSWorkspace.OpenConfiguration())\n    }\n}\n\npublic func eprint(_ msg: String) {\n    fputs(msg + \"\\n\", stderr)\n}\n\npublic func exit(_ exitCode: Int32, out: String? = nil, err: String? = nil) -> Never {\n    exitT(exitCode, out: out, err: err)\n}\n\npublic func exitT<T>(_ exitCode: Int32, out: String? = nil, err: String? = nil) -> T {\n    if let out { print(out) }\n    if let err { eprint(err) }\n    exit(exitCode)\n}\n\n@inlinable\npublic func allowOnlyCancellationError<T>(_ block: () async throws -> sending T) async throws -> sending T {\n    do {\n        return try await block()\n    } catch let e as CancellationError {\n        throw e\n    } catch {\n        die(\"throws must only be used for CancellationError\")\n    }\n}\n"
  },
  {
    "path": "Sources/Common/util/showMessageInGui.swift",
    "content": "import Foundation\n\n// todo refactor. showMessageInGui in common code looks weird\nfunc showMessageInGui(filenameIfConsoleApp: String, title: String, message: String) {\n    let titleAndMessage = \"##### \\(title) #####\\n\\n\" + message\n    if isCli {\n        print(titleAndMessage)\n    } else {\n        let cachesDir = URL(filePath: \"/tmp/bobko.aerospace/\")\n        Result { try FileManager.default.createDirectory(at: cachesDir, withIntermediateDirectories: true) }.getOrDie()\n        let file = cachesDir.appending(component: filenameIfConsoleApp)\n        Result { try (titleAndMessage + \"\\n\").write(to: file, atomically: true, encoding: .utf8) }.getOrDie()\n\n        file.absoluteURL.open(with: URL(filePath: \"/System/Applications/Utilities/Console.app\"))\n    }\n}\n"
  },
  {
    "path": "Sources/Common/versionGenerated.swift",
    "content": "// FILE IS GENERATED BY generate.sh\npublic let aeroSpaceAppVersion = \"0.0.0-SNAPSHOT\"\n"
  },
  {
    "path": "Sources/PrivateApi/include/module.modulemap",
    "content": "module PrivateApi {\n  header \"private.h\"\n  export *\n}\n"
  },
  {
    "path": "Sources/PrivateApi/include/private.h",
    "content": "#ifndef private_header_h\n#define private_header_h\n\n#import <ApplicationServices/ApplicationServices.h>\n\n// Potential alternative 1?\n// func allWindowsOnCurrentMacOsSpace() {\n//     let options = CGWindowListOption(arrayLiteral: .excludeDesktopElements, .optionOnScreenOnly)\n//     let windowsListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0))\n//     let infoList = windowsListInfo as! [[String:Any]]\n//     let windows = infoList.filter { $0[\"kCGWindowLayer\"] as! Int == 0 }\n//     print(windows.count)\n//     for window in windows {\n//             print(window)\n//             print(\"Name: \\(window[\"kCGWindowOwnerName\"].unsafelyUnwrapped)\")\n//             print(\"PID: \\(window[\"kCGWindowOwnerPID\"].unsafelyUnwrapped)\")\n//             print(\"window ID: \\(window[\"kCGWindowNumber\"])\")\n//             print(\"---\")\n//     }\n// }\n//\n// Alternative 2:\n// @_silgen_name(\"_AXUIElementGetWindow\")\n// @discardableResult\n// func _AXUIElementGetWindow(_ axUiElement: AXUIElement, _ id: inout CGWindowID) -> AXError\nAXError _AXUIElementGetWindow(AXUIElementRef element, uint32_t *identifier);\n\n#endif\n"
  },
  {
    "path": "Sources/PrivateApi/include/private.m",
    "content": "// This file exists purely because xcode doesn't like header only targets, SPM is fine with them\n#import \"private.h\"\n"
  },
  {
    "path": "axDumps/1password.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600000c8bcf0> {value = x:-1.000000 y:1118.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000017f5b00> {value = x:1727.000000 y:1089.000000 w:1698.000000 h:1078.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600000c8aac0> {pid=1682}\",\n  \"AXPosition\" : \"<AXValue 0x600000c8bcf0> {value = x:1727.000000 y:1089.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600000caf450> {pid=1682}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600000cc9b30> {pid=1682}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600000cedbf0> {value = w:1698.000000 h:1078.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Account Name — All Items — 1Password\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x600000c8aac0> {pid=1682}\",\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 0,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x600000cedd10> {pid=1682}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"1Password\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.1password.1password\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/1Password.app/Contents/MacOS/1Password\",\n  \"Aero.App.version\" : \"8.11.4.360922\",\n  \"Aero.App.versionShort\" : \"8.11.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.axWindowId\" : 3746,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"Random\"\n}\n"
  },
  {
    "path": "axDumps/1password_large_type_window.json5",
    "content": "// I have no idea what does 'large type window' mean. I took it from: https://github.com/nikitabobko/AeroSpace/discussions/1616\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600000c77c90> {value = x:1797.000000 y:1103.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000017f5580> {value = x:1727.000000 y:1089.000000 w:1698.000000 h:1078.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600000c7a700> {pid=1682}\",\n  \"AXPosition\" : \"<AXValue 0x600000c7be10> {value = x:1727.000000 y:1089.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600000c76b50> {pid=1682}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600000c76250> {pid=1682}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600000c770f0> {value = w:1698.000000 h:1078.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Item Name — field name — 1Password\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x600000c7dbf0> {pid=1682}\",\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 0,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x600000c77cc0> {pid=1682}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"1Password\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.1password.1password\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/1Password.app/Contents/MacOS/1Password\",\n  \"Aero.App.version\" : \"8.11.4.360922\",\n  \"Aero.App.versionShort\" : \"8.11.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 3789,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : \"Random\"\n}\n"
  },
  {
    "path": "axDumps/1password_mini_window.json5",
    "content": "// I have no idea what does 'mini window' mean. I took it from: https://github.com/nikitabobko/AeroSpace/discussions/1616\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600000c77960> {value = x:1797.000000 y:1103.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000017b24c0> {value = x:1727.000000 y:1089.000000 w:409.000000 h:532.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600000c77480> {pid=1682}\",\n  \"AXPosition\" : \"<AXValue 0x600000cedd40> {value = x:1727.000000 y:1089.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600000cedd40> {pid=1682}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600000ce49c0> {pid=1682}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600000c77480> {value = w:409.000000 h:532.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Item Name — 1Password\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x600000c77480> {pid=1682}\",\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 0,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x600000c77480> {pid=1682}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"1Password\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=3798, title=\\\"Item Name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=3789, title=\\\"Item Name — field name — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=3746, title=\\\"Account Name — All Items — 1Password\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.1password.1password\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/1Password.app/Contents/MacOS/1Password\",\n  \"Aero.App.version\" : \"8.11.4.360922\",\n  \"Aero.App.versionShort\" : \"8.11.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 3798,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"layout floating\",\n      \"matcher\" : \"appId=\\\"com.1password.1password\\\", windowTitleRegexSubstring=Regex\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : \"Random\"\n}\n"
  },
  {
    "path": "axDumps/about_this_mac.json5",
    "content": "// top left corner -> apple logo -> about this mac\n{\n  \"AXActivationPoint\" : \"<AXValue 0x978036730> {value = x:790.000000 y:217.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x97812a800> {value = x:760.000000 y:201.000000 w:280.000000 h:487.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x978418330> {pid=93549}\",\n  \"AXPosition\" : \"<AXValue 0x978034540> {value = x:760.000000 y:201.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809db30> {pid=93549}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978036550> {value = w:280.000000 h:487.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4729, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809dad0> {pid=93549}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"System Information\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4729, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.SystemProfiler\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///System/Applications/Utilities/System%20Information.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/Utilities/System%20Information.app/Contents/MacOS/System%20Information\",\n  \"Aero.App.pid\" : 93549,\n  \"Aero.App.version\" : \"915\",\n  \"Aero.App.versionShort\" : \"11.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 4729,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/alacritty_decorations_buttonless.json5",
    "content": "// ~/.alacritty.toml:\n//     [window]\n//     decorations = \"Buttonless\"\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000031adef0> {value = x:10.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x600002abf680> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600003190240> {pid=1835}\",\n  \"AXPosition\" : \"<AXValue 0x6000031adef0> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x6000031ae160> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"ta ~\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600003190420> {pid=1835}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Alacritty\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=197, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.alacritty\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.version\" : \"1\",\n  \"Aero.App.versionShort\" : \"0.15.1\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : \"197\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/apple_calendar.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x9788d4570> {value = x:610.000000 y:56.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x978c0a5c0> {value = x:600.000000 y:40.000000 w:680.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"CALMainWindow\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x978098d20> {pid=93759}\",\n  \"AXPosition\" : \"<AXValue 0x9788d43c0> {value = x:600.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x978098d80> {pid=93759}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = Search;\\n    SectionObject = \\\"<AXUIElement 0x978098d50> {pid=93759}\\\";\\n    SectionUniqueID = AXSearch;\\n}\",\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x978098d20> {pid=93759}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x9788d48a0> {value = w:680.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Calendar\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : {\n      \"AXDescription\" : \"previous year\",\n      \"AXEnabled\" : 1,\n      \"AXIdentifier\" : \"previous year\",\n      \"AXParent\" : \"AXUIElement(AxWindowId=4734, title=nil, role=\\\"AXGroup\\\", subrole=nil)\",\n      \"AXRole\" : \"AXButton\",\n      \"AXTitle\" : \"\",\n      \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXWindow\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n    },\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x978098090> {pid=93759}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Calendar\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4734, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.iCal\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///System/Applications/Calendar.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/Calendar.app/Contents/MacOS/Calendar\",\n  \"Aero.App.pid\" : 93759,\n  \"Aero.App.version\" : \"3036.1.8\",\n  \"Aero.App.versionShort\" : \"16.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4734,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/apple_calendar_settings.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x9780372a0> {value = x:615.000000 y:185.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x978c09c80> {value = x:585.000000 y:169.000000 w:629.000000 h:646.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809dc80> {pid=93809}\",\n  \"AXPosition\" : \"<AXValue 0x9788d4960> {value = x:585.000000 y:169.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x97809d350> {pid=93809}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809dc80> {pid=93809}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978037240> {value = w:629.000000 h:646.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"General\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4740, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809dc80> {pid=93809}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Calendar\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4740, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=4739, title=\\\"Calendar\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.iCal\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///System/Applications/Calendar.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/Calendar.app/Contents/MacOS/Calendar\",\n  \"Aero.App.pid\" : 93809,\n  \"Aero.App.version\" : \"3036.1.8\",\n  \"Aero.App.versionShort\" : \"16.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 4740,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/apple_followup_sign_in_to_a_new_device_confirmation.json5",
    "content": "// firefox -> icloud.com -> sign in\n{\n  \"AXActivationPoint\" : \"<AXValue 0x9780366d0> {value = x:670.000000 y:428.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXIdentifier\" : \"_NS:78\",\n    \"AXParent\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXTitle\" : \"Do Not Allow\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXIdentifier\" : \"_NS:69\",\n    \"AXParent\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXTitle\" : \"Allow\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x97812a840> {value = x:660.000000 y:412.000000 w:480.000000 h:375.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:24\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809db90> {pid=93865}\",\n  \"AXPosition\" : \"<AXValue 0x978036550> {value = x:660.000000 y:412.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809db90> {pid=93865}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978036550> {value = w:480.000000 h:375.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4744, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : {\n      \"AXEnabled\" : 1,\n      \"AXIdentifier\" : \"_NS:78\",\n      \"AXParent\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXRole\" : \"AXButton\",\n      \"AXTitle\" : \"Do Not Allow\",\n      \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXWindow\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n    },\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809dd10> {pid=93865}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"FollowUpUI\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4744, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.FollowUpUI\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///System/Library/PrivateFrameworks/CoreFollowUp.framework/Versions/A/Resources/FollowUpUI.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Library/PrivateFrameworks/CoreFollowUp.framework/Versions/A/Resources/FollowUpUI.app/Contents/MacOS/FollowUpUI\",\n  \"Aero.App.pid\" : 93865,\n  \"Aero.App.version\" : \"281.1.5\",\n  \"Aero.App.versionShort\" : \"1.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 4744,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : 25,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/apple_mail.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000012d0180> {value = x:910.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXIdentifier\" : \"Mail.categories.onboarding.button.tryCategories\",\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5005, title=nil, role=\\\"AXGroup\\\", subrole=nil)\",\n    \"AXRole\" : \"AXButton\",\n    \"AXTitle\" : \"Try Categories\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000971980> {value = x:900.000000 y:44.000000 w:900.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"Mail.messageViewer.window.1\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000012492c0> {pid=84847}\",\n  \"AXPosition\" : \"<AXValue 0x6000012d3420> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001249c20> {pid=84847}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x60000124a550> {pid=84847}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = \\\"Content Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x60000124a190> {pid=84847}\\\";\\n    SectionUniqueID = AXContentNavigator;\\n}\",\n    \"{\\n    SectionDescription = Search;\\n    SectionObject = \\\"<AXUIElement 0x6000012490e0> {pid=84847}\\\";\\n    SectionUniqueID = AXSearch;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001248960> {pid=84847}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x60000124a3d0> {pid=84847}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x60000124b300> {pid=84847}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000012492c0> {value = w:900.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Inbox – REDACTED – Primary · 64 messages\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=5005, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=5005, title=nil, role=\\\"AXTable\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001248ff0> {pid=84847}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Mail\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=5005, title=\\\"Inbox – REDACTED – Primary · 64 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.mail\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/Mail.app/Contents/MacOS/Mail\",\n  \"Aero.App.version\" : \"3826.600.51.1.1\",\n  \"Aero.App.versionShort\" : \"16.0\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 5005,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/apple_mail_new_email.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x978037000> {value = x:610.000000 y:56.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x978129880> {value = x:600.000000 y:40.000000 w:600.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:41\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809d8f0> {pid=93925}\",\n  \"AXPosition\" : \"<AXValue 0x978401530> {value = x:600.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x97809e370> {pid=93925}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809d8f0> {pid=93925}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x9788d49f0> {value = w:600.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"New Message\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4751, title=nil, role=\\\"AXTextField\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x978098060> {pid=93925}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Mail\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4751, title=\\\"New Message\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=4750, title=\\\"Inbox – REDACTED@jetbrains.com – 71 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.mail\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///System/Applications/Mail.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/Mail.app/Contents/MacOS/Mail\",\n  \"Aero.App.pid\" : 93925,\n  \"Aero.App.version\" : \"3864.200.81.1.6\",\n  \"Aero.App.versionShort\" : \"16.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4751,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/apple_mail_settings.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x978037690> {value = x:690.000000 y:274.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x978c09c00> {value = x:660.000000 y:258.000000 w:775.000000 h:670.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:178\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809cb70> {pid=93925}\",\n  \"AXPosition\" : \"<AXValue 0x9788d4a50> {value = x:660.000000 y:258.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x978098090> {pid=93925}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x978098c90> {pid=93925}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978037270> {value = w:775.000000 h:670.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Composing\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4752, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809cb70> {pid=93925}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Mail\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4752, title=\\\"Composing\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=4750, title=\\\"Inbox – REDACTED@jetbrains.com – 71 messages\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.mail\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///System/Applications/Mail.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/Mail.app/Contents/MacOS/Mail\",\n  \"Aero.App.pid\" : 93925,\n  \"Aero.App.version\" : \"3864.200.81.1.6\",\n  \"Aero.App.versionShort\" : \"16.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized\",\n  \"Aero.axWindowId\" : 4752,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/archiveutility.json5",
    "content": "// E.g. you can download Xcode. It takes a while to unpack it, so you have a plenty of time to capture the AX of the window\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600002ac4750> {value = x:1869.000000 y:1155.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXIdentifier\" : \"_NS:174\",\n    \"AXParent\" : \"AXUIElement(AxWindowId=16775, title=nil, role=\\\"AXScrollArea\\\", subrole=nil)\",\n    \"AXRole\" : \"AXButton\",\n    \"AXTitle\" : \"Cancel\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x6000030c64c0> {value = x:1799.000000 y:1141.000000 w:378.000000 h:134.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:8\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002ac4750> {pid=96527}\",\n  \"AXPosition\" : \"<AXValue 0x600002ace2e0> {value = x:1799.000000 y:1141.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : null,\n  \"AXSize\" : \"<AXValue 0x600002ac5140> {value = w:378.000000 h:134.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Archive Utility\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=16775, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002ac4750> {pid=96527}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Archive Utility\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=16775, title=\\\"Archive Utility\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.archiveutility\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Library/CoreServices/Applications/Archive%20Utility.app/Contents/MacOS/Archive%20Utility\",\n  \"Aero.App.version\" : \"162\",\n  \"Aero.App.versionShort\" : \"10.15\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 16775,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"W\"\n}\n"
  },
  {
    "path": "axDumps/brave.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0xc45c81830> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"chrome://newtab/\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0xc44c12440> {value = x:0.000000 y:40.000000 w:1800.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0xc45727b10> {pid=23662}\",\n  \"AXPosition\" : \"<AXValue 0xc45c81830> {value = x:0.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0xc455563a0> {pid=23662}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0xc45556130> {pid=23662}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0xc45c81830> {value = w:1800.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"New tab - Brave\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=2607, title=\\\"New Tab\\\", role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0xc45556040> {pid=23662}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Brave\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2607, title=\\\"New tab - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.brave.Browser\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Brave%20Browser.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Brave%20Browser.app/Contents/MacOS/Brave%20Browser\",\n  \"Aero.App.pid\" : 23662,\n  \"Aero.App.version\" : \"184.135\",\n  \"Aero.App.versionShort\" : \"142.1.84.135\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 2607,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/brave_pip.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0xc457a10b0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0xc4411cb40> {value = x:1028.000000 y:612.000000 w:635.000000 h:357.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0xc45726fa0> {pid=23662}\",\n  \"AXPosition\" : \"<AXValue 0xc457a10b0> {value = x:1028.000000 y:612.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0xc45727540> {pid=23662}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0xc45726fa0> {pid=23662}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0xc457a10b0> {value = w:635.000000 h:357.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Picture-in-picture\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0xc45727db0> {pid=23662}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Brave\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2626, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=2607, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube – Video playing in picture-in-picture mode - Brave\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.brave.Browser\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Brave%20Browser.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Brave%20Browser.app/Contents/MacOS/Brave%20Browser\",\n  \"Aero.App.pid\" : 23662,\n  \"Aero.App.version\" : \"184.135\",\n  \"Aero.App.versionShort\" : \"142.1.84.135\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXSize\",\n  \"Aero.axWindowId\" : 2626,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/calculator.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x60000193bd50> {value = x:759.000000 y:606.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002c1a80> {value = x:749.000000 y:592.000000 w:198.000000 h:350.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"main\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018d2460> {pid=45807}\",\n  \"AXPosition\" : \"<AXValue 0x6000018ce9d0> {value = x:749.000000 y:592.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x600001939f20> {pid=45807}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x60000193b330> {pid=45807}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x60000193ad90> {pid=45807}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018d2460> {value = w:198.000000 h:350.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Calculator\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14642, title=nil, role=\\\"AXGroup\\\", subrole=\\\"AXHostingView\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000019397d0> {pid=45807}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Calculator\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14642, title=\\\"Calculator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.calculator\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/Calculator.app/Contents/MacOS/Calculator\",\n  \"Aero.App.version\" : \"224\",\n  \"Aero.App.versionShort\" : \"11.0\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14642,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/choose_1_5_0.json5",
    "content": "// choose -v # => 1.5.0\n{\n  \"AXActivationPoint\" : \"<AXValue 0x9788d4750> {value = x:510.000000 y:240.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x9780b0640> {value = x:500.000000 y:226.000000 w:800.000000 h:387.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x978098e40> {pid=93987}\",\n  \"AXPosition\" : \"<AXValue 0x9788d44b0> {value = x:500.000000 y:226.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x9780983c0> {pid=93987}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x978098e40> {pid=93987}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x9780372d0> {value = w:800.000000 h:387.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4753, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4753, title=nil, role=\\\"AXTextField\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4753, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4753, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809cbd0> {pid=93987}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"choose\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4753, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : null,\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///opt/homebrew/Cellar/choose-gui/1.5.0/bin/choose/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///opt/homebrew/bin/choose\",\n  \"Aero.App.pid\" : 93987,\n  \"Aero.App.version\" : null,\n  \"Aero.App.versionShort\" : null,\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 4753,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/chrome.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019c6850> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"chrome://newtab/\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x60000029fd00> {value = x:1799.000000 y:1128.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018d5fe0> {pid=34617}\",\n  \"AXPosition\" : \"<AXValue 0x600001968750> {value = x:1799.000000 y:1128.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018d6520> {pid=34617}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018d45d0> {pid=34617}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000019c7210> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"New Tab - Google Chrome\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14057, title=\\\"\\\", role=\\\"AXTextField\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018d4120> {pid=34617}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Chrome\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.google.Chrome\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Google%20Chrome.app/Contents/MacOS/Google%20Chrome\",\n  \"Aero.App.version\" : \"7049.116\",\n  \"Aero.App.versionShort\" : \"135.0.7049.116\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14057,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"move-node-to-workspace F\",\n      \"matcher\" : \"appId=\\\"com.google.Chrome\\\"\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/chrome_choose_what_to_share_popup.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000024192f0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003ff2b00> {value = x:146.000000 y:127.000000 w:608.000000 h:579.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000024fb390> {pid=552}\",\n  \"AXPosition\" : \"<AXValue 0x6000024fb630> {value = x:146.000000 y:127.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002419230> {pid=552}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600002418f60> {pid=552}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000024fb390> {value = w:608.000000 h:579.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"Choose what to share with meet.google.com\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : {\n      \"AXAccessKey\" : null,\n      \"AXBlockQuoteLevel\" : 0,\n      \"AXColumnHeaderUIElements\" : null,\n      \"AXCustomContent\" : null,\n      \"AXDOMClassList\" : [\n        \"MdTextButton\"\n      ],\n      \"AXDOMIdentifier\" : \"\",\n      \"AXDescription\" : \"Cancel\",\n      \"AXElementBusy\" : 0,\n      \"AXEnabled\" : 1,\n      \"AXInsertionPointLineNumber\" : 0,\n      \"AXInvalid\" : \"false\",\n      \"AXNumberOfCharacters\" : 0,\n      \"AXParent\" : \"AXUIElement(AxWindowId=913, title=\\\"\\\", role=\\\"AXGroup\\\", subrole=nil)\",\n      \"AXPlaceholderValue\" : null,\n      \"AXRequired\" : 0,\n      \"AXRole\" : \"AXButton\",\n      \"AXRows\" : [\n\n      ],\n      \"AXSelected\" : 0,\n      \"AXSelectedRows\" : [\n\n      ],\n      \"AXSelectedText\" : \"\",\n      \"AXSelectedTextRange\" : \"<AXValue 0x6000024fb630> {value = location:0 length:0 type = kAXValueCFRangeType}\",\n      \"AXSelectedTextRanges\" : [\n        \"<AXValue 0x600002418e10> {value = location:0 length:0 type = kAXValueCFRangeType}\"\n      ],\n      \"AXSubrole\" : null,\n      \"AXTitle\" : \"\",\n      \"AXTitleUIElement\" : null,\n      \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=913, title=\\\"Choose what to share with meet.google.com\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXURL\" : null,\n      \"AXValue\" : \"\",\n      \"AXVisibleCharacterRange\" : \"<AXValue 0x6000024fb630> {value = location:0 length:0 type = kAXValueCFRangeType}\",\n      \"AXVisited\" : 0,\n      \"AXWindow\" : \"AXUIElement(AxWindowId=913, title=\\\"Choose what to share with meet.google.com\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"Aero.AxIgnored\" : \"AXFocused, AXRoleDescription, AXHelp, AXChildren, AXSize, AXFocusableAncestor, AXPosition, AXFrame\",\n      \"ChromeAXNodeId\" : \"28846\"\n    },\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=913, title=\\\"Choose what to share with meet.google.com\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=441, title=\\\"Meet – hjq-dnoz-obo - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000024fb840> {pid=552}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Chrome\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=913, title=\\\"Choose what to share with meet.google.com\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=441, title=\\\"Meet – hjq-dnoz-obo - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.google.Chrome\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Google%20Chrome.app/Contents/MacOS/Google%20Chrome\",\n  \"Aero.App.version\" : \"7151.104\",\n  \"Aero.App.versionShort\" : \"137.0.7151.104\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 913,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/chrome_extensions_popup.json5",
    "content": "// Top right corner -> Extensions\n{\n  \"AXActivationPoint\" : \"<AXValue 0x60000198b9c0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000de7f80> {value = x:1385.000000 y:124.000000 w:320.000000 h:537.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018d6790> {pid=34617}\",\n  \"AXPosition\" : \"<AXValue 0x6000018d6790> {value = x:1385.000000 y:124.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018d7390> {pid=34617}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018d5740> {pid=34617}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018d6790> {value = w:320.000000 h:537.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14076, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000019884b0> {pid=34617}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Chrome\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14076, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=14057, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.google.Chrome\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Google%20Chrome.app/Contents/MacOS/Google%20Chrome\",\n  \"Aero.App.version\" : \"7049.116\",\n  \"Aero.App.versionShort\" : \"135.0.7049.116\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14076,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"move-node-to-workspace F\",\n      \"matcher\" : \"appId=\\\"com.google.Chrome\\\"\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/chrome_find_in_page.json5",
    "content": "// cmd+f\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019390e0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002b0380> {value = x:1131.000000 y:116.000000 w:403.000000 h:84.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000019390e0> {pid=34617}\",\n  \"AXPosition\" : \"<AXValue 0x6000019390e0> {value = x:1131.000000 y:116.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x60000193b570> {pid=34617}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x60000193b540> {pid=34617}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000019390e0> {value = w:403.000000 h:84.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"Find in page\\n    New Tab\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14403, title=\\\"\\\", role=\\\"AXTextField\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14403, title=\\\"Find in page\\n    New Tab\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14400, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018ce5e0> {pid=34617}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Chrome\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14403, title=\\\"Find in page\\n    New Tab\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=14400, title=\\\"New Tab - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.google.Chrome\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Google%20Chrome.app/Contents/MacOS/Google%20Chrome\",\n  \"Aero.App.version\" : \"7049.116\",\n  \"Aero.App.versionShort\" : \"135.0.7049.116\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14403,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"move-node-to-workspace F\",\n      \"matcher\" : \"appId=\\\"com.google.Chrome\\\"\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/chrome_pip.json5",
    "content": "// Share you screen in GMeet\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018cf060> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000d96640> {value = x:1218.000000 y:587.000000 w:400.000000 h:225.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x60000194ff00> {pid=34617}\",\n  \"AXPosition\" : \"<AXValue 0x6000018cf060> {value = x:1218.000000 y:587.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018cc000> {pid=34617}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018cc2a0> {pid=34617}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018cf060> {value = w:400.000000 h:225.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Picture-in-picture\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14413, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14413, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018cd3e0> {pid=34617}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Chrome\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14413, title=\\\"Picture-in-picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=14400, title=\\\"John Cena Prank Call - YouTube – Video playing in picture-in-picture mode - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.google.Chrome\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Google%20Chrome.app/Contents/MacOS/Google%20Chrome\",\n  \"Aero.App.version\" : \"7049.116\",\n  \"Aero.App.versionShort\" : \"135.0.7049.116\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14413,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"move-node-to-workspace F\",\n      \"matcher\" : \"appId=\\\"com.google.Chrome\\\"\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/chrome_sharing_is_in_progress_popup.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600002407f90> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003fcfb00> {value = x:687.000000 y:1109.000000 w:426.000000 h:60.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002407f90> {pid=552}\",\n  \"AXPosition\" : \"<AXValue 0x600002402250> {value = x:687.000000 y:1109.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000024075a0> {pid=552}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000024078a0> {pid=552}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002402ca0> {value = w:426.000000 h:60.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"meet.google.com is sharing a window.\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=913, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=441, title=\\\"Meet – hjq-dnoz-obo - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002402940> {pid=552}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Chrome\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=920, title=\\\"meet.google.com is sharing a window.\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=913, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=441, title=\\\"Meet – hjq-dnoz-obo - Google Chrome\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.google.Chrome\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Google%20Chrome.app/Contents/MacOS/Google%20Chrome\",\n  \"Aero.App.version\" : \"7151.104\",\n  \"Aero.App.versionShort\" : \"137.0.7151.104\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 920,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : 25,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/cleanshotx_monitor_1.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x9de8edaa0> {value = x:-1.000000 y:2161.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x9dfc94640> {value = x:0.000000 y:0.000000 w:3840.000000 h:2160.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x9dec48ed0> {pid=972}\",\n  \"AXPosition\" : \"<AXValue 0x9de8edaa0> {value = x:0.000000 y:0.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x9de8edaa0> {value = w:3840.000000 h:2160.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x9dec48840> {pid=972}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=70857, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=70857, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=70857, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x9dec48840> {pid=972}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"CleanShot X\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=70858, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=70857, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=70860, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=70859, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"pl.maketheweb.cleanshotx\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/CleanShot%20X.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/CleanShot%20X.app/Contents/MacOS/CleanShot%20X\",\n  \"Aero.App.pid\" : 972,\n  \"Aero.App.version\" : \"4.8.4\",\n  \"Aero.App.versionShort\" : \"4.8.4\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 70857,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"layout floating\",\n      \"matcher\" : \"appNameRegexSubstrin=Regex\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : 103,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/cleanshotx_monitor_2.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x9de8f00c0> {value = x:-1.000000 y:2161.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x9df4bc8c0> {value = x:0.000000 y:2091.000000 w:694.000000 h:69.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x9dead1140> {pid=972}\",\n  \"AXPosition\" : \"<AXValue 0x9de511aa0> {value = x:0.000000 y:2091.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x9de8f00c0> {value = w:694.000000 h:69.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x9dead1410> {pid=972}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=70857, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=70857, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=70857, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x9dead1410> {pid=972}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"CleanShot X\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=70858, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=70857, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=70860, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=70859, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"pl.maketheweb.cleanshotx\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/CleanShot%20X.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/CleanShot%20X.app/Contents/MacOS/CleanShot%20X\",\n  \"Aero.App.pid\" : 972,\n  \"Aero.App.version\" : \"4.8.4\",\n  \"Aero.App.versionShort\" : \"4.8.4\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 70860,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"layout floating\",\n      \"matcher\" : \"appNameRegexSubstrin=Regex\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : 103,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/drracket.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000021a3360> {value = x:70.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x6000035418c0> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000020d8450> {pid=52541}\",\n  \"AXPosition\" : \"<AXValue 0x6000021a3660> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000020d8840> {pid=52541}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000020d4c00> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"main.rkt - DrRacket\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=18886, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000020f49f0> {pid=52541}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"DrRacket\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=19150, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=18886, title=\\\"main.rkt - DrRacket\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.racket-lang.DrRacket\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Racket%20v8.18/bin/../DrRacket.app/Contents/MacOS/DrRacket\",\n  \"Aero.App.pid\" : 52541,\n  \"Aero.App.version\" : \"8.18\",\n  \"Aero.App.versionShort\" : \"8.18\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 18886,\n  \"Aero.macOS.version\" : \"Version 15.6 (Build 24G84)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/finder.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x60000193b4e0> {value = x:10.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002c9180> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"FinderWindow\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018c7330> {pid=1312}\",\n  \"AXPosition\" : \"<AXValue 0x60000193b660> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : \"AXUIElement(AxWindowId=14283, title=\\\"Macintosh HD\\\", role=\\\"AXImage\\\", subrole=nil)\",\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x60000193b0f0> {pid=1312}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = \\\"Content Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x60000193b030> {pid=1312}\\\";\\n    SectionUniqueID = AXContentNavigator;\\n}\",\n    \"{\\n    SectionDescription = Search;\\n    SectionObject = \\\"<AXUIElement 0x60000193af40> {pid=1312}\\\";\\n    SectionUniqueID = AXSearch;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x60000193b090> {pid=1312}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x60000193b2a0> {pid=1312}\\\";\\n    SectionUniqueID = AXTopLevelNavigator;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001995bc0> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"/Users/bobko\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=14283, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXValue\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14283, title=nil, role=\\\"AXOutline\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : \"<AXValue 0x60000029e800> {value = x:0.000000 y:1169.000000 w:0.000000 h:0.000000 type = kAXValueCGRectType}\",\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018d0030> {pid=1312}\",\n    \"AXPosition\" : \"<AXValue 0x600001995bc0> {value = x:0.000000 y:1169.000000 type = kAXValueCGPointType}\",\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : \"<AXValue 0x60000192b900> {value = w:0.000000 h:0.000000 type = kAXValueCGSizeType}\",\n    \"AXTitle\" : \"Finder\",\n    \"AXValue\" : null,\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14283, title=\\\"/Users/bobko\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"<AXUIElement 0x6000019c2ee0> {pid=1312}\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.finder\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Library/CoreServices/Finder.app/Contents/MacOS/Finder\",\n  \"Aero.App.version\" : \"1732.4.3\",\n  \"Aero.App.versionShort\" : \"15.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14283,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/finder_quick_look.json5",
    "content": "// select any file -> press space\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600001db05d0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXIdentifier\" : \"close panel button\",\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3126, title=\\\"Quick Look\\\", role=\\\"AXWindow\\\", subrole=\\\"Quick Look\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : \"\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3126, title=\\\"Quick Look\\\", role=\\\"AXWindow\\\", subrole=\\\"Quick Look\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3126, title=\\\"Quick Look\\\", role=\\\"AXWindow\\\", subrole=\\\"Quick Look\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x60000095b000> {value = x:1262.000000 y:316.000000 w:816.000000 h:849.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600001db05d0> {pid=1312}\",\n  \"AXPosition\" : \"<AXValue 0x600001d7a880> {value = x:1262.000000 y:316.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001c3c300> {pid=1312}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001c3fde0> {pid=1312}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001c3f270> {value = w:816.000000 h:849.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"Quick Look\",\n  \"AXTitle\" : \"Quick Look\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXIdentifier\" : \"full screen window button\",\n    \"AXLayoutDirection\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3126, title=\\\"Quick Look\\\", role=\\\"AXWindow\\\", subrole=\\\"Quick Look\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : \"\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3126, title=\\\"Quick Look\\\", role=\\\"AXWindow\\\", subrole=\\\"Quick Look\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3126, title=\\\"Quick Look\\\", role=\\\"AXWindow\\\", subrole=\\\"Quick Look\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=3126, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=3126, title=\\\"Quick Look\\\", role=\\\"AXWindow\\\", subrole=\\\"Quick Look\\\")\",\n    \"AXFrame\" : \"<AXValue 0x6000006db2c0> {value = x:0.000000 y:1169.000000 w:0.000000 h:0.000000 type = kAXValueCGRectType}\",\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=15986, title=\\\"/opt/homebrew/Caskroom/aerospace/0.18.5-Beta/AeroSpace-v0.18.5-Beta/legal\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001db24f0> {pid=1312}\",\n    \"AXPosition\" : \"<AXValue 0x600001db24f0> {value = x:0.000000 y:1169.000000 type = kAXValueCGPointType}\",\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : \"<AXValue 0x600001db24f0> {value = w:0.000000 h:0.000000 type = kAXValueCGSizeType}\",\n    \"AXTitle\" : \"Finder\",\n    \"AXValue\" : null,\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=3126, title=\\\"Quick Look\\\", role=\\\"AXWindow\\\", subrole=\\\"Quick Look\\\")\",\n      \"AXUIElement(AxWindowId=15986, title=\\\"/opt/homebrew/Caskroom/aerospace/0.18.5-Beta/AeroSpace-v0.18.5-Beta/legal\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"<AXUIElement 0x600001db2070> {pid=1312}\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.finder\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Library/CoreServices/Finder.app/Contents/MacOS/Finder\",\n  \"Aero.App.version\" : \"1732.4.3\",\n  \"Aero.App.versionShort\" : \"15.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 3126,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/firefox.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019fbf60> {value = x:10.000000 y:59.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002cbc00> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000019fbf60> {pid=1405}\",\n  \"AXPosition\" : \"<AXValue 0x6000019fa190> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000019898c0> {pid=1405}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x60000198b210> {pid=1405}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x60000198b8a0> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Mozilla Firefox\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=13054, title=\\\"\\\", role=\\\"AXTextField\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000198a100> {pid=1405}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=13054, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13725.4.14\",\n  \"Aero.App.versionShort\" : \"137.0.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 13054,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"W\"\n}\n"
  },
  {
    "path": "axDumps/firefox_extensions_popup.json5",
    "content": "// Top right corner -> Extensions\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600003c95140> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600002708600> {value = x:1257.000000 y:125.000000 w:379.000000 h:1045.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600003cac870> {pid=15478}\",\n  \"AXPosition\" : \"<AXValue 0x600003c95140> {value = x:1257.000000 y:125.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600003cacc00> {pid=15478}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600003cacd80> {pid=15478}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600003ccf8d0> {value = w:379.000000 h:1045.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=1499, title=\\\"\\\", role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=1499, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=1499, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600003c424f0> {pid=15478}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2198, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=1499, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.pid\" : 15478,\n  \"Aero.App.version\" : \"14225.8.11\",\n  \"Aero.App.versionShort\" : \"142.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections\",\n  \"Aero.axWindowId\" : 2198,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/firefox_mouse_hover_over_extensions_button.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019fbf60> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x60000029ff80> {value = x:1583.000000 y:125.000000 w:69.000000 h:18.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000019fbf60> {pid=1405}\",\n  \"AXPosition\" : \"<AXValue 0x60000193af70> {value = x:1583.000000 y:125.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x6000019fbf60> {value = w:69.000000 h:18.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"Extensions\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=13054, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"The small float tips in firefox will be trated as a window in v0.17.0-Beta · nikitabobko/AeroSpace · Discussion #1115\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"The small float tips in firefox will be trated as a window in v0.17.0-Beta · nikitabobko/AeroSpace · Discussion #1115\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000193bbd0> {pid=1405}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=13196, title=\\\"Extensions\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=13054, title=\\\"The small float tips in firefox will be trated as a window in v0.17.0-Beta · nikitabobko/AeroSpace · Discussion #1115\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13725.4.14\",\n  \"Aero.App.versionShort\" : \"137.0.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 13196,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.windowLevel\" : 101,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/firefox_mouse_hover_over_tab.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019f99b0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000d50640> {value = x:569.000000 y:86.000000 w:280.000000 h:182.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x60000193bb70> {pid=1405}\",\n  \"AXPosition\" : \"<AXValue 0x6000019f99b0> {value = x:569.000000 y:86.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x600001932640> {value = w:280.000000 h:182.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=13054, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"Chrome extensions popup is mistakenly being detected a window. 0.18.0 regression · Issue #1324 · nikitabobko/AeroSpace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=13054, title=\\\"Chrome extensions popup is mistakenly being detected a window. 0.18.0 regression · Issue #1324 · nikitabobko/AeroSpace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000193b330> {pid=1405}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=12431, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=13054, title=\\\"Chrome extensions popup is mistakenly being detected a window. 0.18.0 regression · Issue #1324 · nikitabobko/AeroSpace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13725.4.14\",\n  \"Aero.App.versionShort\" : \"137.0.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 12431,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/firefox_non_native_fullscreen.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018ced00> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000297580> {value = x:0.000000 y:0.000000 w:1800.000000 h:1169.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018ced00> {pid=1405}\",\n  \"AXPosition\" : \"<AXValue 0x6000018ced00> {value = x:0.000000 y:0.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001969020> {pid=1405}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001969890> {pid=1405}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018ced00> {value = w:1800.000000 h:1169.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"Поперечный - ПОП КУЛЬТУРА - YouTube\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14384, title=\\\"YouTube Video Player in Full screen\\\", role=\\\"AXGroup\\\", subrole=\\\"AXApplicationGroup\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14384, title=\\\"Поперечный - ПОП КУЛЬТУРА - YouTube\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14384, title=\\\"Поперечный - ПОП КУЛЬТУРА - YouTube\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018d05d0> {pid=1405}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14384, title=\\\"Поперечный - ПОП КУЛЬТУРА - YouTube\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=13054, title=\\\"YouTube\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13725.4.14\",\n  \"Aero.App.versionShort\" : \"137.0.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14384,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"W\"\n}\n"
  },
  {
    "path": "axDumps/firefox_normal_window_when_non_native_fullscreen_in_background.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600001218210> {value = x:10.000000 y:59.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x600000993a80> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0, // Honestly, I think it's a firefox bug\n    \"AXParent\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600001283c30> {pid=24011}\",\n  \"AXPosition\" : \"<AXValue 0x6000012f9500> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001263240> {pid=24011}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001283c30> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Mozilla Firefox\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4294, title=\\\"\\\", role=\\\"AXTextField\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001220060> {pid=24011}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4294, title=\\\"Mozilla Firefox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13925.5.29\",\n  \"Aero.App.versionShort\" : \"139.0.1\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 4294,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true, // todo fix\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"W\"\n}\n"
  },
  {
    "path": "axDumps/firefox_pinterest_sign_in_with_google.json5",
    "content": "// https://www.pinterest.com -> Sign in with Google\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600001997690> {value = x:1869.000000 y:1155.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000d95540> {value = x:1799.000000 y:1141.000000 w:500.000000 h:618.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018df6f0> {pid=1405}\",\n  \"AXPosition\" : \"<AXValue 0x600001997690> {value = x:1799.000000 y:1141.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001994300> {pid=1405}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000019965e0> {pid=1405}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018df6f0> {value = w:500.000000 h:618.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Inloggen - Google Accounts\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14685, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018deb20> {pid=1405}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14685, title=\\\"Inloggen - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13054, title=\\\"Pinterest\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13725.4.14\",\n  \"Aero.App.versionShort\" : \"137.0.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14685,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false, // todo fix?\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"W\"\n}\n"
  },
  {
    "path": "axDumps/firefox_pip.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019c2430> {value = x:1057.000000 y:423.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000db4ec0> {value = x:1047.000000 y:409.000000 w:715.000000 h:402.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018ce190> {pid=1405}\",\n  \"AXPosition\" : \"<AXValue 0x6000019c2430> {value = x:1047.000000 y:409.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018cd710> {pid=1405}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018cf1b0> {pid=1405}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000019c2a30> {value = w:715.000000 h:402.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Picture-in-Picture\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXGroup\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018cf3f0> {pid=1405}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14336, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13839, title=\\\"Поперечный - ПОП КУЛЬТУРА - YouTube\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13054, title=\\\"YouTube\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13725.4.14\",\n  \"Aero.App.versionShort\" : \"137.0.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14336,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/ghostty.json5",
    "content": "// ~/.config/ghostty/config -> window-decoration = true (default)\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019960a0> {value = x:100.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"file:///Users/bobko/\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000d40340> {value = x:30.000000 y:44.000000 w:1770.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"TerminalWindowRestoration\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018da5e0> {pid=41303}\",\n  \"AXPosition\" : \"<AXValue 0x6000019aa3a0> {value = x:30.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : \"AXUIElement(AxWindowId=14591, title=\\\"bobko\\\", role=\\\"AXImage\\\", subrole=nil)\",\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018ccf90> {pid=41303}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018cec10> {pid=41303}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001971f50> {value = w:1770.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"~\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=14591, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14591, title=nil, role=\\\"AXUnknown\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000194e700> {pid=41303}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Ghostty\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14591, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.mitchellh.ghostty\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Ghostty.app/Contents/MacOS/ghostty\",\n  \"Aero.App.version\" : \"9438\",\n  \"Aero.App.versionShort\" : \"1.1.3\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14591,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/ghostty_about.json5",
    "content": "// Menu bar -> Ghostty -> About Ghostty\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600000aa7960> {value = x:970.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600001010040> {value = x:900.000000 y:44.000000 w:300.000000 h:429.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:9\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600000ab4600> {pid=70565}\",\n  \"AXPosition\" : \"<AXValue 0x600000b47f00> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600000b2e4c0> {pid=70565}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600000aa7960> {value = w:300.000000 h:429.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=21795, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=21795, title=nil, role=\\\"AXLink\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600000ab6130> {pid=70565}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Ghostty\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=21795, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=21704, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.mitchellh.ghostty\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Ghostty.app/Contents/MacOS/ghostty\",\n  \"Aero.App.version\" : \"9438\",\n  \"Aero.App.versionShort\" : \"1.1.3\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 21795,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.macOS.version\" : \"Version 15.4.1 (Build 24E263)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"G\"\n}\n"
  },
  {
    "path": "axDumps/ghostty_check_for_updates_1_dialog.json5",
    "content": "// Menu bar -> Ghostty -> Check for Updates...\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600000a9b630> {value = x:710.000000 y:306.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600001ffc600> {value = x:700.000000 y:292.000000 w:400.000000 h:134.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"SUStatus\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600000a97450> {pid=70565}\",\n  \"AXPosition\" : \"<AXValue 0x600000a97450> {value = x:700.000000 y:292.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : null,\n  \"AXSize\" : \"<AXValue 0x600000a989f0> {value = w:400.000000 h:134.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Updating Ghostty\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=21898, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : {\n      \"AXEnabled\" : 1,\n      \"AXIdentifier\" : \"_NS:8\",\n      \"AXParent\" : \"AXUIElement(AxWindowId=21898, title=\\\"Updating Ghostty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXRole\" : \"AXButton\",\n      \"AXTitle\" : \"Cancel\",\n      \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=21898, title=\\\"Updating Ghostty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXWindow\" : \"AXUIElement(AxWindowId=21898, title=\\\"Updating Ghostty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n    },\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=21898, title=\\\"Updating Ghostty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=21898, title=\\\"Updating Ghostty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600000a94a20> {pid=70565}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Ghostty\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=21898, title=\\\"Updating Ghostty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=21704, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.mitchellh.ghostty\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Ghostty.app/Contents/MacOS/ghostty\",\n  \"Aero.App.version\" : \"9438\",\n  \"Aero.App.versionShort\" : \"1.1.3\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 21898,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false, // todo fix\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.macOS.version\" : \"Version 15.4.1 (Build 24E263)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"G\"\n}\n"
  },
  {
    "path": "axDumps/ghostty_check_for_updates_2_alert.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x7dd7098f0> {value = x:780.000000 y:276.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXIdentifier\" : \"action-button-1\",\n    \"AXParent\" : \"AXUIElement(AxWindowId=2866, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXTitle\" : \"OK\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2866, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2866, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXDescription\" : \"alert\",\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x7dc819740> {value = x:770.000000 y:260.000000 w:260.000000 h:252.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:87\",\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 1,\n  \"AXParent\" : \"<AXUIElement Application 0x7dcc2eb20> {pid=18587}\",\n  \"AXPosition\" : \"<AXValue 0x7dd7098f0> {value = x:770.000000 y:260.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x7dcc2edc0> {pid=18587}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x7dd7098f0> {value = w:260.000000 h:252.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=2866, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2866, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2854, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x7dcc2eb20> {pid=18587}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Ghostty\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2866, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=2854, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.mitchellh.ghostty\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Ghostty.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Ghostty.app/Contents/MacOS/ghostty\",\n  \"Aero.App.pid\" : 18587,\n  \"Aero.App.version\" : \"12214\",\n  \"Aero.App.versionShort\" : \"1.2.3\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXTitleUIElement, get.AXCancelButton, isWritable.AXDescription, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections\",\n  \"Aero.axWindowId\" : 2866,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : 8,\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/ghostty_config_error.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600000a41200> {value = x:470.000000 y:180.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600001f0b440> {value = x:400.000000 y:166.000000 w:960.000000 h:682.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:11\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600000bc8d50> {pid=70565}\",\n  \"AXPosition\" : \"<AXValue 0x600000b99890> {value = x:400.000000 y:166.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600000a42fd0> {pid=70565}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600000a41050> {value = w:960.000000 h:682.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Configuration Errors\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=21850, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=21850, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600000ab9c80> {pid=70565}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Ghostty\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=21850, title=\\\"Configuration Errors\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=21704, title=\\\"ta ~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.mitchellh.ghostty\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Ghostty.app/Contents/MacOS/ghostty\",\n  \"Aero.App.version\" : \"9438\",\n  \"Aero.App.versionShort\" : \"1.1.3\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 21850,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.macOS.version\" : \"Version 15.4.1 (Build 24E263)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : 101,\n  \"Aero.workspace\" : \"G\"\n}\n"
  },
  {
    "path": "axDumps/ghostty_quick_terminal.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x7dd709230> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"file:///Users/bobko/\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x7dc818b80> {value = x:0.000000 y:-172.000000 w:1800.000000 h:400.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"com.mitchellh.ghostty.quickTerminal\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x7dcc2ea90> {pid=18587}\",\n  \"AXPosition\" : \"<AXValue 0x7dd7094d0> {value = x:0.000000 y:-172.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x7dcc2ed00> {pid=18587}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x7dcc2edc0> {pid=18587}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x7dd709230> {value = w:1800.000000 h:400.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXFloatingWindow\",\n  \"AXTitle\" : \"~\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=2861, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2861, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2861, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x7dcc2ea90> {pid=18587}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Ghostty\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2861, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n      \"AXUIElement(AxWindowId=2854, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.mitchellh.ghostty\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Ghostty.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Ghostty.app/Contents/MacOS/ghostty\",\n  \"Aero.App.pid\" : 18587,\n  \"Aero.App.version\" : \"12214\",\n  \"Aero.App.versionShort\" : \"1.2.3\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 2861,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/ghostty_window_decorations_false.json5",
    "content": "// ~/.config/ghostty/config -> window-decoration = false\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c7c00> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"file:///Users/bobko/\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000d957c0> {value = x:900.000000 y:44.000000 w:900.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"TerminalWindowRestoration\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600001996b80> {pid=46546}\",\n  \"AXPosition\" : \"<AXValue 0x600001906130> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018e5740> {pid=46546}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018e7a20> {pid=46546}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018e0660> {value = w:900.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"~\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14769, title=nil, role=\\\"AXUnknown\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14769, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14769, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018c5a10> {pid=46546}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Ghostty\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14769, title=\\\"~\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.mitchellh.ghostty\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Ghostty.app/Contents/MacOS/ghostty\",\n  \"Aero.App.version\" : \"9438\",\n  \"Aero.App.versionShort\" : \"1.1.3\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14769,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/intellij.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c05a0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000242480> {value = x:30.000000 y:44.000000 w:1770.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018cc2a0> {pid=8947}\",\n  \"AXPosition\" : \"<AXValue 0x6000018c4c60> {value = x:30.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018c00f0> {pid=8947}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018c0a20> {pid=8947}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018c05a0> {value = w:1770.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=13585, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018c14d0> {pid=8947}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"IntelliJ IDEA\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13583, title=\\\"jvm-sandbox [~/a/jvm-sandbox] – /Users/bobko/a/jvm-sandbox/src/main/kotlin/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.jetbrains.intellij\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Users/bobko/Applications/ij-241.app/Contents/MacOS/idea\",\n  \"Aero.App.version\" : \"IU-241.17011.79\",\n  \"Aero.App.versionShort\" : \"2024.1.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 13585,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"I\"\n}\n"
  },
  {
    "path": "axDumps/intellij_background_tasks.json5",
    "content": "// run some long running action (e.g. \"rebuild project\", reimport project model, etc.) -> bottom right corner -> click -> \"Background Tasks\" popup\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c4960> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000275c00> {value = x:1338.000000 y:999.000000 w:442.000000 h:134.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018ccfc0> {pid=8947}\",\n  \"AXPosition\" : \"<AXValue 0x6000018c7e40> {value = x:1338.000000 y:999.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018cd050> {pid=8947}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018cfa20> {pid=8947}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018ccfc0> {value = w:442.000000 h:134.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"<AXUIElement 0x6000018c7d50> {pid=8947}\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14780, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/test/kotlin/jvm/gradle/sandbox/AppTest.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018c7d50> {pid=8947}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"IntelliJ IDEA\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14780, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/test/kotlin/jvm/gradle/sandbox/AppTest.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13583, title=\\\"jvm-sandbox [~/a/jvm-sandbox] – /Users/bobko/a/jvm-sandbox/src/main/kotlin/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.jetbrains.intellij\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Users/bobko/Applications/ij-241.app/Contents/MacOS/idea\",\n  \"Aero.App.version\" : \"IU-241.17011.79\",\n  \"Aero.App.versionShort\" : \"2024.1.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14780,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/intellij_context_menu.json5",
    "content": "// Right click in the editor\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018cd9b0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002c6e00> {value = x:712.000000 y:402.000000 w:227.000000 h:468.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018cd9b0> {pid=8947}\",\n  \"AXPosition\" : \"<AXValue 0x6000018cd9b0> {value = x:712.000000 y:402.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018cc330> {pid=8947}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018cd9b0> {value = w:227.000000 h:468.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=13585, title=nil, role=\\\"AXGroup\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018c0840> {pid=8947}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"IntelliJ IDEA\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14241, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13583, title=\\\"jvm-sandbox [~/a/jvm-sandbox] – /Users/bobko/a/jvm-sandbox/src/main/kotlin/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.jetbrains.intellij\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Users/bobko/Applications/ij-241.app/Contents/MacOS/idea\",\n  \"Aero.App.version\" : \"IU-241.17011.79\",\n  \"Aero.App.versionShort\" : \"2024.1.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14241,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/intellij_native_open_window.json5",
    "content": "// File -> Open...\n{\n  \"AXActivationPoint\" : \"<AXValue 0x60000193b5a0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x60000029bf00> {value = x:311.000000 y:45.000000 w:1177.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"open-panel\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 1,\n  \"AXParent\" : \"<AXUIElement Application 0x60000193b5a0> {pid=8947}\",\n  \"AXPosition\" : \"<AXValue 0x600001931980> {value = x:311.000000 y:45.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : null,\n  \"AXSize\" : \"<AXValue 0x60000193b5a0> {value = w:1177.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"Open File or Project\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14487, title=nil, role=\\\"AXList\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14486, title=\\\"Open File or Project\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14486, title=\\\"Open File or Project\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001932f10> {pid=8947}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"IntelliJ IDEA\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14486, title=\\\"Open File or Project\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13583, title=\\\"jvm-sandbox [~/a/jvm-sandbox] – /Users/bobko/a/jvm-sandbox/src/main/kotlin/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.jetbrains.intellij\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Users/bobko/Applications/ij-241.app/Contents/MacOS/idea\",\n  \"Aero.App.version\" : \"IU-241.17011.79\",\n  \"Aero.App.versionShort\" : \"2024.1.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14486,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.workspace\" : \"I\"\n}\n"
  },
  {
    "path": "axDumps/intellij_quick_doc_popup.json5",
    "content": "// Shift + K (IdeaVim) on any symbol\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018ce400> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002968c0> {value = x:576.000000 y:187.000000 w:314.000000 h:113.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018ce1f0> {pid=8947}\",\n  \"AXPosition\" : \"<AXValue 0x6000018ce400> {value = x:576.000000 y:187.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018cdf50> {pid=8947}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018ce070> {pid=8947}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018ce010> {pid=8947}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018cdda0> {pid=8947}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018ce1f0> {value = w:314.000000 h:113.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14242, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14242, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018ce430> {pid=8947}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"IntelliJ IDEA\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14242, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/main/kotlin/jvm/gradle/sandbox/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13583, title=\\\"jvm-sandbox [~/a/jvm-sandbox] – /Users/bobko/a/jvm-sandbox/src/main/kotlin/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.jetbrains.intellij\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Users/bobko/Applications/ij-241.app/Contents/MacOS/idea\",\n  \"Aero.App.version\" : \"IU-241.17011.79\",\n  \"Aero.App.versionShort\" : \"2024.1.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14242,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/intellij_rebase_dialog.json5",
    "content": "// Find Action... -> Rebase\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c7030> {value = x:745.000000 y:557.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002cbdc0> {value = x:675.000000 y:543.000000 w:479.000000 h:125.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018c7030> {pid=8947}\",\n  \"AXPosition\" : \"<AXValue 0x6000018c7600> {value = x:675.000000 y:543.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x60000193a910> {pid=8947}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001938ab0> {pid=8947}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x60000193ad60> {value = w:479.000000 h:125.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Rebase\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=14799, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14799, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018c6d60> {pid=8947}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"IntelliJ IDEA\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14799, title=\\\"Rebase\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=13585, title=\\\"jvm-gradle-sandbox [~/a/jvm-gradle-sandbox] – /Users/bobko/a/jvm-gradle-sandbox/app/src/test/kotlin/jvm/gradle/sandbox/AppTest.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=13583, title=\\\"jvm-sandbox [~/a/jvm-sandbox] – /Users/bobko/a/jvm-sandbox/src/main/kotlin/main.kt\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.jetbrains.intellij\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Users/bobko/Applications/ij-241.app/Contents/MacOS/idea\",\n  \"Aero.App.version\" : \"IU-241.17011.79\",\n  \"Aero.App.versionShort\" : \"2024.1.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14799,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.workspace\" : \"I\"\n}\n"
  },
  {
    "path": "axDumps/iphonesimulator.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000001ed020> {value = x:1809.000000 y:1131.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600001be1e80> {value = x:1799.000000 y:1117.000000 w:447.000000 h:950.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600000186e50> {pid=78264}\",\n  \"AXPosition\" : \"<AXValue 0x600000185e60> {value = x:1799.000000 y:1117.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x6000001ee760> {pid=78264}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000001eda40> {pid=78264}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000001ef810> {value = w:447.000000 h:950.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"iPhone 15 Pro – iOS 17.4\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=9515, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : {\n      \"AXEnabled\" : 1,\n      \"AXParent\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXRole\" : \"AXButton\",\n      \"AXTitle\" : \"Action\",\n      \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXWindow\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n    },\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600000184ab0> {pid=78264}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Simulator\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=9515, title=\\\"iPhone 15 Pro – iOS 17.4\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.iphonesimulator\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator\",\n  \"Aero.App.version\" : \"1042.1\",\n  \"Aero.App.versionShort\" : \"16.0\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 9515,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.workspace\" : \"X\"\n}\n"
  },
  {
    "path": "axDumps/iterm2.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x7dd709ce0> {value = x:30.000000 y:56.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x7dc8193c0> {value = x:0.000000 y:40.000000 w:1800.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x7dcc2edc0> {pid=20059}\",\n  \"AXPosition\" : \"<AXValue 0x7dd709ce0> {value = x:0.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x7dcc2e0d0> {pid=20059}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x7dd709ce0> {value = w:1800.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"aerospace\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=2888, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=2888, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x7dcc2edc0> {pid=20059}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"iTerm2\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2888, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.googlecode.iterm2\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/iTerm.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/iTerm.app/Contents/MacOS/iTerm2\",\n  \"Aero.App.pid\" : 20059,\n  \"Aero.App.version\" : \"3.6.5\",\n  \"Aero.App.versionShort\" : \"3.6.5\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 2888,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/iterm2_hotkey_window.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x8aa011800> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x8aa002f00> {value = x:0.000000 y:40.000000 w:1800.000000 h:667.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x8aa011800> {pid=23805}\",\n  \"AXPosition\" : \"<AXValue 0x8aa011800> {value = x:0.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x8aa011800> {pid=23805}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x8aa011800> {value = w:1800.000000 h:667.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"aerospace\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=3017, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x8aa011800> {pid=23805}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"iTerm2\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=3017, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.googlecode.iterm2\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/iTerm.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/iTerm.app/Contents/MacOS/iTerm2\",\n  \"Aero.App.pid\" : 23805,\n  \"Aero.App.version\" : \"3.6.5\",\n  \"Aero.App.versionShort\" : \"3.6.5\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 3017,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/iterm2_no_title_bar.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x8a92ccb10> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x8a9450400> {value = x:30.000000 y:40.000000 w:1740.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3026, title=\\\"-zsh\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x8a92ccb10> {pid=23805}\",\n  \"AXPosition\" : \"<AXValue 0x8a92ccb10> {value = x:30.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x8a92ccb10> {pid=23805}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x8a92ccb10> {value = w:1740.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"-zsh\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=3026, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x8a92ccb10> {pid=23805}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"iTerm2\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=3026, title=\\\"aerospace\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.googlecode.iterm2\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/iTerm.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/iTerm.app/Contents/MacOS/iTerm2\",\n  \"Aero.App.pid\" : 23805,\n  \"Aero.App.version\" : \"3.6.5\",\n  \"Aero.App.versionShort\" : \"3.6.5\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 3026,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/jetbrains_toolbox.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019898c0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000240900> {value = x:1032.000000 y:48.000000 w:440.000000 h:700.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000019898c0> {pid=92331}\",\n  \"AXPosition\" : \"<AXValue 0x6000019c7450> {value = x:1032.000000 y:48.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000019c7900> {pid=92331}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000019c6a30> {pid=92331}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000019898c0> {value = w:440.000000 h:700.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Toolbox\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x60000198b390> {pid=92331}\",\n    \"AXFocusedUIElement\" : \"<AXUIElement 0x60000198b390> {pid=92331}\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14148, title=\\\"Toolbox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14148, title=\\\"Toolbox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : null,\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"JetBrains Toolbox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14148, title=\\\"Toolbox\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.jetbrains.toolbox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/JetBrains%20Toolbox.app/Contents/MacOS/jetbrains-toolbox\",\n  \"Aero.App.version\" : \"2.6.0.40632\",\n  \"Aero.App.versionShort\" : \"2.6.0.40632\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14148,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/karabiner_event_viewer.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x9788d49c0> {value = x:670.000000 y:54.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x97812a940> {value = x:600.000000 y:40.000000 w:1100.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x978098870> {pid=94075}\",\n  \"AXPosition\" : \"<AXValue 0x9780372d0> {value = x:600.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x978098030> {pid=94075}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x9780983c0> {pid=94075}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x978098870> {pid=94075}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x9788d47b0> {value = w:1100.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Karabiner-EventViewer\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4769, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4769, title=nil, role=\\\"AXGroup\\\", subrole=\\\"AXHostingView\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x978098de0> {pid=94075}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Karabiner-EventViewer\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4769, title=\\\"Karabiner-EventViewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.pqrs.Karabiner-EventViewer\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Karabiner-EventViewer.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Karabiner-EventViewer.app/Contents/MacOS/Karabiner-EventViewer\",\n  \"Aero.App.pid\" : 94075,\n  \"Aero.App.version\" : \"15.2.0\",\n  \"Aero.App.versionShort\" : \"15.2.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4769,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/karabiner_settings.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x978036f70> {value = x:970.000000 y:54.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x978129ac0> {value = x:900.000000 y:40.000000 w:1100.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809d2f0> {pid=94014}\",\n  \"AXPosition\" : \"<AXValue 0x9780362e0> {value = x:900.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809d350> {pid=94014}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = \\\"Content Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x97809d2f0> {pid=94014}\\\";\\n    SectionUniqueID = AXContentNavigator;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978034c90> {value = w:1100.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Karabiner-Elements Settings\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4758, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : {\n      \"AXActivationPoint\" : \"<AXValue 0x978037540> {value = x:1025.000000 y:88.000000 type = kAXValueCGPointType}\",\n      \"AXAttributedDescription\" : \"Simple Modifications{\\n    AXATextAlignmentValue = 2;\\n    AXFont =     {\\n        AXFontFamily = \\\".AppleSystemUIFont\\\";\\n        AXFontName = \\\".SFNS-Regular\\\";\\n        AXFontSize = 13;\\n        AXVisibleName = \\\"System Font Regular\\\";\\n    };\\n    AXForegroundColor = \\\"<CGColor 0x9795a4b60> [<CGColorSpace 0x978b98240> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; Generic RGB Profile)] headroom = 1.000000 ( 1 1 1 1 )\\\";\\n}\",\n      \"AXAutoInteractable\" : 0,\n      \"AXEnabled\" : 1,\n      \"AXParent\" : \"AXUIElement(AxWindowId=4758, title=nil, role=\\\"AXGroup\\\", subrole=\\\"AXHostingView\\\")\",\n      \"AXPath\" : \"Path 0x979038c80:\\n  moveto (0, 1141)\\n    lineto (250, 1141)\\n    lineto (250, 1101)\\n    lineto (0, 1101)\\n    closepath\\n  moveto (0, 1141)\\n\",\n      \"AXRole\" : \"AXButton\",\n      \"AXSubrole\" : null,\n      \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXWindow\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"Aero.AxFailed\" : \"get.AXSubrole\",\n      \"Aero.AxIgnored\" : \"AXFocused, AXRoleDescription, AXChildren, AXChildrenInNavigationOrder, AXFrame, AXSize, AXPosition\"\n    },\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809e190> {pid=94014}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Karabiner-Elements\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4758, title=\\\"Karabiner-Elements Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.pqrs.Karabiner-Elements.Settings\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Karabiner-Elements.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Karabiner-Elements.app/Contents/MacOS/Karabiner-Elements\",\n  \"Aero.App.pid\" : 94014,\n  \"Aero.App.version\" : \"15.2.0\",\n  \"Aero.App.versionShort\" : \"15.2.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4758,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/kitty_quick_access.json5",
    "content": "// /opt/homebrew/bin/kitten quick-access-terminal -- /opt/homebrew/bin/spacelist\n{\n  \"AXActivationPoint\" : \"<AXValue 0x60000277c870> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000033444c0> {value = x:0.000000 y:42.000000 w:1800.000000 h:363.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x60000277c870> {pid=19245}\",\n  \"AXPosition\" : \"<AXValue 0x600002747150> {value = x:0.000000 y:42.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x60000275fe10> {pid=19245}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x60000277c870> {value = w:1800.000000 h:363.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"kitty\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=66133, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=66133, title=\\\"kitty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=66133, title=\\\"kitty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002742ac0> {pid=19245}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"kitty-quick-access\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=66133, title=\\\"kitty\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"net.kovidgoyal.kitty-quick-access\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/kitty.app/Contents/kitty-quick-access.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/kitty.app/Contents/kitty-quick-access.app/Contents/MacOS/kitty-quick-access\",\n  \"Aero.App.pid\" : 19245,\n  \"Aero.App.version\" : \"0.42.2\",\n  \"Aero.App.versionShort\" : \"0.42.2\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 66133,\n  \"Aero.macOS.version\" : \"Version 15.7.1 (Build 24G231)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : 100,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/macos_capslock_popup_safari.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0xbc59b0ff0> {value = x:-1.000000 y:1233.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0xbc4fed500> {value = x:323.000000 y:41.000000 w:83.000000 h:77.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0xbc5887900> {pid=656}\",\n  \"AXPosition\" : \"<AXValue 0xbc59b0ff0> {value = x:323.000000 y:41.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : null,\n  \"AXSize\" : \"<AXValue 0xbc59b0ff0> {value = w:83.000000 h:77.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=50, title=nil, role=\\\"AXTextField\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=50, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXIsScribbleActive\" : 0,\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=50, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0xbc58878d0> {pid=656}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Safari\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=49, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=50, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.Safari\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app/Contents/MacOS/Safari\",\n  \"Aero.App.version\" : \"21622.1.14.11.4\",\n  \"Aero.App.versionShort\" : \"19.0\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 49,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.macOS.version\" : \"Version 26.0 Beta (Build 25A5279m)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/macos_capslock_popup_textedit.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0xbc5b68090> {value = x:-1.000000 y:1233.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0xbc4ba8b00> {value = x:-6.000000 y:128.000000 w:83.000000 h:77.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0xbc5ac3c60> {pid=928}\",\n  \"AXPosition\" : \"<AXValue 0xbc5b68090> {value = x:-6.000000 y:128.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : null,\n  \"AXSize\" : \"<AXValue 0xbc5b68090> {value = w:83.000000 h:77.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=224, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=224, title=\\\"Untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=224, title=\\\"Untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0xbc5ac3a20> {pid=928}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"TextEdit\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=223, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=224, title=\\\"Untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.TextEdit\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/TextEdit.app/Contents/MacOS/TextEdit\",\n  \"Aero.App.version\" : \"412\",\n  \"Aero.App.versionShort\" : \"1.20\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 223,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.macOS.version\" : \"Version 26.0 Beta (Build 25A5279m)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/macos_join_network.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000004348d0> {value = x:470.000000 y:220.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXIdentifier\" : \"_NS:30\",\n    \"AXParent\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXTitle\" : \"Cancel\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600001080cc0> {value = x:400.000000 y:206.000000 w:900.000000 h:578.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:96\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600000431fb0> {pid=73503}\",\n  \"AXPosition\" : \"<AXValue 0x6000004348d0> {value = x:400.000000 y:206.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000004372a0> {pid=73503}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600000431fb0> {value = w:900.000000 h:578.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Join Network\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=9780, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"<AXUIElement 0x600000434db0> {pid=73508}\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : null,\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Captive Network Assistant\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=9780, title=\\\"Join Network\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.CaptiveNetworkAssistant\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///System/Library/CoreServices/Captive%20Network%20Assistant.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Library/CoreServices/Captive%20Network%20Assistant.app/Contents/MacOS/Captive%20Network%20Assistant\",\n  \"Aero.App.pid\" : 73503,\n  \"Aero.App.version\" : \"5.0\",\n  \"Aero.App.versionShort\" : \"5.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 9780,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : 8,\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/macos_share_window_purple_pill_sublime.json5",
    "content": "// Share purple \"pill\" indicator in the window's top left corner - https://github.com/nikitabobko/AeroSpace/issues/1101\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000024333c0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003fcf340> {value = x:908.000000 y:48.000000 w:52.000000 h:20.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:8\",\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000024aefd0> {pid=555}\",\n  \"AXPosition\" : \"<AXValue 0x6000024333c0> {value = x:908.000000 y:48.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : null,\n  \"AXSize\" : \"<AXValue 0x6000024333c0> {value = w:52.000000 h:20.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"Window\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=65, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=65, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 0,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=65, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000243f540> {pid=555}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Sublime Text\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=922, title=\\\"Window\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=65, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.sublimetext.4\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Sublime%20Text.app/Contents/MacOS/sublime_text\",\n  \"Aero.App.version\" : \"4200\",\n  \"Aero.App.versionShort\" : \"Build 4200\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 922,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/marta.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600001994f30> {value = x:970.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000dbe2c0> {value = x:900.000000 y:44.000000 w:900.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018c7600> {pid=41210}\",\n  \"AXPosition\" : \"<AXValue 0x600001996b80> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001995d40> {pid=41210}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001995aa0> {pid=41210}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001997150> {pid=41210}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001994a50> {pid=41210}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018d0150> {value = w:900.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Marta\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14545, title=nil, role=\\\"AXScrollArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000019967c0> {pid=41210}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Marta\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14545, title=\\\"Marta\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.yanex.marta\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Marta.app/Contents/MacOS/Marta\",\n  \"Aero.App.version\" : \"0.8.200\",\n  \"Aero.App.versionShort\" : \"0.8.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14545,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/microsoft_edge.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x8f7c908d0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"https://www.youtube.com/watch?v=N0WuXG1wGQk\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x8f8bbd580> {value = x:900.000000 y:40.000000 w:900.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x8f7c908d0> {pid=58546}\",\n  \"AXPosition\" : \"<AXValue 0x8f7c908d0> {value = x:900.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x8f7c92550> {pid=58546}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x8f7c908d0> {pid=58546}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x8f7c908d0> {value = w:900.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x8f7c90930> {pid=58546}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Edge\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.microsoft.edgemac\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Microsoft%20Edge.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Microsoft%20Edge.app/Contents/MacOS/Microsoft%20Edge\",\n  \"Aero.App.pid\" : 58546,\n  \"Aero.App.version\" : \"142.3595.25111994\",\n  \"Aero.App.versionShort\" : \"142.0.3595.94\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4350,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/microsoft_edge_pip.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x8f82f84e0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x8f8905340> {value = x:1175.000000 y:807.000000 w:602.000000 h:339.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x8f82f84e0> {pid=58546}\",\n  \"AXPosition\" : \"<AXValue 0x8f82fad30> {value = x:1175.000000 y:807.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x8f82fb600> {pid=58546}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x8f82f84e0> {pid=58546}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x8f82f84e0> {value = w:602.000000 h:339.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Picture in Picture\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x8f82fb990> {pid=58546}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Edge\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4363, title=\\\"Picture in Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=4350, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube - Video playing in picture-in-picture mode - Microsoft Edge\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.microsoft.edgemac\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Microsoft%20Edge.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Microsoft%20Edge.app/Contents/MacOS/Microsoft%20Edge\",\n  \"Aero.App.pid\" : 58546,\n  \"Aero.App.version\" : \"142.3595.25111994\",\n  \"Aero.App.versionShort\" : \"142.0.3595.94\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXSize\",\n  \"Aero.axWindowId\" : 4363,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/mpv_fullscreen.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019329d0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x6000002e1d00> {value = x:0.000000 y:0.000000 w:1800.000000 h:1169.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018cff60> {pid=38857}\",\n  \"AXPosition\" : \"<AXValue 0x600001995c80> {value = x:0.000000 y:0.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x6000019943f0> {value = w:1800.000000 h:1169.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001932640> {pid=38857}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"mpv\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"NULL-APP-BUNDLE-ID\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///opt/homebrew/bin/mpv\",\n  \"Aero.App.version\" : null,\n  \"Aero.App.versionShort\" : null,\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14286,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\", // todo fix?\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/mpv_windowed.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600001931d40> {value = x:1210.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x6000002897c0> {value = x:1200.000000 y:44.000000 w:599.000000 h:337.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000019fb2d0> {pid=38857}\",\n  \"AXPosition\" : \"<AXValue 0x6000018cdb60> {value = x:1200.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018d07e0> {pid=38857}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000019fb2d0> {value = w:599.000000 h:337.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=14286, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018d2010> {pid=38857}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"mpv\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14286, title=\\\"The past, present, and future of local-first - Martin Kleppmann (Local-First Conf) [NMq0vncHJvU].mkv - mpv\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"NULL-APP-BUNDLE-ID\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///opt/homebrew/bin/mpv\",\n  \"Aero.App.version\" : null,\n  \"Aero.App.versionShort\" : null,\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14286,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/nomachine_session_1.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x60000376f3f0> {value = x:10.000000 y:70.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x600002c472c0> {value = x:0.000000 y:56.000000 w:1512.000000 h:922.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000037a1290> {pid=98872}\",\n  \"AXPosition\" : \"<AXValue 0x6000037be520> {value = x:0.000000 y:56.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000037a2070> {pid=98872}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600003762880> {value = w:1512.000000 h:922.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=38736, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=38736, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=38736, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 0,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=38736, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000037a3ae0> {pid=98872}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"NoMachine\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=38736, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.nomachine.nxdock\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/NoMachine.app/Contents/MacOS/nxplayer\",\n  \"Aero.App.version\" : \"8.17.2\",\n  \"Aero.App.versionShort\" : \"8.17.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 38736,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"layout floating; move-node-to-workspace V\",\n      \"matcher\" : \"appId=\\\"com.nomachine.nxdock\\\"\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"C\"\n}\n"
  },
  {
    "path": "axDumps/nomachine_session_2.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600003763990> {value = x:1990.000000 y:264.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600002c2e900> {value = x:1920.000000 y:250.000000 w:1512.000000 h:950.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x60000376d230> {pid=98872}\",\n  \"AXPosition\" : \"<AXValue 0x60000372a220> {value = x:1920.000000 y:250.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000037be130> {pid=98872}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x60000372a430> {value = w:1512.000000 h:950.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=38734, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=38734, title=nil, role=\\\"AXUnknown\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 0,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600003753c30> {pid=98872}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"NoMachine\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=38734, title=\\\"NoMachine - ubuntu20, Ubuntu 22.04.5 LTS\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=38736, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.nomachine.nxdock\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/NoMachine.app/Contents/MacOS/nxplayer\",\n  \"Aero.App.version\" : \"8.17.2\",\n  \"Aero.App.versionShort\" : \"8.17.2\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 38734,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"layout floating; move-node-to-workspace V\",\n      \"matcher\" : \"appId=\\\"com.nomachine.nxdock\\\"\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"V\"\n}\n"
  },
  {
    "path": "axDumps/nomachine_welcome_window_1.json5",
    "content": "// NoMachine is weird. It shows one visible window, but creates 2 AX objects.\n// AeroSpace has to deliberatery ignore the redundant AX object to avoid weird focus issues\n// ./nomachine_welcome_window_1.json5 -- valid AX object\n// ./nomachine_welcome_window_2.json5 -- weird AX object\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600002fb4240> {value = x:930.000000 y:663.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x600003473680> {value = x:920.000000 y:649.000000 w:880.000000 h:520.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002f4b240> {pid=64949}\",\n  \"AXPosition\" : \"<AXValue 0x600002f4b240> {value = x:920.000000 y:649.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002f56cd0> {pid=64949}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002fb4240> {value = w:880.000000 h:520.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=9384, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=9384, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=9384, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 0,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=9384, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002fb4780> {pid=64949}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"NoMachine\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=9384, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.nomachine.nxdock\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/NoMachine.app/Contents/MacOS/nxplayer\",\n  \"Aero.App.pid\" : 64949,\n  \"Aero.App.version\" : \"8.16.1\",\n  \"Aero.App.versionShort\" : \"8.16.1\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 9384,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/nomachine_welcome_window_2.json5",
    "content": "// NoMachine is weird. It shows one visible window, but creates 2 AX objects.\n// AeroSpace has to deliberatery ignore the redundant AX object to avoid weird focus issues\n// ./nomachine_welcome_window_1.json5 -- valid AX object\n// ./nomachine_welcome_window_2.json5 -- weird AX object\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600002fb96b0> {value = x:603.000000 y:343.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003473780> {value = x:533.000000 y:329.000000 w:880.000000 h:548.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002fbb0c0> {pid=64949}\",\n  \"AXPosition\" : \"<AXValue 0x600002f4b750> {value = x:533.000000 y:329.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002fb4ed0> {pid=64949}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002fbb0c0> {value = w:880.000000 h:548.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"NoMachine\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=9383, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=9383, title=nil, role=\\\"AXUnknown\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002f56910> {pid=64949}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"NoMachine\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=9383, title=\\\"NoMachine\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.nomachine.nxdock\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/NoMachine.app/Contents/MacOS/nxplayer\",\n  \"Aero.App.pid\" : 64949,\n  \"Aero.App.version\" : \"8.16.1\",\n  \"Aero.App.versionShort\" : \"8.16.1\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 9383,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/qutebrowser.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x978037240> {value = x:970.000000 y:54.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x97812a600> {value = x:900.000000 y:40.000000 w:900.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809e0a0> {pid=96882}\",\n  \"AXPosition\" : \"<AXValue 0x978037510> {value = x:900.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x9784182d0> {pid=96882}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = \\\"Top Level Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x9784180c0> {pid=96882}\\\";\\n    SectionUniqueID = AXTopLevelNavigator;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x978418150> {pid=96882}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978037c30> {value = w:900.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Change Log - qutebrowser\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4815, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4815, title=\\\"\\\", role=\\\"AXGroup\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809dfb0> {pid=96882}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"qutebrowser\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.qutebrowser.qutebrowser\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/qutebrowser.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/qutebrowser.app/Contents/MacOS/qutebrowser\",\n  \"Aero.App.pid\" : 96882,\n  \"Aero.App.version\" : \"3.6.1\",\n  \"Aero.App.versionShort\" : \"3.6.1\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4815,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/qutebrowser_context_menu.json5",
    "content": "// Right click\n{\n  \"AXActivationPoint\" : \"<AXValue 0x978036460> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x978129800> {value = x:1358.000000 y:160.000000 w:164.000000 h:122.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809e1c0> {pid=96882}\",\n  \"AXPosition\" : \"<AXValue 0x9780376c0> {value = x:1358.000000 y:160.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809e1c0> {pid=96882}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978036460> {value = w:164.000000 h:122.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log\\\", role=\\\"AXGroup\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809dfb0> {pid=96882}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"qutebrowser\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4820, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=4815, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.qutebrowser.qutebrowser\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/qutebrowser.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/qutebrowser.app/Contents/MacOS/qutebrowser\",\n  \"Aero.App.pid\" : 96882,\n  \"Aero.App.version\" : \"3.6.1\",\n  \"Aero.App.versionShort\" : \"3.6.1\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMinimized\",\n  \"Aero.axWindowId\" : 4820,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : 101,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/qutebrowser_hide_decoration.json5",
    "content": "// :set window.hide_decoration\n{\n  \"AXActivationPoint\" : \"<AXValue 0x978037c30> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x97812b480> {value = x:900.000000 y:40.000000 w:900.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809da10> {pid=96739}\",\n  \"AXPosition\" : \"<AXValue 0x978036700> {value = x:900.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809d6e0> {pid=96739}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = \\\"Top Level Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x97809d410> {pid=96739}\\\";\\n    SectionUniqueID = AXTopLevelNavigator;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x97809da10> {pid=96739}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978037c30> {value = w:900.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"Change Log - qutebrowser\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4799, title=\\\"Change Log\\\", role=\\\"AXGroup\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4799, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : null,\n    \"AXMenuBar\" : \"<AXUIElement 0x97809e2e0> {pid=96739}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"qutebrowser\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4799, title=\\\"Change Log - qutebrowser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXMainWindow, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.qutebrowser.qutebrowser\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/qutebrowser.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/qutebrowser.app/Contents/MacOS/qutebrowser\",\n  \"Aero.App.pid\" : 96739,\n  \"Aero.App.version\" : \"3.6.1\",\n  \"Aero.App.versionShort\" : \"3.6.1\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4799,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/raycast.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600002fcb030> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003402880> {value = x:525.000000 y:188.000000 w:750.000000 h:474.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002fc8c00> {pid=76823}\",\n  \"AXPosition\" : \"<AXValue 0x600002fc9170> {value = x:525.000000 y:188.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002fc8a80> {pid=76823}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002fc8c00> {value = w:750.000000 h:474.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXSystemDialog\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=26499, title=nil, role=\\\"AXTextField\\\", subrole=\\\"raycast_searchField\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=26499, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXSystemDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=26499, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXSystemDialog\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002fca730> {pid=76823}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Raycast\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=26499, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXSystemDialog\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.raycast.macos\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Raycast.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Raycast.app/Contents/MacOS/Raycast\",\n  \"Aero.App.pid\" : 76823,\n  \"Aero.App.version\" : \"0\",\n  \"Aero.App.versionShort\" : \"1.103.7\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 26499,\n  \"Aero.macOS.version\" : \"Version 15.7.1 (Build 24G231)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : 8,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/raycast_settings.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600002fcb240> {value = x:470.000000 y:167.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x600003415740> {value = x:400.000000 y:153.000000 w:1000.000000 h:604.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002fcb9c0> {pid=76823}\",\n  \"AXPosition\" : \"<AXValue 0x600002fec300> {value = x:400.000000 y:153.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002fc9380> {pid=76823}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002fcb9c0> {value = w:1000.000000 h:604.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Settings\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002fc8f60> {pid=76823}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Raycast\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=28386, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.raycast.macos\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Raycast.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Raycast.app/Contents/MacOS/Raycast\",\n  \"Aero.App.pid\" : 76823,\n  \"Aero.App.version\" : \"0\",\n  \"Aero.App.versionShort\" : \"1.103.7\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 28386,\n  \"Aero.macOS.version\" : \"Version 15.7.1 (Build 24G231)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/safari.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019a7de0> {value = x:910.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000294f00> {value = x:900.000000 y:44.000000 w:900.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"SafariWindow?IsSecure=false&UUID=DC64557C-318F-4644-8AE3-8925469E902C\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000019ac8d0> {pid=45941}\",\n  \"AXPosition\" : \"<AXValue 0x60000193b660> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x60000191b510> {pid=45941}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x60000191aca0> {pid=45941}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = \\\"Top Level Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x6000019581e0> {pid=45941}\\\";\\n    SectionUniqueID = AXTopLevelNavigator;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001939c50> {value = w:900.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Start Page\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14665, title=nil, role=\\\"AXTextField\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXIsScribbleActive\" : 0,\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018d3990> {pid=45941}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Safari\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14665, title=\\\"Start Page\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.Safari\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app/Contents/MacOS/Safari\",\n  \"Aero.App.version\" : \"20621.1.15.11.10\",\n  \"Aero.App.versionShort\" : \"18.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14665,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/safari_pinterest_sign_in_with_google.json5",
    "content": "// https://www.pinterest.com -> Sign in with Google\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018badc0> {value = x:720.000000 y:323.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x60000033cbc0> {value = x:650.000000 y:309.000000 w:500.000000 h:550.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"SafariWindow?IsSecure=true&UUID=5741B7F9-21AF-426C-B8AA-6DE263C3792B\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018bc330> {pid=16736}\",\n  \"AXPosition\" : \"<AXValue 0x6000018badc0> {value = x:650.000000 y:309.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018bd200> {pid=16736}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = \\\"Top Level Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x6000018bd1a0> {pid=16736}\\\";\\n    SectionUniqueID = AXTopLevelNavigator;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001812730> {value = w:500.000000 h:550.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Sign in - Google Accounts\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"<AXUIElement 0x6000018121f0> {pid=16759}\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXIsScribbleActive\" : 0,\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018bd170> {pid=16736}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Safari\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2210, title=\\\"Sign in - Google Accounts\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=2204, title=\\\"Pinterest\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, isWritable.AXIsScribbleActive, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.Safari\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app/Contents/MacOS/Safari\",\n  \"Aero.App.pid\" : 16736,\n  \"Aero.App.version\" : \"20621.3.11.11.3\",\n  \"Aero.App.versionShort\" : \"18.6\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 2210,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/scenario_firefox_google_meet_share_window/01_firefox.json5",
    "content": "{\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x60000339d3e0> {pid=979}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=307, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000339d3e0> {pid=979}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=310, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13925.6.9\",\n  \"Aero.App.versionShort\" : \"139.0.4\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 11,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/scenario_firefox_google_meet_share_window/02_firefox.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600003336df0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600002811200> {value = x:298.000000 y:123.000000 w:405.000000 h:167.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600003321320> {pid=979}\",\n  \"AXPosition\" : \"<AXValue 0x60000336b4e0> {value = x:298.000000 y:123.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x600003336df0> {value = w:405.000000 h:167.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x6000033212f0> {pid=979}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=307, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000339d470> {pid=979}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=310, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n      \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13925.6.9\",\n  \"Aero.App.versionShort\" : \"139.0.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 12,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/scenario_firefox_google_meet_share_window/03_firefox.json5",
    "content": "{\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x60000337dfb0> {pid=979}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=307, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000339ced0> {pid=979}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=318, title=\\\"Firefox — Sharing Indicator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13925.6.9\",\n  \"Aero.App.versionShort\" : \"139.0.4\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 13,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/scenario_firefox_google_meet_share_window/04_firefox.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600003336a90> {value = x:736.000000 y:150.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600002863000> {value = x:710.000000 y:129.000000 w:379.000000 h:32.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600003361350> {pid=979}\",\n  \"AXPosition\" : \"<AXValue 0x60000339cba0> {value = x:710.000000 y:129.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600003361530> {pid=979}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600003361860> {pid=979}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600003336a90> {value = w:379.000000 h:32.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"Firefox — Sharing Indicator\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x600003336a90> {pid=979}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=307, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000331ba50> {pid=979}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=318, title=\\\"Firefox — Sharing Indicator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13925.6.9\",\n  \"Aero.App.versionShort\" : \"139.0.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 14,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/scenario_firefox_google_meet_share_window/05_apple_controlcenter.json5",
    "content": "{\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x600003383ed0> {pid=562}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=385, title=nil, role=\\\"AXGroup\\\", subrole=\\\"AXHostingView\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=385, title=nil, role=\\\"AXWindow\\\", subrole=\\\"AXSystemDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : null,\n    \"AXMenuBar\" : null,\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Control Centre\",\n    \"AXWindows\" : [\n\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.controlcenter\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Library/CoreServices/ControlCenter.app/Contents/MacOS/ControlCenter\",\n  \"Aero.App.version\" : \"1\",\n  \"Aero.App.versionShort\" : \"1.0\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 15,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/scenario_firefox_google_meet_share_window/06_firefox.json5",
    "content": "{\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x60000336b4e0> {pid=979}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=307, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000033211d0> {pid=979}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=318, title=\\\"Firefox — Sharing Indicator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=391, title=\\\"Window\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13925.6.9\",\n  \"Aero.App.versionShort\" : \"139.0.4\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 17,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/scenario_firefox_google_meet_share_window/07_firefox.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600003335fb0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000027f1b00> {value = x:13.000000 y:56.000000 w:52.000000 h:20.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:8\",\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x60000339cf90> {pid=979}\",\n  \"AXPosition\" : \"<AXValue 0x600003335fb0> {value = x:13.000000 y:56.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : null,\n  \"AXSize\" : \"<AXValue 0x600003307cc0> {value = w:52.000000 h:20.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"Window\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x60000339cdb0> {pid=979}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=307, title=nil, role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x60000339cdb0> {pid=979}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Firefox\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=318, title=\\\"Firefox — Sharing Indicator\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=391, title=\\\"Window\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=307, title=\\\"Meet – rsf-trih-oxo\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.mozilla.firefox\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Firefox.app/Contents/MacOS/firefox\",\n  \"Aero.App.version\" : \"13925.6.9\",\n  \"Aero.App.versionShort\" : \"139.0.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 18,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/scenario_firefox_google_meet_share_window/README.md",
    "content": "1. Open Firefox\n2. https://meet.google.com/\n3. Create an instant meeting\n4. Select the current Firefox window\n\nDuring these steps the user encounters 7 (!) different small popups.\n\nIncluding share purple \"pill\" indicator in the window's top left corner - https://github.com/nikitabobko/AeroSpace/issues/1101\n"
  },
  {
    "path": "axDumps/slack.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x60000264ef10> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003d5a440> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002619260> {pid=80239}\",\n  \"AXPosition\" : \"<AXValue 0x60000264e9d0> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000026d17d0> {pid=80239}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000026d1620> {pid=80239}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002635680> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"general (Channel) - redacted - Slack\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x6000026d1680> {pid=80239}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Slack\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=5018, title=\\\"general (Channel) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXManualAccessibility, AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.tinyspeck.slackmacgap\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Slack.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Slack.app/Contents/MacOS/Slack\",\n  \"Aero.App.pid\" : 80239,\n  \"Aero.App.version\" : \"445000069\",\n  \"Aero.App.versionShort\" : \"4.45.69\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 5018,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/slack_chat_in_a_separate_window.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000026d2fa0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003d719c0> {value = x:900.000000 y:44.000000 w:900.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002619bc0> {pid=80239}\",\n  \"AXPosition\" : \"<AXValue 0x6000026d2d00> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002623870> {pid=80239}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600002623600> {pid=80239}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000026354d0> {value = w:900.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"redacted (Thread) - redacted - Slack\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=5021, title=\\\"\\\", role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x6000026037b0> {pid=80239}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Slack\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=5021, title=\\\"redacted (Thread) - redacted - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=5018, title=\\\"REDACTED (DM) - redacted - Slack [Main] 🏠\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXManualAccessibility, AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.tinyspeck.slackmacgap\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Slack.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Slack.app/Contents/MacOS/Slack\",\n  \"Aero.App.pid\" : 80239,\n  \"Aero.App.version\" : \"445000069\",\n  \"Aero.App.versionShort\" : \"4.45.69\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 5021,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/slack_huddle_share_screen_draw_on_screen_fake_window.json5",
    "content": "// Slack has a feature to draw on screen. It's implemented via fake window\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600001acda10> {value = x:-1.000000 y:1297.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000183200> {value = x:0.000000 y:0.000000 w:2304.000000 h:1296.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600001acda10> {pid=93565}\",\n  \"AXPosition\" : \"<AXValue 0x600001b8c000> {value = x:0.000000 y:0.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001acee20> {pid=93565}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001aceee0> {pid=93565}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001acda10> {value = w:2304.000000 h:1296.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Slack\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=22408, title=\\\"\\\", role=\\\"AXWebArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x600001b8c000> {pid=93565}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Slack\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=22405, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=22410, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXSystemDialog\\\")\",\n      \"AXUIElement(AxWindowId=22392, title=\\\"* bobko-test-2 (Channel) - redacted - Slack [Main] 匠痔\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXManualAccessibility, AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.tinyspeck.slackmacgap\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Slack.app/Contents/MacOS/Slack\",\n  \"Aero.App.pid\" : 93565,\n  \"Aero.App.version\" : \"445000069\",\n  \"Aero.App.versionShort\" : \"4.45.69\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized\",\n  \"Aero.axWindowId\" : 22405,\n  \"Aero.macOS.version\" : \"Version 15.6 (Build 24G84)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : 1000,\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/slack_huddle_share_screen_floating_popup.json5",
    "content": "// Floating popup with buttons like: pen tool, mute, video on/off, end call\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600001a91e90> {value = x:-1.000000 y:1297.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x60000011c180> {value = x:1536.000000 y:25.000000 w:620.000000 h:60.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600001b9c990> {pid=93565}\",\n  \"AXPosition\" : \"<AXValue 0x600001a61350> {value = x:1536.000000 y:25.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001a60ae0> {pid=93565}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600001a61890> {pid=93565}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001b9c990> {value = w:620.000000 h:60.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Slack\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x600001b985a0> {pid=93565}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Slack\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=22408, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=22410, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXSystemDialog\\\")\",\n      \"AXUIElement(AxWindowId=22392, title=\\\"* bobko-test-2 (Channel) - redacted - Slack [Main]\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXManualAccessibility, AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.tinyspeck.slackmacgap\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Slack.app/Contents/MacOS/Slack\",\n  \"Aero.App.pid\" : 93565,\n  \"Aero.App.version\" : \"445000069\",\n  \"Aero.App.versionShort\" : \"4.45.69\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized\",\n  \"Aero.axWindowId\" : 22408,\n  \"Aero.macOS.version\" : \"Version 15.6 (Build 24G84)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : 1001,\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/slack_huddle_share_screen_target_picker.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600002261740> {value = x:-1.000000 y:1297.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003916d80> {value = x:0.000000 y:0.000000 w:2304.000000 h:1296.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002271fe0> {pid=82965}\",\n  \"AXPosition\" : \"<AXValue 0x600002262dc0> {value = x:0.000000 y:0.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x600002271fe0> {value = w:2304.000000 h:1296.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXSystemDialog\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : null,\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : null,\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x600002260c90> {pid=82965}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Slack\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=6600, title=\\\"Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=6155, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXSystemDialog\\\")\",\n      \"AXUIElement(AxWindowId=6141, title=\\\"bobko-test-2 (Channel) - JetBrains - Slack\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXMainWindow, get.AXFocusedWindow, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXManualAccessibility, AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.tinyspeck.slackmacgap\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Slack.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Slack.app/Contents/MacOS/Slack\",\n  \"Aero.App.pid\" : 82965,\n  \"Aero.App.version\" : \"446000096\",\n  \"Aero.App.versionShort\" : \"4.46.96\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 6155,\n  \"Aero.macOS.version\" : \"Version 15.7 (Build 24G222)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : 1000,\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/spotify.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000019f9a40> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"https://xpui.app.spotify.com/index.html\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000de7100> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000019f9a40> {pid=37876}\",\n  \"AXPosition\" : \"<AXValue 0x6000019c27f0> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000019f9470> {pid=37876}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000019fb9f0> {pid=37876}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000019c6f10> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"YONAKA - PREDATOR\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000019c6a00> {pid=37876}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Spotify\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14228, title=\\\"YONAKA - PREDATOR\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.spotify.client\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Spotify.app/Contents/MacOS/Spotify\",\n  \"Aero.App.version\" : \"1.2.61.443\",\n  \"Aero.App.versionShort\" : \"1.2.61.443\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14228,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"B\"\n}\n"
  },
  {
    "path": "axDumps/spotify_miniplayer.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600000006bb0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"about:blank\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600001aa5d00> {value = x:1477.000000 y:846.000000 w:300.000000 h:300.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000001e5950> {pid=89246}\",\n  \"AXPosition\" : \"<AXValue 0x6000001e6520> {value = x:1477.000000 y:846.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000001b9e60> {pid=89246}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000001b8db0> {pid=89246}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600000162e50> {value = w:300.000000 h:300.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"On Repeat | Spotify Playlist\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600000162e50> {pid=89246}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Spotify\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=36854, title=\\\"On Repeat | Spotify Playlist\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=34090, title=\\\"Spotify Premium\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.spotify.client\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Spotify.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Spotify.app/Contents/MacOS/Spotify\",\n  \"Aero.App.pid\" : 89246,\n  \"Aero.App.version\" : \"1.2.77.358\",\n  \"Aero.App.versionShort\" : \"1.2.77.358\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXSize\",\n  \"Aero.axWindowId\" : 36854,\n  \"Aero.macOS.version\" : \"Version 15.7.1 (Build 24G231)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : \"P\"\n}\n"
  },
  {
    "path": "axDumps/steam_1.json5",
    "content": "// Steam is weird. It shows one visible window, but creates 2 AX objects.\n// AeroSpace has to deliberatery ignore the redundant AX object to avoid weird focus issues\n// ./steam_1.json5 -- valid AX object\n// ./steam_2.json5 -- weird AX object\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000026ef030> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003d182c0> {value = x:386.000000 y:131.000000 w:1028.000000 h:864.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000026ef030> {pid=10146}\",\n  \"AXPosition\" : \"<AXValue 0x6000026184e0> {value = x:386.000000 y:131.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x6000026ef030> {value = w:1028.000000 h:864.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Steam\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2170, title=\\\"Steam\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2170, title=\\\"Steam\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : null,\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Steam Helper\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2170, title=\\\"Steam\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXFocusedUIElement, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.valvesoftware.steam.helper\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Users/bobko/Library/Application%20Support/Steam/Steam.AppBundle/Steam/Contents/Frameworks/Steam%20Helper.app/Contents/MacOS/Steam%20Helper\",\n  \"Aero.App.pid\" : 10146,\n  \"Aero.App.version\" : \"1650.57\",\n  \"Aero.App.versionShort\" : \"31.0.1650.57\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 2170,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/steam_2.json5",
    "content": "// Weird AX popup\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000026f0ff0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x600003d8f9c0> {value = x:-15000.000000 y:16168.000000 w:1.000000 h:1.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000026f0ff0> {pid=10129}\",\n  \"AXPosition\" : \"<AXValue 0x6000026583c0> {value = x:-15000.000000 y:16168.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x6000026f4570> {value = w:1.000000 h:1.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=2169, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2169, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2169, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002652d00> {pid=10129}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Steam\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2169, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.valvesoftware.steam\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Users/bobko/Library/Application%20Support/Steam/Steam.AppBundle/Steam/Contents/MacOS/steam_osx\",\n  \"Aero.App.pid\" : 10129,\n  \"Aero.App.version\" : \"4.0\",\n  \"Aero.App.versionShort\" : null,\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 2169,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/sublime_text_4.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c3060> {value = x:70.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x600000294e40> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018cc9f0> {pid=97586}\",\n  \"AXPosition\" : \"<AXValue 0x6000018ce4c0> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018c26d0> {pid=97586}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018c1a40> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"untitled\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=11259, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018cc960> {pid=97586}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Sublime Text\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=11259, title=\\\"untitled\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.sublimetext.4\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Sublime%20Text.app/Contents/MacOS/sublime_text\",\n  \"Aero.App.version\" : \"4192\",\n  \"Aero.App.versionShort\" : \"Build 4192\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 11259,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"E\"\n}\n"
  },
  {
    "path": "axDumps/system_settings.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x9788d4c00> {value = x:816.000000 y:212.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x978c0a740> {value = x:806.000000 y:196.000000 w:723.000000 h:973.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"main\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x9780981e0> {pid=94208}\",\n  \"AXPosition\" : \"<AXValue 0x9788d4540> {value = x:806.000000 y:196.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x978098630> {pid=94208}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x978098150> {pid=94208}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x9780988d0> {pid=94208}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionDescription = Search;\\n    SectionObject = \\\"<AXUIElement 0x978098060> {pid=94208}\\\";\\n    SectionUniqueID = AXSearch;\\n}\",\n    \"{\\n    SectionDescription = \\\"Content Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x9780981e0> {pid=94208}\\\";\\n    SectionUniqueID = AXContentNavigator;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x9788d4c60> {value = w:723.000000 h:973.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=4774, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4774, title=nil, role=\\\"AXOutline\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x9780989f0> {pid=94208}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"System Settings\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4774, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.systempreferences\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///System/Applications/System%20Settings.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/System%20Settings.app/Contents/MacOS/System%20Settings\",\n  \"Aero.App.pid\" : 94208,\n  \"Aero.App.version\" : \"15.0\",\n  \"Aero.App.versionShort\" : \"15.0\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4774,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/telegram.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c1d40> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002bb380> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018c1d40> {pid=5573}\",\n  \"AXPosition\" : \"<AXValue 0x6000018ce520> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018c1bf0> {pid=5573}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018c1d40> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"‎⁨Saved Messages⁩ – (47104)\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=13215, title=\\\"\\\", role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018c4600> {pid=5573}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Telegram\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=13215, title=\\\"‎⁨Saved Messages⁩ – (47104)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.tdesktop.Telegram\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Telegram.app/Contents/MacOS/Telegram\",\n  \"Aero.App.version\" : \"5.14.0\",\n  \"Aero.App.versionShort\" : \"5.14.0\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 13215,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"T\"\n}\n"
  },
  {
    "path": "axDumps/telegram_image_viewer.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x60000142c750> {value = x:-1.000000 y:1297.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x600000e22940> {value = x:0.000000 y:0.000000 w:2304.000000 h:1296.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x60000142c750> {pid=75417}\",\n  \"AXPosition\" : \"<AXValue 0x60000155c1e0> {value = x:0.000000 y:0.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x6000015847e0> {value = w:2304.000000 h:1296.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"Media viewer\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4259, title=\\\"Media viewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4259, title=\\\"Media viewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4232, title=\\\"‎⁨redacted⁩ – (57469)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001431620> {pid=75417}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Telegram\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4259, title=\\\"Media viewer\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=4232, title=\\\"‎⁨redacted⁩ – (57469)\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.tdesktop.Telegram\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Telegram.app/Contents/MacOS/Telegram\",\n  \"Aero.App.version\" : \"5.15.4\",\n  \"Aero.App.versionShort\" : \"5.15.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 4259,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : 101,\n  \"Aero.workspace\" : \"T\"\n}\n"
  },
  {
    "path": "axDumps/terminal_app.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c7240> {value = x:100.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"file:///Users/bobko/\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000d4e300> {value = x:30.000000 y:44.000000 w:1767.000000 h:1113.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:136\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018c7240> {pid=43740}\",\n  \"AXPosition\" : \"<AXValue 0x6000018c3330> {value = x:30.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko\\\", role=\\\"AXImage\\\", subrole=nil)\",\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018d1770> {pid=43740}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018c7240> {value = w:1767.000000 h:1113.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"bobko — -zsh — 251×77\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=14623, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14623, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000019278a0> {pid=43740}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Terminal\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14623, title=\\\"bobko — -zsh — 251×77\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.Terminal\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal\",\n  \"Aero.App.version\" : \"455.1\",\n  \"Aero.App.versionShort\" : \"2.14\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14623,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"M\"\n}\n"
  },
  {
    "path": "axDumps/transmission.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600001d547b0> {value = x:1869.000000 y:1155.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000006d5f40> {value = x:1799.000000 y:1141.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:14\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600001c6c780> {pid=80282}\",\n  \"AXPosition\" : \"<AXValue 0x600001c6db60> {value = x:1799.000000 y:1141.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001d54720> {pid=80282}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x600001d54510> {pid=80282}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001d54660> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Transmission\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=11545, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=11545, title=nil, role=\\\"AXOutline\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001d54690> {pid=80282}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Transmission\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=11545, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=11557, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.m0k.transmission\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Transmission.app/Contents/MacOS/Transmission\",\n  \"Aero.App.version\" : \"14714.3.0\",\n  \"Aero.App.versionShort\" : \"3.00\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.axWindowId\" : 11545,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"B\"\n}\n"
  },
  {
    "path": "axDumps/transmission_torrent_inspector.json5",
    "content": "// Double click any torrent\n{\n  \"AXActivationPoint\" : \"<AXValue 0x978036550> {value = x:546.000000 y:393.500000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x97812b140> {value = x:496.000000 y:384.000000 w:921.000000 h:659.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:135\",\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809e160> {pid=87714}\",\n  \"AXPosition\" : \"<AXValue 0x9780365e0> {value = x:496.000000 y:384.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809cbd0> {pid=87714}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = Search;\\n    SectionObject = \\\"<AXUIElement 0x97809e160> {pid=87714}\\\";\\n    SectionUniqueID = AXSearch;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978036400> {value = w:921.000000 h:659.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXFloatingWindow\",\n  \"AXTitle\" : \"Files - Torrent Inspector\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=3008, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=3007, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809e5b0> {pid=87714}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Transmission\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=3008, title=\\\"Files - Torrent Inspector\\\", role=\\\"AXWindow\\\", subrole=\\\"AXFloatingWindow\\\")\",\n      \"AXUIElement(AxWindowId=3007, title=\\\"Transmission\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.m0k.transmission\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Transmission.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Transmission.app/Contents/MacOS/Transmission\",\n  \"Aero.App.pid\" : 87714,\n  \"Aero.App.version\" : \"14714.3.0\",\n  \"Aero.App.versionShort\" : \"3.00\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXSize\",\n  \"Aero.axWindowId\" : 3008,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"B\"\n}\n"
  },
  {
    "path": "axDumps/vlc_empty.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c41b0> {value = x:703.000000 y:795.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600000db6b80> {value = x:633.000000 y:781.000000 w:725.000000 h:64.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:122\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x60000193eca0> {pid=38681}\",\n  \"AXPosition\" : \"<AXValue 0x60000194ff60> {value = x:633.000000 y:781.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x60000193eb20> {pid=38681}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x6000018c41b0> {value = w:725.000000 h:64.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"VLC media player\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=14277, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x6000018c4840> {pid=38681}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14277, title=nil, role=\\\"AXTextField\\\", subrole=\\\"AXSearchField\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018c3ed0> {pid=38681}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"VLC\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14277, title=\\\"VLC media player\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"org.videolan.vlc\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/VLC.app/Contents/MacOS/VLC\",\n  \"Aero.App.version\" : \"3.0.21\",\n  \"Aero.App.versionShort\" : \"3.0.21\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14277,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.Workspace\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/vlc_fullscreen.json5",
    "content": "// non-native fullscreen (default)\n{\n  \"AXActivationPoint\" : \"<AXValue 0x9780366d0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x97812b000> {value = x:0.000000 y:0.000000 w:1800.000000 h:1169.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809e580> {pid=86771}\",\n  \"AXPosition\" : \"<AXValue 0x978036430> {value = x:0.000000 y:0.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n\n  ],\n  \"AXSize\" : \"<AXValue 0x9780366d0> {value = w:1800.000000 h:1169.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x97809e0d0> {pid=86771}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4856, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4856, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4856, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809e0d0> {pid=86771}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"VLC\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2941, title=\\\"Fullscreen Controls\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=4856, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.videolan.vlc\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/VLC.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/VLC.app/Contents/MacOS/VLC\",\n  \"Aero.App.pid\" : 86771,\n  \"Aero.App.version\" : \"3.0.21\",\n  \"Aero.App.versionShort\" : \"3.0.21\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\", // todo fix\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain\",\n  \"Aero.axWindowId\" : 4856,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/vlc_video_playing.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x9780378d0> {value = x:70.000000 y:159.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"file:///Users/bobko/REDACTED/REDACTED.mkv\",\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x97812b3c0> {value = x:0.000000 y:145.000000 w:1800.000000 h:1024.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"_NS:122\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x97809dfb0> {pid=86771}\",\n  \"AXPosition\" : \"<AXValue 0x9780372a0> {value = x:0.000000 y:145.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED.mkv\\\", role=\\\"AXImage\\\", subrole=nil)\",\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x97809dfb0> {pid=86771}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x978037510> {value = w:1800.000000 h:1024.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"REDACTED\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=2942, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x97809e580> {pid=86771}\",\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809e580> {pid=86771}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"VLC\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2942, title=\\\"REDACTED\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"org.videolan.vlc\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/VLC.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/VLC.app/Contents/MacOS/VLC\",\n  \"Aero.App.pid\" : 86771,\n  \"Aero.App.version\" : \"3.0.21\",\n  \"Aero.App.versionShort\" : \"3.0.21\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 2942,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"F\"\n}\n"
  },
  {
    "path": "axDumps/vs_code.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018c6af0> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002cb200> {value = x:0.000000 y:44.000000 w:1800.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000019958f0> {pid=38488}\",\n  \"AXPosition\" : \"<AXValue 0x60000194f390> {value = x:0.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001988a20> {pid=38488}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x60000198a4c0> {pid=38488}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x60000198a4c0> {value = w:1800.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Untitled-1\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : null,\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x600001938de0> {pid=38488}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Code\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14272, title=\\\"Untitled-1\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.microsoft.VSCode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Visual%20Studio%20Code.app/Contents/MacOS/Electron\",\n  \"Aero.App.version\" : \"1.99.3\",\n  \"Aero.App.versionShort\" : \"1.99.3\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14272,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.TilingContainer\",\n  \"Aero.workspace\" : \"V\"\n}\n"
  },
  {
    "path": "axDumps/vs_code_nativeFullScreen_false.json5",
    "content": "// \"window.nativeFullScreen\": false\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000018bc240> {value = x:349.000000 y:193.000000 type = kAXValueCGPointType}\",\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000003331c0> {value = x:279.000000 y:179.000000 w:1431.000000 h:926.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000018bcae0> {pid=91750}\",\n  \"AXPosition\" : \"<AXValue 0x6000018bc780> {value = x:279.000000 y:179.000000 type = kAXValueCGPointType}\",\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000018b0720> {pid=91750}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x6000018b20d0> {pid=91750}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001824ea0> {value = w:1431.000000 h:926.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Settings\",\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x6000018bc120> {pid=91750}\",\n    \"AXRole\" : \"AXApplication\",\n    \"AXTitle\" : \"Code\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=1736, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"AXFunctionRowTopLevelElements, AXFrame, AXFocusedUIElement, AXExtrasMenuBar, AXSize, AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXManualAccessibility, AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.microsoft.VSCode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Visual%20Studio%20Code.app/Contents/MacOS/Electron\",\n  \"Aero.App.pid\" : 91750,\n  \"Aero.App.version\" : \"1.103.2\",\n  \"Aero.App.versionShort\" : \"1.103.2\",\n  \"Aero.AxFailed\" : \"AXFrame, AXGrowArea, AXActivationPoint, AXFullScreenButton, AXProxy, AXDefaultButton, AXTitleUIElement, AXCancelButton, AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 1736,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/vs_codium.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600000958a80> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000012ebcc0> {value = x:900.000000 y:44.000000 w:900.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x60000095c4e0> {pid=93641}\",\n  \"AXPosition\" : \"<AXValue 0x6000009942d0> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x6000009451a0> {pid=93641}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600000945f20> {pid=93641}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x60000095c4e0> {value = w:900.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Settings\",\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x60000095c4e0> {pid=93641}\",\n    \"AXRole\" : \"AXApplication\",\n    \"AXTitle\" : \"VSCodium\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=1754, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"AXFunctionRowTopLevelElements, AXFrame, AXFocusedUIElement, AXExtrasMenuBar, AXSize, AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXManualAccessibility, AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.vscodium\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/VSCodium.app/Contents/MacOS/Electron\",\n  \"Aero.App.pid\" : 93641,\n  \"Aero.App.version\" : \"1.103.25610\",\n  \"Aero.App.versionShort\" : \"1.103.25610\",\n  \"Aero.AxFailed\" : \"AXFrame, AXGrowArea, AXActivationPoint, AXProxy, AXDefaultButton, AXTitleUIElement, AXCancelButton, AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 1754,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/vs_codium_nativeFullScreen_false.json5",
    "content": "// \"window.nativeFullScreen\": false\n{\n  \"AXActivationPoint\" : \"<AXValue 0x6000009ac3f0> {value = x:970.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDocument\" : \"\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000012a1f40> {value = x:900.000000 y:44.000000 w:900.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x6000009a1860> {pid=94105}\",\n  \"AXPosition\" : \"<AXValue 0x6000009a15f0> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600000944a80> {pid=94105}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600000945c20> {pid=94105}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600000948150> {value = w:900.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Settings\",\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXManualAccessibility\" : 0,\n    \"AXMenuBar\" : \"<AXUIElement 0x600000948ae0> {pid=94105}\",\n    \"AXRole\" : \"AXApplication\",\n    \"AXTitle\" : \"VSCodium\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=1763, title=\\\"Settings\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"AXFunctionRowTopLevelElements, AXFrame, AXFocusedUIElement, AXExtrasMenuBar, AXSize, AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXManualAccessibility, AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.vscodium\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/VSCodium.app/Contents/MacOS/Electron\",\n  \"Aero.App.pid\" : 94105,\n  \"Aero.App.version\" : \"1.103.25610\",\n  \"Aero.App.versionShort\" : \"1.103.25610\",\n  \"Aero.AxFailed\" : \"AXFrame, AXGrowArea, AXActivationPoint, AXFullScreenButton, AXProxy, AXDefaultButton, AXTitleUIElement, AXCancelButton, AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 1763,\n  \"Aero.macOS.version\" : \"Version 15.6.1 (Build 24G90)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/xcode.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x9788d70f0> {value = x:10.000000 y:56.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : \"file:///Users/bobko/a/AeroSpace/Sources/AppBundle/tree/MacWindow.swift\",\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x97812a540> {value = x:0.000000 y:40.000000 w:1800.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"Xcode.WorkspaceWindow\",\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x978099890> {pid=94775}\",\n  \"AXPosition\" : \"<AXValue 0x9780366d0> {value = x:0.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x978098d80> {pid=94775}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x978099a70> {pid=94775}\\\";\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x978099a10> {pid=94775}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x978099890> {pid=94775}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x9780366d0> {value = w:1800.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"AeroSpace — MacWindow.swift\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=4784, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x97809dd10> {pid=94775}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Xcode\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=4784, title=\\\"AeroSpace — MacWindow.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.dt.Xcode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Xcode.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Xcode.app/Contents/MacOS/Xcode\",\n  \"Aero.App.pid\" : 94775,\n  \"Aero.App.version\" : \"24454\",\n  \"Aero.App.versionShort\" : \"26.1\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 4784,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"X\"\n}\n"
  },
  {
    "path": "axDumps/xcode_build_succeeded_popup.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600001933a20> {value = x:-1.000000 y:1170.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x6000002b1200> {value = x:800.000000 y:829.000000 w:200.000000 h:200.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600001939110> {pid=27529}\",\n  \"AXPosition\" : \"<AXValue 0x600001933a20> {value = x:800.000000 y:829.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001931950> {pid=27529}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001939110> {value = w:200.000000 h:200.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXSystemDialog\",\n  \"AXTitle\" : \"Build Succeeded\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=14010, title=nil, role=\\\"AXTextArea\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=14010, title=\\\"AeroSpace — AxWindowKindTest.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=14010, title=\\\"AeroSpace — AxWindowKindTest.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001938f90> {pid=27529}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Xcode\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=14483, title=\\\"Build Succeeded\\\", role=\\\"AXWindow\\\", subrole=\\\"AXSystemDialog\\\")\",\n      \"AXUIElement(AxWindowId=14010, title=\\\"AeroSpace — AxWindowKindTest.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.dt.Xcode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Xcode.app/Contents/MacOS/Xcode\",\n  \"Aero.App.version\" : \"23785\",\n  \"Aero.App.versionShort\" : \"16.3\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 14483,\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"AppBundle.MacosPopupWindowsContainer\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/xcode_installing_system_components.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600001c16250> {value = x:-1141.000000 y:781.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x60000061de80> {value = x:-1151.000000 y:767.000000 w:280.000000 h:171.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 1,\n  \"AXParent\" : \"<AXUIElement Application 0x600001c09dd0> {pid=34828}\",\n  \"AXPosition\" : \"<AXValue 0x600001c09dd0> {value = x:-1151.000000 y:767.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001c17090> {pid=34828}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001c09dd0> {value = w:280.000000 h:171.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"Xcode\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=372, title=\\\"Xcode\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=372, title=\\\"Xcode\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=372, title=\\\"Xcode\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001dedc50> {pid=34828}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Xcode\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=372, title=\\\"Xcode\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.dt.Xcode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Xcode.app/Contents/MacOS/Xcode\",\n  \"Aero.App.version\" : \"23792\",\n  \"Aero.App.versionShort\" : \"16.4\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.axWindowId\" : 372,\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.workspace\" : \"D\"\n}\n\n"
  },
  {
    "path": "axDumps/xcode_open_quickly.json5",
    "content": "// cmd-shift-o\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600002fc2a00> {value = x:910.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x60000343c340> {value = x:900.000000 y:44.000000 w:454.000000 h:47.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"open_quickly\",\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002fc2a00> {pid=76223}\",\n  \"AXPosition\" : \"<AXValue 0x600002fbb270> {value = x:900.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002fbb900> {pid=76223}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = Search;\\n    SectionObject = \\\"<AXUIElement 0x600002fbbab0> {pid=76223}\\\";\\n    SectionUniqueID = AXSearch;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002fb96b0> {value = w:454.000000 h:47.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=28188, title=nil, role=\\\"AXTextField\\\", subrole=\\\"AXSearchField\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=28187, title=\\\"AeroSpace — AeroSpace.xcodeproj\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002fb91d0> {pid=76223}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Xcode\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=28188, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=28187, title=\\\"AeroSpace — AeroSpace.xcodeproj\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.dt.Xcode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Xcode.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Xcode.app/Contents/MacOS/Xcode\",\n  \"Aero.App.pid\" : 76223,\n  \"Aero.App.version\" : \"24455\",\n  \"Aero.App.versionShort\" : \"26.1.1\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXSize\",\n  \"Aero.axWindowId\" : 28188,\n  \"Aero.macOS.version\" : \"Version 15.7.1 (Build 24G231)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"X\"\n}\n"
  },
  {
    "path": "axDumps/xcode_quick_actions.json5",
    "content": "// cmd-shift-a\n{\n  \"AXActivationPoint\" : \"<AXValue 0x600002ee8b70> {value = x:630.000000 y:328.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x60000342a480> {value = x:620.000000 y:314.000000 w:560.000000 h:47.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"open_quickly\",\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002fb7ba0> {pid=76223}\",\n  \"AXPosition\" : \"<AXValue 0x600002eeba20> {value = x:620.000000 y:314.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002fee2e0> {pid=76223}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = Search;\\n    SectionObject = \\\"<AXUIElement 0x600002fed500> {pid=76223}\\\";\\n    SectionUniqueID = AXSearch;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002eeab80> {value = w:560.000000 h:47.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=28220, title=nil, role=\\\"AXTextField\\\", subrole=\\\"AXSearchField\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=28187, title=\\\"AeroSpace — AeroSpace.xcodeproj\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002eeb420> {pid=76223}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Xcode\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=28220, title=\\\"\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=28187, title=\\\"AeroSpace — AeroSpace.xcodeproj\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.dt.Xcode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Xcode.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Xcode.app/Contents/MacOS/Xcode\",\n  \"Aero.App.pid\" : 76223,\n  \"Aero.App.version\" : \"24455\",\n  \"Aero.App.versionShort\" : \"26.1.1\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXSize\",\n  \"Aero.axWindowId\" : 28220,\n  \"Aero.macOS.version\" : \"Version 15.7.1 (Build 24G231)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"X\"\n}\n"
  },
  {
    "path": "axDumps/xcode_settings.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600002fefe40> {value = x:348.000000 y:213.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x600003432600> {value = x:338.000000 y:199.000000 w:959.000000 h:516.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600002fefed0> {pid=76223}\",\n  \"AXPosition\" : \"<AXValue 0x600002fd2580> {value = x:338.000000 y:199.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600002f30e40> {pid=76223}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionDescription = Toolbar;\\n    SectionObject = \\\"<AXUIElement 0x600002f32f70> {pid=76223}\\\";\\n    SectionUniqueID = AXToolbar;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600002f31650> {pid=76223}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600002f32cd0> {pid=76223}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600002f331b0> {pid=76223}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600002f30420> {pid=76223}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0x600002f33000> {pid=76223}\\\";\\n    SectionUniqueID = AXContainer;\\n}\",\n    \"{\\n    SectionDescription = \\\"Content Navigator\\\";\\n    SectionObject = \\\"<AXUIElement 0x600002f31e90> {pid=76223}\\\";\\n    SectionUniqueID = AXContentNavigator;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600002f303c0> {value = w:959.000000 h:516.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXDialog\",\n  \"AXTitle\" : \"General\",\n  \"AXTitleUIElement\" : \"AXUIElement(AxWindowId=28237, title=nil, role=\\\"AXStaticText\\\", subrole=nil)\",\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXZoomButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=28237, title=nil, role=\\\"AXOutline\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=28187, title=\\\"AeroSpace — AeroSpace.xcodeproj\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600002fefe70> {pid=76223}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Xcode\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=28237, title=\\\"General\\\", role=\\\"AXWindow\\\", subrole=\\\"AXDialog\\\")\",\n      \"AXUIElement(AxWindowId=28187, title=\\\"AeroSpace — AeroSpace.xcodeproj\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.dt.Xcode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Xcode.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Xcode.app/Contents/MacOS/Xcode\",\n  \"Aero.App.pid\" : 76223,\n  \"Aero.App.version\" : \"24455\",\n  \"Aero.App.versionShort\" : \"26.1.1\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"dialog\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 28237,\n  \"Aero.macOS.version\" : \"Version 15.7.1 (Build 24G231)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.Workspace)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"X\"\n}\n"
  },
  {
    "path": "axDumps/xcode_welcome_window.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0xb88c24000> {value = x:541.000000 y:657.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0xb895b0b00> {value = x:530.000000 y:208.000000 w:740.000000 h:460.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXIdentifier\" : \"Welcome\",\n  \"AXMain\" : 0,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0xb89018090> {pid=7108}\",\n  \"AXPosition\" : \"<AXValue 0xb88c24000> {value = x:530.000000 y:208.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0xb89018090> {pid=7108}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0xb88c24000> {value = w:740.000000 h:460.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXUnknown\",\n  \"AXTitle\" : \"Welcome to Xcode\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=794, title=nil, role=\\\"AXOutline\\\", subrole=nil)\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=794, title=\\\"Welcome to Xcode\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : null,\n    \"AXMenuBar\" : \"<AXUIElement 0xb89018090> {pid=7108}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Xcode\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=794, title=\\\"Welcome to Xcode\\\", role=\\\"AXWindow\\\", subrole=\\\"AXUnknown\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXMainWindow, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"com.apple.dt.Xcode\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Xcode.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Xcode.app/Contents/MacOS/Xcode\",\n  \"Aero.App.pid\" : 7108,\n  \"Aero.App.version\" : \"24553\",\n  \"Aero.App.versionShort\" : \"26.2\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXMinimizeButton, get.AXDocument, get.AXCloseButton, isWritable.AXActivationPoint, get.AXFullScreenButton, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXZoomButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\", // todo fix\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXPosition, AXSections\",\n  \"Aero.axWindowId\" : 794,\n  \"Aero.macOS.version\" : \"Version 26.2 (Build 25C56)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "axDumps/zebar.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x7a6602550> {value = x:-1.000000 y:1441.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : null,\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0x7a6e20580> {value = x:1151.000000 y:40.000000 w:3600.000000 h:80.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : null,\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : null,\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x7a6602550> {pid=5114}\",\n  \"AXPosition\" : \"<AXValue 0x7a6602550> {value = x:1151.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x7a6602550> {pid=5114}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x7a6602550> {value = w:3600.000000 h:80.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Zebar - glzr-io.starter / vanilla\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : null,\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : \"<AXUIElement 0x7a6601b30> {pid=5114}\",\n    \"AXFocusedUIElement\" : \"<AXUIElement 0x7a6601b30> {pid=5122}\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=10742, title=\\\"Zebar - glzr-io.starter / vanilla\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=10742, title=\\\"Zebar - glzr-io.starter / vanilla\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x7a6602550> {pid=5114}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Zebar\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=10742, title=\\\"Zebar - glzr-io.starter / vanilla\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=10743, title=\\\"Zebar - glzr-io.starter / vanilla\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"com.glzr.zebar\",\n  \"Aero.App.nsApp.activationPolicy\" : \"accessory\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Zebar.app/Contents/MacOS/zebar\",\n  \"Aero.App.version\" : \"20250618.170017\",\n  \"Aero.App.versionShort\" : \"3.1.1\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.axWindowId\" : 10742,\n  \"Aero.macOS.version\" : \"Version 26.0 (Build 25A354)\",\n  \"Aero.on-window-detected\" : [\n    {\n      \"commands\" : \"layout tiling\",\n      \"matcher\" : \"\"\n    }\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/zed.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0x600001d465b0> {value = x:100.000000 y:58.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0x60000061b780> {value = x:30.000000 y:44.000000 w:1770.000000 h:1124.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0x600001d4b540> {pid=87284}\",\n  \"AXPosition\" : \"<AXValue 0x600001d465b0> {value = x:30.000000 y:44.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0x600001d4be70> {pid=87284}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0x600001d45560> {value = w:1770.000000 h:1124.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"AeroSpace — accessibility.swift\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0x600001d12b20> {pid=87284}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Zed\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=11823, title=\\\"AeroSpace — accessibility.swift\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\"\n  },\n  \"Aero.App.appBundleId\" : \"dev.zed.Zed\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Zed.app/Contents/MacOS/zed\",\n  \"Aero.App.version\" : \"20250718.173548\",\n  \"Aero.App.versionShort\" : \"0.195.5\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.axWindowId\" : 11823,\n  \"Aero.macOS.version\" : \"Version 15.5 (Build 24F74)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"E\"\n}\n"
  },
  {
    "path": "axDumps/zen_browser.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0xc45c81800> {value = x:40.000000 y:56.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 1,\n  \"AXFrame\" : \"<AXValue 0xc4411d140> {value = x:30.000000 y:40.000000 w:1770.000000 h:1128.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0xc45557300> {pid=23963}\",\n  \"AXPosition\" : \"<AXValue 0xc45013fc0> {value = x:30.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0xc45557300> {pid=23963}\\\";\\n    SectionUniqueID = AXContent;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0xc45c81800> {value = w:1770.000000 h:1128.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Zen Browser\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=2621, title=\\\"\\\", role=\\\"AXGroup\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0xc45726b20> {pid=23963}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Zen\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2621, title=\\\"Zen Browser\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"app.zen-browser.zen\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Zen.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Zen.app/Contents/MacOS/zen\",\n  \"Aero.App.pid\" : 23963,\n  \"Aero.App.version\" : \"125.11.9\",\n  \"Aero.App.versionShort\" : \"1.17.6b\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"window\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : false,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXMinimized, AXSize\",\n  \"Aero.axWindowId\" : 2621,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.TilingContainer)\",\n  \"Aero.windowLevel\" : \"normalWindow\",\n  \"Aero.workspace\" : \"1\"\n}\n"
  },
  {
    "path": "axDumps/zen_browser_pip.json5",
    "content": "{\n  \"AXActivationPoint\" : \"<AXValue 0xc424e2b80> {value = x:40.000000 y:56.000000 type = kAXValueCGPointType}\",\n  \"AXCancelButton\" : null,\n  \"AXCloseButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXCloseButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription, AXEdited\"\n  },\n  \"AXDefaultButton\" : null,\n  \"AXDocument\" : null,\n  \"AXFocused\" : 0,\n  \"AXFrame\" : \"<AXValue 0xc43140380> {value = x:30.000000 y:40.000000 w:1769.000000 h:995.000000 type = kAXValueCGRectType}\",\n  \"AXFullScreen\" : 0,\n  \"AXFullScreenButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXGrowArea\" : null,\n  \"AXMain\" : 1,\n  \"AXMinimizeButton\" : {\n    \"AXEnabled\" : 0,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXMinimizeButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"AXMinimized\" : 0,\n  \"AXModal\" : 0,\n  \"AXParent\" : \"<AXUIElement Application 0xc43c30ae0> {pid=23963}\",\n  \"AXPosition\" : \"<AXValue 0xc42d5c8a0> {value = x:30.000000 y:40.000000 type = kAXValueCGPointType}\",\n  \"AXProxy\" : null,\n  \"AXRole\" : \"AXWindow\",\n  \"AXSections\" : [\n    \"{\\n    SectionDescription = Content;\\n    SectionObject = \\\"<AXUIElement 0xc43c33780> {pid=23963}\\\";\\n    SectionUniqueID = AXContent;\\n}\",\n    \"{\\n    SectionObject = \\\"<AXUIElement 0xc43c30ae0> {pid=23963}\\\";\\n    SectionUniqueID = AXContainer;\\n}\"\n  ],\n  \"AXSize\" : \"<AXValue 0xc424e2a00> {value = w:1769.000000 h:995.000000 type = kAXValueCGSizeType}\",\n  \"AXSubrole\" : \"AXStandardWindow\",\n  \"AXTitle\" : \"Picture-in-Picture\",\n  \"AXTitleUIElement\" : null,\n  \"AXToolbarButton\" : null,\n  \"AXZoomButton\" : {\n    \"AXEnabled\" : 1,\n    \"AXParent\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXRole\" : \"AXButton\",\n    \"AXSubrole\" : \"AXFullScreenButton\",\n    \"AXTitle\" : null,\n    \"AXTopLevelUIElement\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXWindow\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"Aero.AxFailed\" : \"get.AXTitle\",\n    \"Aero.AxIgnored\" : \"AXFrame, AXSize, AXFocused, AXChildren, AXHelp, AXPosition, AXRoleDescription\"\n  },\n  \"Aero.AXApp\" : {\n    \"AXExtrasMenuBar\" : null,\n    \"AXFocusedUIElement\" : \"AXUIElement(AxWindowId=2651, title=\\\"\\\", role=\\\"AXGroup\\\", subrole=\\\"AXUnknown\\\")\",\n    \"AXFocusedWindow\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXFrame\" : null,\n    \"AXFrontmost\" : 1,\n    \"AXFunctionRowTopLevelElements\" : [\n\n    ],\n    \"AXMainWindow\" : \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n    \"AXMenuBar\" : \"<AXUIElement 0xc43c33780> {pid=23963}\",\n    \"AXPosition\" : null,\n    \"AXRole\" : \"AXApplication\",\n    \"AXSize\" : null,\n    \"AXTitle\" : \"Zen\",\n    \"AXWindows\" : [\n      \"AXUIElement(AxWindowId=2651, title=\\\"Picture-in-Picture\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\",\n      \"AXUIElement(AxWindowId=2621, title=\\\"Danila Poperechny: \\\"AGENT 813\\\" | stand-up, 2025 - YouTube\\\", role=\\\"AXWindow\\\", subrole=\\\"AXStandardWindow\\\")\"\n    ],\n    \"Aero.AxFailed\" : \"isWritable.AXFunctionRowTopLevelElements, get.AXFrame, isWritable.AXFrame, get.AXExtrasMenuBar, isWritable.AXExtrasMenuBar, get.AXSize, isWritable.AXSize, get.AXPosition, isWritable.AXPosition\",\n    \"Aero.AxIgnored\" : \"AXChildren, AXChildrenInNavigationOrder, AXEnhancedUserInterface, AXPreferredLanguage, AXRoleDescription, AXHidden\",\n    \"Aero.AxWritable\" : \"AXFrontmost\"\n  },\n  \"Aero.App.appBundleId\" : \"app.zen-browser.zen\",\n  \"Aero.App.nsApp.activationPolicy\" : \"regular\",\n  \"Aero.App.nsApp.appBundlePath\" : \"file:///Applications/Zen.app/\",\n  \"Aero.App.nsApp.execPath\" : \"file:///Applications/Zen.app/Contents/MacOS/zen\",\n  \"Aero.App.pid\" : 23963,\n  \"Aero.App.version\" : \"125.11.9\",\n  \"Aero.App.versionShort\" : \"1.17.6b\",\n  \"Aero.AxFailed\" : \"isWritable.AXFrame, get.AXGrowArea, get.AXDocument, isWritable.AXActivationPoint, get.AXProxy, get.AXDefaultButton, get.AXTitleUIElement, get.AXCancelButton, get.AXToolbarButton\",\n  \"Aero.AxIgnored\" : \"AXChildrenInNavigationOrder, AXChildren, AXRoleDescription\",\n  \"Aero.AxUiElementWindowType\" : \"popup\",\n  \"Aero.AxUiElementWindowType_isDialogHeuristic\" : true,\n  \"Aero.AxWritable\" : \"AXFullScreen, AXPosition, AXSections, AXMain, AXSize\",\n  \"Aero.axWindowId\" : 2651,\n  \"Aero.macOS.version\" : \"Version 26.1 (Build 25B78)\",\n  \"Aero.on-window-detected\" : [\n\n  ],\n  \"Aero.treeNodeParent\" : \"Optional(AppBundle.MacosPopupWindowsContainer)\",\n  \"Aero.windowLevel\" : \"alwaysOnTopWindow\",\n  \"Aero.workspace\" : null\n}\n"
  },
  {
    "path": "build-debug.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\n# 1. It takes 300ms for cmd-help to generate. It's too long to run in build-debug.sh, that's why we ignore it\n# 2. Grammar is not expected to change very often, that's why it's not regenerated by default\n./generate.sh --ignore-xcodeproj --ignore-cmd-help --ignore-shell-parser\nswift build \"$@\"\nswift build --target AppBundleTests \"$@\" # swift build doesn't build test targets by default :(\n\nrm -rf .debug && mkdir .debug\ncp -r .build/debug/aerospace .debug\ncp -r .build/debug/AeroSpaceApp .debug\n"
  },
  {
    "path": "build-docs.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\n./script/install-dep.sh --bundler\n\nrm -rf .site && mkdir .site\nrm -rf .man && mkdir .man\n\ncp-docs() {\n    cp -r ./docs/*.adoc \"$1\"\n    cp -r ./docs/assets \"$1\"\n    cp -r ./docs/util \"$1\"\n    cp -r ./docs/config-examples \"$1\"\n}\n\nbuild-site() {\n    cp-docs ./.site\n    cp ./docs/index.html ./.site\n\n    cd .site\n        # Delete \"aerospace \" prefifx in synopsis\n        sed -E -i '' '/tag::synopsis/, /end::synopsis/ s/^(aerospace | {10})//' aerospace*\n        bundler exec asciidoctor ./guide.adoc ./commands.adoc ./goodies.adoc\n        cp goodies.html goodness.html # backwards compatibility\n        rm -rf ./*.adoc\n    cd - > /dev/null\n\n    git rev-parse HEAD > .site/version.html\n    if ! test -z \"$(git status --porcelain)\"; then\n        echo \"git working directory is dirty\" >> .site/version.html\n    fi\n}\n\nbuild-man() {\n    cp-docs .man\n    cd .man\n        bundler exec asciidoctor -b manpage aerospace*.adoc\n        rm -rf -- *.adoc\n    cd - > /dev/null\n}\n\nbuild-site\nbuild-man\n"
  },
  {
    "path": "build-release.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\nbuild_version=\"0.0.0-SNAPSHOT\"\ncodesign_identity=\"aerospace-codesign-certificate\"\nwhile test $# -gt 0; do\n    case $1 in\n        --build-version) build_version=\"$2\"; shift 2;;\n        --codesign-identity) codesign_identity=\"$2\"; shift 2;;\n        *) echo \"Unknown option $1\" > /dev/stderr; exit 1 ;;\n    esac\ndone\n\n#############\n### BUILD ###\n#############\n\n./build-docs.sh\n./build-shell-completion.sh\n\n./generate.sh\n./script/check-uncommitted-files.sh\n./generate.sh --build-version \"$build_version\" --codesign-identity \"$codesign_identity\" --generate-git-hash\n\nswift build -c release --arch arm64 --arch x86_64 --product aerospace -Xswiftc -warnings-as-errors # CLI\n\n# todo: make xcodebuild use the same toolchain as swift\n# toolchain=\"$(plutil -extract CFBundleIdentifier raw ~/Library/Developer/Toolchains/swift-6.1-RELEASE.xctoolchain/Info.plist)\"\n# xcodebuild -toolchain \"$toolchain\" \\\n# Unfortunately, Xcode 16 fails with:\n#     2025-05-05 15:51:15.618 xcodebuild[4633:13690815] Writing error result bundle to /var/folders/s1/17k6s3xd7nb5mv42nx0sd0800000gn/T/ResultBundle_2025-05-05_15-51-0015.xcresult\n#     xcodebuild: error: Could not resolve package dependencies:\n#       <unknown>:0: warning: legacy driver is now deprecated; consider avoiding specifying '-disallow-use-new-driver'\n#     <unknown>:0: error: unable to execute command: <unknown>\n\nrm -rf .release && mkdir .release\n\nxcode_configuration=\"Release\"\nxcodebuild -version\nxcodebuild-pretty .release/xcodebuild.log clean build \\\n    -scheme AeroSpace \\\n    -destination \"generic/platform=macOS\" \\\n    -configuration \"$xcode_configuration\" \\\n    -derivedDataPath .xcode-build\n\ngit checkout .\n\ncp -r \".xcode-build/Build/Products/$xcode_configuration/AeroSpace.app\" .release\ncp -r .build/apple/Products/Release/aerospace .release\n\n################\n### SIGN CLI ###\n################\n\ncodesign -s \"$codesign_identity\" .release/aerospace\n\n################\n### VALIDATE ###\n################\n\nexpected_layout=$(cat <<EOF\n.release/AeroSpace.app\n.release/AeroSpace.app/Contents\n.release/AeroSpace.app/Contents/_CodeSignature\n.release/AeroSpace.app/Contents/_CodeSignature/CodeResources\n.release/AeroSpace.app/Contents/MacOS\n.release/AeroSpace.app/Contents/MacOS/AeroSpace\n.release/AeroSpace.app/Contents/Resources\n.release/AeroSpace.app/Contents/Resources/default-config.toml\n.release/AeroSpace.app/Contents/Resources/AppIcon.icns\n.release/AeroSpace.app/Contents/Resources/Assets.car\n.release/AeroSpace.app/Contents/Info.plist\n.release/AeroSpace.app/Contents/PkgInfo\nEOF\n)\n\nif test \"$expected_layout\" != \"$(find .release/AeroSpace.app)\"; then\n    echo \"!!! Expect/Actual layout don't match !!!\"\n    find .release/AeroSpace.app\n    exit 1\nfi\n\ncheck-universal-binary() {\n    if ! file \"$1\" | grep --fixed-string -q \"Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64\"; then\n        echo \"$1 is not a universal binary\"\n        exit 1\n    fi\n}\n\ncheck-contains-hash() {\n    hash=$(git rev-parse HEAD)\n    if ! strings \"$1\" | grep --fixed-string \"$hash\" > /dev/null; then\n        echo \"$1 doesn't contain $hash\"\n        exit 1\n    fi\n}\n\ncheck-universal-binary .release/AeroSpace.app/Contents/MacOS/AeroSpace\ncheck-universal-binary .release/aerospace\n\ncheck-contains-hash .release/AeroSpace.app/Contents/MacOS/AeroSpace\ncheck-contains-hash .release/aerospace\n\ncodesign -v .release/AeroSpace.app\ncodesign -v .release/aerospace\n\n############\n### PACK ###\n############\n\nmkdir -p \".release/AeroSpace-v$build_version/manpage\" && cp .man/*.1 \".release/AeroSpace-v$build_version/manpage\"\ncp -r ./legal \".release/AeroSpace-v$build_version/legal\"\ncp -r .shell-completion \".release/AeroSpace-v$build_version/shell-completion\"\ncd .release\n    mkdir -p \"AeroSpace-v$build_version/bin\" && cp -r aerospace \"AeroSpace-v$build_version/bin\"\n    cp -r AeroSpace.app \"AeroSpace-v$build_version\"\n    zip -r \"AeroSpace-v$build_version.zip\" \"AeroSpace-v$build_version\"\ncd -\n\n#################\n### Brew Cask ###\n#################\nfor cask_name in aerospace aerospace-dev; do\n    ./script/build-brew-cask.sh \\\n        --cask-name \"$cask_name\" \\\n        --zip-uri \".release/AeroSpace-v$build_version.zip\" \\\n        --build-version \"$build_version\"\ndone\n"
  },
  {
    "path": "build-shell-completion.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\n./script/install-dep.sh --complgen\n\nrm -rf .shell-completion && mkdir -p \\\n    .shell-completion/zsh \\\n    .shell-completion/fish \\\n    .shell-completion/bash\n\n./.deps/cargo-root/bin/complgen aot ./grammar/commands-bnf-grammar.txt \\\n    --zsh-script .shell-completion/zsh/_aerospace \\\n    --fish-script .shell-completion/fish/aerospace.fish \\\n    --bash-script .shell-completion/bash/aerospace\n\nif ! (not-outdated-bash --version | grep -q 'version 5'); then\n    echo \"bash version is too old. At least version 5 is required\" > /dev/stderr\n    exit 1\nfi\n\n# Check basic syntax\nzsh -c 'autoload -Uz compinit; compinit; source ./.shell-completion/zsh/_aerospace'\nfish -c 'source ./.shell-completion/fish/aerospace.fish'\nnot-outdated-bash -c 'source ./.shell-completion/bash/aerospace'\n"
  },
  {
    "path": "dev-docs/architecture.md",
    "content": "# Architecture\n\n## Definitions\n\n**SPM.** Swift package manager and Swift build tool. In other words, `swift` CLI tool\n\n## High level project infrastructure overview\n\n- `../Sources`.\n  The majority of AeroSpace source code. Managed by SPM `../Package.swift`\n- `../Sources/AppBundle/`.\n  AeroSpace.app server. Technically, it's a SPM library that is exposed to `xcode-app-bundle-launcher`\n- `../Sources/Cli/`.\n  CLI client. CLI client is built purely using SPM, no Xcode involved (phew!)\n- `../Sources/Common/`.\n  Shared code between server and client. Mainly command line args parsing and util functions are shared.\n- `../xcode-app-bundle-launcher/`.\n  Very small technical directory that defines entry point for Xcode project.\n  Xcode projects are ugly and hard to manage without using the Xcode itself.\n  And Swift LSP doesn't support Xcode projects, it only support SPM projects.\n  Unfortunately, SPM doesn't allow building macOS apps (aka \"App Bundle\").\n  SPM is only capable of defining libraries and building CLI apps.\n  All code is pushed as much as possible to SPM \"library\" located in `../Sources/`.\n  The Xcode project model is located in `../AeroSpace.xcodeproj/` and generated by `../project.yml` \"skeleton\"\n- `../Sources/AppBundleTests/`.\n  Tests\n- `../docs/`.\n  Documentation sources for site and man pages in Asciidoc format https://asciidoc.org/\n\n## client/server interaction\n\n`aerospace` CLI binary is client. `AeroSpace.app` is server. Client and server talk to each other via predefined UNIX file.\n\nEach time you run a CLI command:\n1. Args are parsed by the client, args parsing errors are reported if any. Help is shown if `-h`/`--help` is passed.\n1. If args are parsed successfully, the args are sent to the server\n1. Server parses the args once again, and runs the command\n1. Server returns stdout, stderr, and exit code to the client\n1. Client shows stdout, stderr, and ends the process with the requested exit code\n\n## Commands subsystem\n\ntodo\n\n../Sources/AppBundle/command/\n../Sources/Common/cmdArgs/\n\nCommand checklist:\n- [ ] Documentation in `../docs/aerospace-*` and `../docs/commands.adoc`\n  - [ ] Check that site looks alright `./.site/commands.html`\n  - [ ] Check that man page looks alright `./.man`\n- [ ] Do `--window-id` and/or `--workspace` flags make sense for the command?\n- [ ] Shell completion `../grammar/commands-bnf-grammar.txt`\n\n## TOML Config parse subsystem\n\ntodo\n\n../Sources/AppBundle/config/\n\n## Tree Model subsystem\n\ntodo\n\n../Sources/AppBundle/tree/\n\n## Layout subsystem\n\ntodo\n\n../Sources/AppBundle/layout/\n"
  },
  {
    "path": "dev-docs/development.md",
    "content": "# Development Notes\n\nTo build/install from sources do the following:\n1. Install dependencies\n2. Create codesign certificate in `Keychain Access.app`\n3. Run one of the entry point scripts to build/install from sources\n\nIf you struggle to build AeroSpace locally, you can also refer to [builds in GitHub Actions](https://github.com/nikitabobko/AeroSpace/actions?query=branch%3Amain)\n\n## Definitions\n\n**SPM.** Swift package manager and Swift build tool. In other words, `swift` CLI tool\n\n## 1. Install dependencies\n\n1.  Install Xcode from App Store https://apps.apple.com/us/app/xcode/id497799835\n2.  Install [swiftly](https://github.com/swiftlang/swiftly).\n    Swiftly is a Swift toolchain manager that will make sure that you use the same swift version as written in `.swift-version` file.\n    `brew install swiftly`\n3.  If you want to build shell completion, install rust, bash and fish\n    -   Install Rust using rustup. https://www.rust-lang.org/tools/install\n    -   `brew install bash fish`\n4.  If you want to build man pages, install Ruby >= 3.0. I recommend using [rbenv](https://github.com/rbenv/rbenv).\n    -   `rbenv install 3.3.4` (or whatever 3.x version)\n    -   Install asciidoctor using Ruby `bundler`. `cd AeroSpace && bundler install`\n5.  Install optional `xcbeautify` to make Xcode build logs readable. `brew install xcbeautify`\n\n## 2. Create codesign certificate\n\nIf you want to run AeroSpace as App Bundle (AeroSpace.app) you need to create self-signed certificate that will be used to codesign AeroSpace.\nRelease artifact is built as App Bundle.\nIf you only plan to build the debug version of AeroSpace, you can run it from the terminal and custom certificate is not required.\n\n1.  Open `Keychain Access.app`\n2.  Menu -> `Keychain Access` -> `Certificate Assistance` -> `Create a Certificate...`\n    -   Name: `aerospace-codesign-certificate`\n    -   Identity Type: `Self-Signed Root`\n    -   Certificate Type: `Code Signing`\n\n## 3. Entry point scripts\n\n**Debug build**\n-   `build-debug.sh` - Build debug build to `.debug` dir by using SPM. (Xcode is not involved)\n-   `run-tests.sh` - Run tests.\n-   `swiftformat.sh` - Format the code.\n-   `run-debug.sh` - Run AeroSpace.app debug build.\n-   `run-cli.sh` - Run `aerospace` in CLI. Arguments are forwarded to `aerospace` binary.\n-   `build-docs.sh` - Build the site and man pages to `.site` and `.man` dirs respectively.\n-   `build-shell-completion.sh` - Build shell completion to `.shell-completion`.\n    You can test that the completion works properly by sourcing the file `source ./.shell-completion/zsh/_aerospace`\n-   `generate.sh` - Regenerate generated project files. `AeroSpace.xcodeproj` is generated, and some of the source files\n    (the source files have `Generated` suffix in their names).\n\n**Release build**\n-   `build-release.sh` - Build release build to `.release` dir by using Xcode.\n-   `install-from-sources.sh` - Build release build from sources and install it as `aerospace-dev` brew cask.\n    This script is \"work in progress\".\n    Use it on your own risk.\n\n## IDE\n\n-   You can obviously [open the project in Xcode](#xcode).\n-   You can use your editor of choice (Neovim, Vim, Emacs, Sublime, VS Code) by using [sourcekit-lsp LSP](https://github.com/apple/sourcekit-lsp).\n    I only tested it in Neovim\n-   AppCode. The initial codebase was written in AppCode and the IDE was pretty solid.\n    But AppCode was unfortunately sunsetted, and it started falling apart.\n    Last time I checked it, it didn't support Swift 5.9 features, and I couldn't make it reliably import the project.\n    RIP\n\n## Xcode\n\nEven if you use LSP and another text editor, Xcode is still useful to attach debugger (though you can use `lldb` in CLI).\n\n1.  To open the project in Xcode: File -> Open -> Choose `Package.swift` file instead of `AeroSpace.xcodeproj`.\n    It's better to open `Package.swift`, because SPM project is more lightweight.\n    `AeroSpace.xcodeproj` is only used in `*release*.sh` build scripts.\n2.  After you opened the project in Xcode.\n    Edit Scheme... -> Options -> Console -> Choose `Terminal`.\n    This way Accessibility permission will be requested from Terminal.\n    If you don't change Console to `Terminal`, Accessibility permission will be requested on every rebuild, because the debug binary is unsigned.\n\n## Tips\n\n- Use built-in \"Accessibility Inspector.app\" to inspect accessibility properties of windows\n- Use [DeskPad](https://github.com/Stengo/DeskPad) or [BetterDisplay 2](https://github.com/waydabber/BetterDisplay) to emulate several monitors\n- You can use `script/clean-project.sh` to clean the project when something goes wrong.\n"
  },
  {
    "path": "docs/aerospace-balance-sizes.adoc",
    "content": "= aerospace-balance-sizes(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-balance-sizes\n// tag::purpose[]\n:manpurpose: Balance sizes of all windows in the current workspace\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace balance-sizes [-h|--help] [--workspace <workspace>]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--workspace <workspace>::\ninclude::./util/workspace-flag-desc.adoc[]\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-close-all-windows-but-current.adoc",
    "content": "= aerospace-close-all-windows-but-current(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-close-all-windows-but-current\n// tag::purpose[]\n:manpurpose: On the focused workspace, close all windows but current\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace close-all-windows-but-current [-h|--help] [--quit-if-last-window]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--quit-if-last-window:: Quit the apps instead of closing them if it's their last window\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-close.adoc",
    "content": "= aerospace-close(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-close\n// tag::purpose[]\n:manpurpose: Close the focused window\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace close [-h|--help] [--quit-if-last-window] [--window-id <window-id>]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nNormally, you don’t need to use this command, because macOS offers its own `cmd+w` binding.\nYou might want to use the command from CLI for scripting purposes\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--quit-if-last-window:: Quit the app instead of closing if it's the last window of the app\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-config.adoc",
    "content": "= aerospace-config(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-config\n// tag::purpose[]\n:manpurpose: Query AeroSpace config options\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace config [-h|--help] --get <name> [--json] [--keys]\naerospace config [-h|--help] --major-keys\naerospace config [-h|--help] --all-keys\naerospace config [-h|--help] --config-path\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nFor now, only `mode.*` config options are supported\n\nUnder the hood, the config is represented as recursive data structure of maps, arrays, strings, and integers.\n\nPrinting without `--json` or `--keys` flag is supported only for scalar types (strings and integers) and array of scalar types.\nPrinting other complicated objects requires `--json` or `--keys` flag.\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--get <name>:: Get the value for a given key. You can inspect available keys with `--major-keys` or `--all-keys`\n--major-keys:: Print major keys\n--all-keys:: Print all available keys recursively\n--json:: Print result in JSON format\n--keys:: Print keys of the complicated object (map or array)\n--config-path:: Print absolute path to the loaded config\n\n// =========================================================== Examples\ninclude::util/conditional-examples-header.adoc[]\n\n* List all binding modes:\n+\n----\n$ aerospace config --get mode --keys\nmain\nservice\n----\n* List all key bindings for 'main' binding mode:\n+\n----\n$ aerospace config --get mode.main.binding --keys\nalt-1\nalt-2\n...\n----\n* List all key bindings for 'main' binding mode in JSON format:\n+\n----\n$ aerospace config --get mode.main.binding --json\n{\n  \"alt-w\" : \"workspace W\",\n  \"alt-y\" : \"workspace Y\",\n  \"alt-n\" : \"workspace N\",\n  \"alt-shift-e\" : \"move-node-to-workspace E\",\n  \"alt-shift-m\" : \"move-node-to-workspace M\",\n  \"alt-shift-t\" : \"move-node-to-workspace T\",\n...\n----\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-debug-windows.adoc",
    "content": "= aerospace-debug-windows(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-debug-windows\n// tag::purpose[]\n:manpurpose: Interactive command to record Accessibility API debug information to create bug reports\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace debug-windows [-h|--help] [--window-id <window-id>]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nUse this command output to report bug reports about incorrect windows handling\n(e.g. some windows are floated when they shouldn't).\n\nThe intended usage is the following:\n\n. Run the command to start the debug session recording\n. Focus problematic window or make the window appear.\n. Run the command one more time to stop the debug session recording and print the results\n\n`debug-windows` command is *not stable API*.\nPlease *don't rely on* the command existence and output format.\nThe only intended use case is to report bugs about incorrect windows handling.\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--window-id <window-id>::\nPrint debug information of the specified window right away.\nUsage of this flag disables interactive mode.\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-enable.adoc",
    "content": "= aerospace-enable(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-enable\n// tag::purpose[]\n:manpurpose: Temporarily disable window management\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace enable [-h|--help] toggle\naerospace enable [-h|--help] on [--fail-if-noop]\naerospace enable [-h|--help] off [--fail-if-noop]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nWhen you disable AeroSpace, windows from currently invisible workspaces will be placed to the visible area of the screen\n\nKey events are not intercepted when AeroSpace is disabled\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--fail-if-noop:: Exit with non-zero exit code if already in the requested mode\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-exec-and-forget.adoc",
    "content": "= aerospace-exec-and-forget(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-exec-and-forget\n// tag::purpose[]\n:manpurpose: Run /bin/bash -c '<bash-script>'\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace exec-and-forget <bash-script>\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\nRun `/bin/bash -c '<bash-script>'`, and don't wait for the command termination.\nStdout, stderr and exit code are ignored.\n\nFor example, you can use this command to launch applications:\n\n[source,toml]\n----\nalt-enter = 'exec-and-forget open -n /System/Applications/Utilities/Terminal.app'\n----\n\n`<bash-script>` is passed \"as is\" to bash without any transformations and escaping. `<bash-script>` is treated as suffix of the TOML string, it's not even an argument in classic CLI sense\n\n* The command is available in config\n* The command is *NOT* available in CLI\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-flatten-workspace-tree.adoc",
    "content": "= aerospace-flatten-workspace-tree(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-flatten-workspace-tree\n// tag::purpose[]\n:manpurpose: Flatten the tree of the focused workspace\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace flatten-workspace-tree [-h|--help] [--workspace <workspace>]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nThe command is useful when you messed up with your layout, and it's easier to \"reset\" it and start again.\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--workspace <workspace>::\ninclude::./util/workspace-flag-desc.adoc[]\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-focus-back-and-forth.adoc",
    "content": "= aerospace-focus-back-and-forth(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Switch between the current and previously focused elements back and forth\n// end::purpose[]\n:manname: aerospace-focus-back-and-forth\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace focus-back-and-forth [-h|--help]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}.\nThe element is either a window or an empty workspace.\n\nAeroSpace stores only one previously focused window in history,\nwhich means that if you close the previous window,\n`focus-back-and-forth` has no window to switch focus to.\nIn that case, the command will exit with non-zero exit code.\n\nThat's why it may be preferred to combine `focus-back-and-forth` with `workspace-back-and-forth`: +\n----\naerospace focus-back-and-forth || aerospace workspace-back-and-forth\n----\n\nAlso see: <<workspace-back-and-forth, workspace-back-and-forth>>\n// end::body[]\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-focus-monitor.adoc",
    "content": "= aerospace-focus-monitor(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-focus-monitor\n// tag::purpose[]\n:manpurpose: Focus monitor by relative direction, by order, or by pattern\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace focus-monitor [-h|--help] [--wrap-around] (left|down|up|right)\naerospace focus-monitor [-h|--help] [--wrap-around] (next|prev)\naerospace focus-monitor [-h|--help] <monitor-pattern>...\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--wrap-around:: Make it possible to wrap around focus\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\n(left|down|up|right)::\nFocus monitor in direction relative to the focused monitor\n\n(next|prev)::\nFocus next|prev monitor in order they appear in tray icon\n\n<monitor-pattern>...::\nFind the first matching monitor and focus it.\nMultiple monitor patterns is useful for different monitor configurations.\nMonitor patterns follow the same format as in `workspace-to-monitor-force-assignment` config option\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-focus.adoc",
    "content": "= aerospace-focus(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-focus\n// tag::purpose[]\n:manpurpose: Set focus to a window.\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace focus [-h|--help] [--ignore-floating] [--wrap-around]\n                [--boundaries <boundary>] [--boundaries-action <action>]\n                (left|down|up|right)\naerospace focus [-h|--help] [--ignore-floating] [--wrap-around]\n                [--boundaries <boundary>] [--boundaries-action <action>]\n                (dfs-next|dfs-prev)\naerospace focus [-h|--help] --window-id <window-id>\naerospace focus [-h|--help] --dfs-index <dfs-index>\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nContrary to i3, `focus` command doesn't have a separate argument to focus floating windows.\nFrom `focus` command perspective, floating windows are part of xref:guide.adoc#tree[the tree].\nThe floating window parent container is determined as the smallest tiling container that contains the center of the floating window.\nThe technique eliminates the need for an additional binding for floating windows.\nThis behavior can be disabled with `--ignore-floating` flag.\n\n`focus child|parent` isn't supported because the necessity of this operation is under the question.\nhttps://github.com/nikitabobko/AeroSpace/issues/5\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--boundaries <boundary>::\nDefines focus boundaries. +\n`<boundary>` possible values: `(workspace|all-monitors-outer-frame)`. +\nThe default is: `workspace`\n\n--boundaries-action <action>::\nDefines the behavior when requested to cross the `<boundary>`. +\n`<action>` possible values: `(stop|fail|wrap-around-the-workspace|wrap-around-all-monitors)`. +\nThe default is: `stop`\n\n--wrap-around::\nAn alias for `--boundaries-action wrap-around-the-workspace`.\nThe flag is incompatible with either `--boundaries-action` or `--boundaries`.\n\n--window-id <window-id>::\nFocus the window with specified `<window-id>`\n\n--dfs-index <dfs-index>::\nFocus window by its index, based on a depth-first search (DFS) of the window within the workspace tree.\nIndex is 0-based.\n\n--ignore-floating::\nDon't perceive floating windows as part of the tree.\nIt may be useful for more reliable scripting.\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\n(left|down|up|right)::\nSet focus to the nearest window in the given direction.\n\n(dfs-next|dfs-prev)::\nSet focus to the window before or after the current window in the depth-first order (top-to-bottom and left-to-right) of windows in the current workspace tree.\nIn this mode, `--boundaries` must be `workspace` (the default) and `--boundaries-action` can be set to one of `(stop|fail|wrap-around-the-workspace)`.\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-fullscreen.adoc",
    "content": "= aerospace-fullscreen(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-fullscreen\n// tag::purpose[]\n:manpurpose: Toggle the fullscreen mode for the focused window\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace fullscreen [-h|--help]     [--window-id <window-id>] [--no-outer-gaps]\naerospace fullscreen [-h|--help] on  [--window-id <window-id>] [--no-outer-gaps] [--fail-if-noop]\naerospace fullscreen [-h|--help] off [--window-id <window-id>] [--fail-if-noop]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nSwitching to a different tiling window within the same workspace while the current focused window is in fullscreen mode results in the fullscreen window exiting fullscreen mode.\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--no-outer-gaps:: Remove the outer gaps when in fullscreen mode\n--fail-if-noop:: Exit with non-zero exit code if already fullscreen or already not fullscreen\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\non, off::\n`on` means enter fullscreen mode. `off` means exit fullscreen mode.\nToggle between the two if not specified\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-join-with.adoc",
    "content": "= aerospace-join-with(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Put the focused window and the nearest node in the specified direction under a common parent container\n// end::purpose[]\n:manname: aerospace-join-with\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace join-with [-h|--help] [--window-id <window-id>] (left|down|up|right)\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Examples\ninclude::util/conditional-examples-header.adoc[]\n\nGiven this layout\n\n----\nh_tiles\n├── window 1\n├── window 2 (focused)\n└── window 3\n----\n\n`join-with right` will result in the following layout\n\n----\nh_tiles\n├── window 1\n└── v_tiles\n    ├── window 2 (focused)\n    └── window 3\n----\n\nNOTE: `join-with` is a high-level replacement for i3's https://i3wm.org/docs/userguide.html#_splitting_containers[split command].\nThere is an observation that the only reason why you might want to split a node is to put several windows under a common \"umbrella\" parent. Unlike `split`, `join-with` can be used with xref:guide.adoc#normalization[`enable-normalization-flatten-containers`]\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-layout.adoc",
    "content": "= aerospace-layout(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-layout\n// tag::purpose[]\n:manpurpose: Change layout of the focused window to the given layout\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace layout [-h|--help] [--window-id <window-id>]\n                 (h_tiles|v_tiles|h_accordion|v_accordion|tiles|accordion|horizontal|vertical|tiling|floating)...\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nIf several arguments are supplied then finds the first argument that doesn't describe the currently active layout, and applies the layout.\n\n* Change both tiling layout and orientation in one go: `h_tiles|v_tiles|h_accordion|v_accordion`\n* Change tiling layout but preserve orientation: `tiles|accordion`\n* Change orientation but preserve layout: `horizontal|vertical`\n* Toggle floating/tiling mode: `tiling|floating`\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// =========================================================== Examples\ninclude::util/conditional-examples-header.adoc[]\n\n* Toggle between `floating` and `tiling` layouts (order of args doesn't matter): +\n`aerospace layout floating tiling`\n\n* Toggle orientation (order of args doesn't matter): +\n`aerospace layout horizontal vertical`\n\n* Toggle between `tiles` and `accordion` layouts (order of args doesn't matter): +\n`aerospace layout tiles accordion`\n\n* Switch to `tiles` layout. Toggle the layout orientation if already in `tiles` layout: +\n`aerospace layout tiles horizontal vertical`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-list-apps.adoc",
    "content": "= aerospace-list-apps(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-list-apps\n// tag::purpose[]\n:manpurpose: Print the list of running applications that appears in the Dock and may have a user interface\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace list-apps [-h|--help] [--macos-native-hidden [no]] [--format <output-format>] [--count] [--json]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nThe command is useful to inspect list of applications to compose filter for xref:guide.adoc#on-window-detected-callback[on-window-detected callback]\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--macos-native-hidden [no]::\nFilter results to only print hidden applications.\n`[no]` inverts the condition\n\n--format <output-format>:: Specify output format. See \"Output Format\" section for more details.\nIncompatible with `--count`\n\n--count:: Output only the number of apps.\nIncompatible with: `--format`, `--json`\n\n--json:: Output in JSON format.\nCan be used in combination with `--format` to specify which data to include into the json.\nIncompatible with `--count`\n\n// =========================================================== Output Format\ninclude::util/conditional-output-format-header.adoc[]\n\nOutput format can be configured with optional `[--format <output-format>]` option.\n`<output-format>` supports https://en.wikipedia.org/wiki/String_interpolation[string interpolation].\n\nIf not specified, the default `<output-format>` is: +\n`%{app-pid}%{right-padding} | %{app-bundle-id}%{right-padding} | %{app-name}`\n\nThe following variables can be used inside `<output-format>`:\n\n%{app-bundle-id}:: String. Application unique identifier. https://developer.apple.com/documentation/appstoreconnectapi/bundle_ids[Bundle ID]\n%{app-name}:: String. Application name\n%{app-pid}:: Number. https://en.wikipedia.org/wiki/Process_identifier[UNIX process identifier]\n%{app-exec-path}:: String. Application executable path\n%{app-bundle-path}:: String. Application bundle path\n\n%{right-padding}:: A special variable which expands with a minimum number of spaces required to form a right padding in the appropriate column\n%{newline}:: Unicode U+000A newline symbol `\\n`\n%{tab}:: Unicode U+0009 tab symbol `\\t`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-list-exec-env-vars.adoc",
    "content": "= aerospace-list-exec-env-vars(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-list-exec-env-vars\n// tag::purpose[]\n:manpurpose: List environment variables that exec-* commands and callbacks are run with\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace list-exec-env-vars [-h|--help]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nExamples of commands and callbacks:\n\n* `aerospace exec-and-forget` command\n* `exec-on-workspace-change-callback`\n\n// end::body[]\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-list-modes.adoc",
    "content": "= aerospace-list-modes(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Print a list of modes currently specified in the configuration\n// end::purpose[]\n:manname: aerospace-list-modes\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace list-modes [-h|--help] [--current] [--count] [--json]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nSee xref:guide.adoc#binding-modes[the guide] for documentation about binding modes\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--current:: Only print the currently active mode.\nIncompatible with `--count`\n\n--count:: Output only the number of modes.\nIncompatible with `--current`, `--json`\n\n--json:: Output in JSON format.\nIncompatible with `--count`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-list-monitors.adoc",
    "content": "= aerospace-list-monitors(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-list-monitors\n// tag::purpose[]\n:manpurpose: Print monitors that satisfy conditions\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace list-monitors [-h|--help] [--focused [no]] [--mouse [no]] [--format <output-format>] [--count] [--json]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--focused [no]::\nFilter results to only print the focused monitor.\n`[no]` inverts the condition\n\n--mouse [no]::\nFilter results to only print the monitor with the mouse.\n`[no]` inverts the condition\n\n--format <output-format>::\nSpecify output format.\nSee \"Output Format\" section for more details.\nIncompatible with `--count`\n\n--count::\nOutput only the number of monitors.\nIncompatible with `--format`\n\n--json::\nOutput in JSON format.\nCan be used in combination with `--format` to specify which data to include into the json.\nIncompatible with `--count`\n\n// =========================================================== Output Format\ninclude::util/conditional-output-format-header.adoc[]\n\nOutput format can be configured with optional `[--format <output-format>]` option.\n`<output-format>` supports https://en.wikipedia.org/wiki/String_interpolation[string interpolation].\n\nIf not specified, the default `<output-format>` is: +\n`%{monitor-id}%{right-padding} | %{monitor-name}`\n\nThe following variables can be used inside `<output-format>`:\n\n%{monitor-id}:: 1-based Number. Sequential number of the belonging monitor\n%{monitor-appkit-nsscreen-screens-id}:: 1-based index of the belonging monitor in `NSScreen.screens` array. Useful for integration with other tools that might be using `NSScreen.screens` ordering (like sketchybar).\n%{monitor-name}:: String. Name of the belonging monitor\n%{monitor-is-main}:: Boolean. True if the monitor is main.\n\n%{right-padding}:: A special variable which expands with a minimum number of spaces required to form a right padding in the appropriate column\n%{newline}:: Unicode U+000A newline symbol `\\n`\n%{tab}:: Unicode U+0009 tab symbol `\\t`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-list-windows.adoc",
    "content": "= aerospace-list-windows(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-list-windows\n// tag::purpose[]\n:manpurpose: Print windows that satisfy conditions\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace list-windows [-h|--help] (--workspace <workspace>...|--monitor <monitor>...)\n                       [--monitor <monitor>...] [--workspace <workspace>...]\n                       [--pid <pid>] [--app-bundle-id <app-bundle-id>] [--format <output-format>]\n                       [--count] [--json]\naerospace list-windows [-h|--help] --all [--format <output-format>] [--count] [--json]\naerospace list-windows [-h|--help] --focused [--format <output-format>] [--count] [--json]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\ninclude::util/all-monitors-option.adoc[]\n\n--focused::\nPrint the focused window.\nPlease note that it is possible for no window to be in focus.\nIn that case, error is reported.\n\n--workspace <workspace>...::\nFilter results to only print windows that belong to either of specified workspaces.\n`<workspace>...` is a space-separated list of workspace names.\n+\nPossible values: +\n+\n. Workspace name\n. `focused` is a special workspace name that represents the focused workspace\n. `visible` is a special workspace name that represents all currently visible workspaces (In multi-monitor setup, there are multiple visible workspaces)\n\ninclude::util/monitor-option.adoc[]\n\n--pid <pid>:: Filter results to only print windows that belong to the Application with specified `<pid>`\n\n--app-bundle-id <app-bundle-id>::\nFilter results to only print windows that belong to the Application with specified https://developer.apple.com/documentation/appstoreconnectapi/bundle_ids[Bundle ID]\n+\nDeprecated (but still supported) flag name: `--app-id`\n\n--format <output-format>:: Specify output format. See \"Output Format\" section for more details.\nIncompatible with `--count`\n\n--count:: Output only the number of windows.\nIncompatible with `--format`\n\n--json:: Output in JSON format.\nCan be used in combination with `--format` to specify which data to include into the json.\nIncompatible with `--count`\n\n// =========================================================== Output Format\ninclude::util/conditional-output-format-header.adoc[]\n\nOutput format can be configured with optional `[--format <output-format>]` option.\n`<output-format>` supports https://en.wikipedia.org/wiki/String_interpolation[string interpolation].\n\nIf not specified, the default `<output-format>` is: +\n`%{window-id}%{right-padding} | %{app-name}%{right-padding} | %{window-title}`\n\nThe following variables can be used inside `<output-format>`:\n\n%{window-id}:: Number. Window unique ID\n%{window-title}:: String. Window title\n%{window-is-fullscreen}:: Boolean. Is window in fullscreen by `aerospace fullscreen` command\n%{window-layout}:: String. Alias for `%{window-parent-container-layout}`\n%{window-parent-container-layout}:: String. The layout (`v_tiles`, `h_tiles`, `v_accordion`, `h_accordion`, `floating`) of the window's parent container.\n\n%{app-bundle-id}:: String. Application unique identifier. https://developer.apple.com/documentation/appstoreconnectapi/bundle_ids[Bundle ID]\n%{app-name}:: String. Application name\n%{app-pid}:: Number. https://en.wikipedia.org/wiki/Process_identifier[UNIX process identifier]\n%{app-exec-path}:: String. Application executable path\n%{app-bundle-path}:: String. Application bundle path\n\n%{workspace}:: String. Name of the belonging workspace\n%{workspace-is-focused}:: Boolean. True if the workspace has focus\n%{workspace-is-visible}:: Boolean. True if the workspace is visible. A workspace can be visible but not focused in a multi-monitor setup\n%{workspace-root-container-layout}:: String. The layout (`v_tiles`, `h_tiles`, `v_accordion`, `h_accordion`) of the workspace the window belongs to.\n\n%{monitor-id}:: 1-based Number. Sequential number of the belonging monitor.\n%{monitor-appkit-nsscreen-screens-id}:: 1-based index of the belonging monitor in `NSScreen.screens` array. Useful for integration with other tools that might be using `NSScreen.screens` ordering (like sketchybar).\n%{monitor-name}:: String. Name of the belonging monitor\n%{monitor-is-main}:: Boolean. True if the monitor is main.\n\n%{right-padding}:: A special variable which expands with a minimum number of spaces required to form a right padding in the appropriate column\n%{newline}:: Unicode U+000A newline symbol `\\n`\n%{tab}:: Unicode U+0009 tab symbol `\\t`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-list-workspaces.adoc",
    "content": "= aerospace-list-workspaces(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-list-workspaces\n// tag::purpose[]\n:manpurpose: Print workspaces that satisfy conditions\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace list-workspaces [-h|--help] --monitor <monitor>... [--visible [no]] [--empty [no]] [--format <output-format>] [--count] [--json]\naerospace list-workspaces [-h|--help] --all [--format <output-format>] [--count] [--json]\naerospace list-workspaces [-h|--help] --focused [--format <output-format>] [--count] [--json]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--format <output-format>:: Specify output format. See \"Output Format\" section for more details\n\ninclude::util/all-monitors-option.adoc[]\n\n--focused::\nAlias for `--monitor focused --visible`.\nAlways prints a single workspace\n\ninclude::util/monitor-option.adoc[]\n\n--visible [no]::\nFilter results to only print currently visible workspaces.\n`[no]` inverts the condition.\nSeveral workspaces can be visible in multi-monitor setup\n\n--empty [no]::\nFilter results to only print empty workspaces.\n`[no]` inverts the condition.\n\n--format <output-format>::\nSpecify output format.\nSee \"Output Format\" section for more details.\nIncompatible with `--count`\n\n--count::\nOutput only the number of workspaces.\nIncompatible with `--format`\n\n--json::\nOutput in JSON format.\nCan be used in combination with `--format` to specify which data to include into the json.\nIncompatible with `--count`\n\n// =========================================================== Output Format\ninclude::util/conditional-output-format-header.adoc[]\n\nOutput format can be configured with optional `[--format <output-format>]` option.\n`<output-format>` supports https://en.wikipedia.org/wiki/String_interpolation[string interpolation].\n\nIf not specified, the default `<output-format>` is: +\n`%{workspace}`\n\nThe following variables can be used inside `<output-format>`:\n\n%{workspace}:: String. Name of the belonging workspace\n%{workspace-is-focused}:: Boolean. True if the workspace has focus\n%{workspace-is-visible}:: Boolean. True if the workspace is visible. A workspace can be visible but not focused in a multi-monitor setup\n%{workspace-root-container-layout}:: String. The layout (`v_tiles`, `h_tiles`, `v_accordion`, `h_accordion`) of the workspace's root container\n\n%{monitor-id}:: 1-based Number. Sequential number of the belonging monitor\n%{monitor-appkit-nsscreen-screens-id}:: 1-based Number. Sequential number of the belonging monitor in `NSScreen.screens`. Useful for integration with other tools that might be using `NSScreen.screens` ordering (like sketchybar).\n%{monitor-name}:: String. Name of the belonging monitor\n%{monitor-is-main}:: Boolean. True if the monitor is main.\n\n%{right-padding}:: A special variable which expands with a minimum number of spaces required to form a right padding in the appropriate column\n%{newline}:: Unicode U+000A newline symbol `\\n`\n%{tab}:: Unicode U+0009 tab symbol `\\t`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-macos-native-fullscreen.adoc",
    "content": "= aerospace-macos-native-fullscreen(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-macos-native-fullscreen\n// tag::purpose[]\n:manpurpose: Toggle macOS fullscreen for the focused window\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace macos-native-fullscreen [-h|--help] [--window-id <window-id>]\naerospace macos-native-fullscreen [-h|--help] [--window-id <window-id>] [--fail-if-noop] on\naerospace macos-native-fullscreen [-h|--help] [--window-id <window-id>] [--fail-if-noop] off\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--fail-if-noop:: Exit with non-zero exit code if already fullscreen or already not fullscreen\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\non, off::\n`on` means enter fullscreen mode.\n`off` means exit fullscreen mode.\nToggle between the two if not specified\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-macos-native-minimize.adoc",
    "content": "= aerospace-macos-native-minimize(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-macos-native-minimize\n// tag::purpose[]\n:manpurpose: Minimize focused window\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace macos-native-minimize [-h|--help] [--window-id <window-id>]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-mode.adoc",
    "content": "= aerospace-mode(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Activate the specified binding mode\n// end::purpose[]\n:manname: aerospace-mode\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace mode [-h|--help] <binding-mode>\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nSee xref:guide.adoc#binding-modes[the guide] for documentation about binding modes\n// end::body[]\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-move-mouse.adoc",
    "content": "= aerospace-move-mouse(1)\ninclude::./util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Move mouse to the requested position\n// end::purpose[]\n:manname: aerospace-move-mouse\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace move-mouse [-h|--help] [--fail-if-noop] <mouse-position>\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--fail-if-noop::\nExit with non-zero exit code if mouse is already at the requested position.\nThe flag is compatible only with `window-lazy-center` and `monitor-lazy-center` arguments.\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\n<mouse-position>::\nPosition to move mouse to.\nPossible values:\n+\n* `monitor-lazy-center`. Move mouse to the center of the focused monitor, *unless* it is already within the monitor boundaries.\n* `monitor-force-center`. Move mouse to the center of the focused monitor.\n* `window-lazy-center`. Move mouse to the center of the focused window, *unless* it is already within the window boundaries. Exit with non-zero code if no window is focused.\n* `window-force-center`. Move mouse to the center of the focused window. Exit with non-zero code if no window is focused.\n\n// =========================================================== Examples\ninclude::util/conditional-examples-header.adoc[]\n\n* Try to move mouse to the center of the window. If there is no window in focus, move mouse to the center of the monitor: +\n`aerospace move-mouse window-lazy-center || aerospace move-mouse monitor-lazy-center`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::./util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-move-node-to-monitor.adoc",
    "content": "= aerospace-move-node-to-monitor(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-move-node-to-monitor\n// tag::purpose[]\n:manpurpose: Move window to monitor targeted by relative direction, by order, or by pattern\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace move-node-to-monitor [-h|--help] [--window-id <window-id>] [--focus-follows-window]\n                               [--wrap-around] (left|down|up|right|next|prev)\naerospace move-node-to-monitor [-h|--help] [--window-id <window-id>] [--focus-follows-window]\n                               [--fail-if-noop] <monitor-pattern>...\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--wrap-around:: Make it possible to wrap around the movement\n\n--focus-follows-window::\nMake sure that the window in question receives focus after moving.\nThis flag is a shortcut for manually running `aerospace-workspace`/`aerospace-focus` after `move-node-to-monitor` successful execution.\n\n--fail-if-noop::\nExit with non-zero code if moving window to monitor it already belongs to\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// =========================================================== Arguments\ninclude::util/conditional-arguments-header.adoc[]\n\n(left|down|up|right)::\nMove window to monitor in direction relative to the focused monitor\n\n(next|prev)::\nMove window to next|prev monitor in order they appear in tray icon\n\n<monitor-pattern>...::\nFind the first matching monitor and move the window there.\nMultiple monitor patterns is useful for different monitor configurations.\nMonitor patterns follow the same format as in `workspace-to-monitor-force-assignment` config option\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-move-node-to-workspace.adoc",
    "content": "= aerospace-move-node-to-workspace(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-move-node-to-workspace\n// tag::purpose[]\n:manpurpose: Move the focused window to the specified workspace\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace move-node-to-workspace [-h|--help] [--focus-follows-window] [--wrap-around]\n                                 [--stdin|--no-stdin]\n                                 (next|prev)\naerospace move-node-to-workspace [-h|--help] [--focus-follows-window] [--fail-if-noop]\n                                 [--window-id <window-id>] <workspace-name>\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n`(next|prev)` is identical to `workspace (next|prev)`\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--wrap-around:: Make it possible to jump between first and last workspaces using (next|prev)\n--fail-if-noop:: Exit with non-zero code if move window to workspace it already belongs to\n\n--focus-follows-window::\nMake sure that the window in question receives focus after moving.\nThis flag is a shortcut for manually running `aerospace-workspace`/`aerospace-focus` after `move-node-to-workspace` successful execution.\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n--stdin::\nRead the list of workspaces from stdin.\nIncompatible with `--no-stdin`\n\n--no-stdin::\nIgnore the list of workspaces from stdin, even if provided.\nIncompatible with `--stdin`\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\n(next|prev):: Move window to next or prev workspace\n<workspace-name>:: Specifies workspace name where to move window to\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-move-workspace-to-monitor.adoc",
    "content": "= aerospace-move-workspace-to-monitor(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-move-workspace-to-monitor\n// tag::purpose[]\n:manpurpose: Move workspace to monitor targeted by relative direction, by order, or by pattern.\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace move-workspace-to-monitor [-h|--help] [--workspace <workspace>] [--wrap-around] (left|down|up|right)\naerospace move-workspace-to-monitor [-h|--help] [--workspace <workspace>] [--wrap-around] (next|prev)\naerospace move-workspace-to-monitor [-h|--help] [--workspace <workspace>] <monitor-pattern>...\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\nFocus follows the focused workspace, so the workspace stays focused.\n\nThe command fails for workspaces xref:guide.adoc#assign-workspaces-to-monitors[that have monitor force assignment].\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--wrap-around:: Allows to move workspace between first and last monitors\n\n--workspace <workspace>::\ninclude::./util/workspace-flag-desc.adoc[]\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\n(left|down|up|right)::\nMove workspace to monitor in direction relative to the focused monitor\n\n(next|prev)::\nMove the workspace to next or prev monitor.\n'next' or 'prev' monitor is calculated relative to the monitor `<workspace>` currently belongs to.\n\n<monitor-pattern>::\nFind the first matching monitor and move the workspace there.\nMultiple monitor patterns is useful for different monitor configurations.\nMonitor patterns follow the same format as in `workspace-to-monitor-force-assignment` config option\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-move.adoc",
    "content": "= aerospace-move(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Move the focused window in the given direction\n// end::purpose[]\n:manname: aerospace-move\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace move [-h|--help] [--window-id <window-id>] [--boundaries <boundary>] [--boundaries-action <boundary-action>] (left|down|up|right)\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\nMove the focused window in the given direction. See the \"Examples\" section for more details.\n\nDeprecated name: `move-through`\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n--boundaries <boundary>::\nDefines move boundaries. +\n`<boundary>` possible values: `(workspace|all-monitors-outer-frame)`. +\nThe default is: `workspace`\n\n--boundaries-action <boundary-action>::\nDefines the behavior when requested to move across the `<boundary>`. +\n`<boundary-action>` possible values: `(stop|fail|create-implicit-container)`. +\nThe default is: `create-implicit-container`\n\n// =========================================================== Examples\ninclude::util/conditional-examples-header.adoc[]\n\n. Given this layout\n+\n----\nh_tiles\n├── window 1 (focused)\n└── window 2\n----\n+\n`move right` will result in the following layout\n+\n----\nh_tiles\n├── window 2\n└── window 1 (focused)\n----\n\n. Given this layout\n+\n----\nh_tiles\n├── window 1\n├── window 2 (focused)\n└── v_tiles\n    ├── window 3\n    └── window 4\n----\n+\n`move right` will result in the following layout\n+\n----\nh_tiles\n├── window 1\n└── v_tiles\n    ├── window 3\n    ├── window 2 (focused)\n    └── window 4\n----\n\n. Given this layout\n+\n----\nh_tiles\n├── window 1\n└── v_tiles\n    ├── window 3\n    ├── window 2 (focused)\n    └── window 4\n----\n+\n`move left` will result in the following layout\n+\n----\nh_tiles\n├── window 1\n├── window 2 (focused)\n└── v_tiles\n    ├── window 3\n    └── window 4\n----\n\n. *Implicit container example*\n+\nIn some cases, `move` needs to implicitly create a container to fulfill your command.\n+\nGiven this layout\n+\n----\nh_tiles\n├── window 1\n├── window 2 (focused)\n└── window 3\n----\n+\n`move up` will result in the following layout\n+\n----\nv_tiles\n├── window 2 (focused)\n└── h_tiles\n    ├── window 1\n    └── window 3\n----\n+\n`v_tiles` is an implicitly created container.\n+\n*Remark*: If `--boundaries` is set to `all-monitors-outer-frame` and there is a monitor in the `up` direction,\nthe implicit container isn't created.\n+\nInstead, `window 2` would be moved to the monitor above the current.\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-reload-config.adoc",
    "content": "= aerospace-reload-config(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-reload-config\n// tag::purpose[]\n:manpurpose: Reload currently active config\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace reload-config [-h|--help] [--no-gui] [--dry-run]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nIf the config contains errors they will be printed to stdout, and GUI will open to show the errors.\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--no-gui:: Don't open GUI to show error. Only use stdout to report errors\n--dry-run:: Validate the config and show errors (if any) but don't reload the config\n\ninclude::util/conditional-exit-code-header.adoc[]\n\n0:: Success. The config is reloaded successfully.\nnon-zero exit code:: Failure. The config contains errors.\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-resize.adoc",
    "content": "= aerospace-resize(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-resize\n// tag::purpose[]\n:manpurpose: Resize the focused window\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace resize [-h|--help] [--window-id <window-id>] (smart|smart-opposite|width|height) [+|-]<number>\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nThe dimension to resize is chosen by the first argument\n\n* `width` changes width\n* `height` changes height\n* `smart` changes width if the parent has horizontal orientation, and\nit changes height if the parent has vertical orientation\n* `smart-opposite` resizes the opposite axis of smart\n\nSecond argument controls how much the size changes\n\n* If the `<number>` is prefixed with `+` then the dimension is increased\n* If the `<number>` is prefixed with `-` then the dimension is decreased\n* If the `<number>` is prefixed with neither `+` nor `-` then the command changes the absolute value of the dimension\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-split.adoc",
    "content": "= aerospace-split(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-split\n// tag::purpose[]\n:manpurpose: Split focused window\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace split [-h|--help] [--window-id <window-id>] (horizontal|vertical|opposite)\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n`split` command exists solely for compatibility with i3.\nUnless you're hardcore i3 user who knows what they are doing, it's recommended to use `join-with`\n\n*If the parent of focused window contains more than one child*, then the command\n\n. Creates a new tiling container\n. Replaces the focused window with the container\n. Puts the focused window into the container as its only child\n\nThe argument configures orientation of the newly created container.\n`opposite` means opposite orientation compared to the parent container.\n\n*If the parent of the focused window contains only a single child* (the window itself), then `split` command changes the orientation of the parent container\n\nIMPORTANT: `split` command has no effect if `enable-normalization-flatten-containers` is turned on.\nConsider using `join-with` if you want to keep `enable-normalization-flatten-containers` enabled\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-subscribe.adoc",
    "content": "= aerospace-subscribe(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Subscribe to AeroSpace events and receive notifications via socket\n// end::purpose[]\n:manname: aerospace-subscribe\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace subscribe [-h|--help] [--all] [--no-send-initial] [<event>...]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nThis command connects to the AeroSpace server and receives real-time event notifications as JSON lines.\nThe connection remains open until terminated (e.g., via Ctrl+C).\n\nOn connect, the current state is sent immediately (focus-changed with current window/workspace, mode-changed with current mode, etc.).\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--all:: Subscribe to all event types\n\n--no-send-initial:: Do not send the initial state on connect\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\nThe following events can be subscribed to:\n\nfocus-changed:: Fired when window focus changes. Includes `windowId`, `workspace`.\n\nfocused-monitor-changed:: Fired when the focused monitor changes. Includes `workspace`, `monitorId`.\n\nfocused-workspace-changed:: Fired when the focused workspace changes. Includes `workspace`, `prevWorkspace`.\n\nmode-changed:: Fired when the binding mode changes. Includes `mode`.\n\nwindow-detected:: Fired when a new window is detected. Includes `windowId`, `workspace`, `appBundleId`, `appName`.\n\nbinding-triggered:: Fired when a keyboard binding is triggered. Includes `binding`, `mode`.\n\n// =========================================================== Output Format\ninclude::util/conditional-output-format-header.adoc[]\n\nEvents are output as JSON lines (one JSON object per line):\n\n----\n{\"_event\":\"focused-monitor-changed\",\"monitorId\":1,\"workspace\":\"M\"}\n{\"_event\":\"focused-workspace-changed\",\"prevWorkspace\":\"M\",\"workspace\":\"M\"}\n{\"_event\":\"mode-changed\",\"mode\":\"main\"}\n{\"_event\":\"focus-changed\",\"windowId\":28218,\"workspace\":\"M\"}\n----\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-summon-workspace.adoc",
    "content": "= aerospace-summon-workspace(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Move the requested workspace to the focused monitor.\n// end::purpose[]\n:manname: aerospace-summon-workspace\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace summon-workspace [-h|--help] [--fail-if-noop] <workspace>\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\nThe moved workspace becomes focused.\nThe behavior is identical to Xmonad.\n\nThe command makes sense only in multi-monitor setup.\nIn single monitor setup the command is identical to `workspace` command.\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--fail-if-noop:: Exit with non-zero exit code if the workspace is already visible on the focused monitor.\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\n<workspace>:: The workspace to operate on.\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-swap.adoc",
    "content": "= aerospace-swap(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-swap\n// tag::purpose[]\n:manpurpose: Swaps the focused window with another window.\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace swap [-h|--help] [--window-id <window-id>] [--swap-focus]\n               [--wrap-around]\n               (left|down|up|right|dfs-next|dfs-prev)\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nThe operation is equivalent to dragging a window with the mouse.\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n--window-id <window-id>::\ninclude::./util/window-id-flag-desc.adoc[]\n\n--swap-focus::\nSwap focus away from the currently focused window.\nBy default, this command does not change the focused window.\n\n--wrap-around::\nWrap around if the window is at the edge of the workspace (for `(left|down|up|right)`) or the start/end of the depth first order (for `(dfs-next|dfs-prev)`).\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\n(left|down|up|right)::\nSwaps the focused window with the nearest window in the given direction.\n\n(dfs-next|dfs-prev)::\nSwaps the focused window with the next or previous window in the depth-first order (top-to-bottom and left-to-right) of windows in the current workspace tree.\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-trigger-binding.adoc",
    "content": "= aerospace-trigger-binding(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-trigger-binding\n// tag::purpose[]\n:manpurpose: Trigger AeroSpace binding as if it was pressed by user\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace trigger-binding [-h|--help] <binding> --mode <mode-id>\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nYou can use aerospace-config command to inspect available bindings: +\n`aerospace config --get mode.main.binding --keys`\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--mode <mode-id>:: Mode to search `<binding>` in\n\n// =========================================================== Arguments\ninclude::util/conditional-arguments-header.adoc[]\n\n<binding>:: Binding to trigger\n\n// =========================================================== Examples\ninclude::util/conditional-examples-header.adoc[]\n\n* Run alphabetically first binding from config (useless and synthetic example): +\n`aerospace trigger-binding --mode main \"$(aerospace config --get mode.main.binding --keys | head -1)\"`\n* Trigger `alt-tab` binding: +\n`aerospace trigger-binding --mode main alt-tab`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-volume.adoc",
    "content": "= aerospace-volume(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Manipulate volume\n// end::purpose[]\n:manname: aerospace-volume\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace volume [-h|--help] (up|down) [--no-gui]\naerospace volume [-h|--help] (mute-toggle|mute-off|mute-on) [--no-gui]\naerospace volume [-h|--help] set <number> [--no-gui]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\n// =========================================================== Options\ninclude::./util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--no-gui:: Don't show volume GUI indicator\n\n// =========================================================== Arguments\ninclude::./util/conditional-arguments-header.adoc[]\n\n(up|down):: Increase or decrease the volume\n(mute-toggle|mute-on|mute-off):: Toggle/On/Off mute\nset <number>:: Set volume to the exact value on scale from 0 to 100\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-workspace-back-and-forth.adoc",
    "content": "= aerospace-workspace-back-and-forth(1)\ninclude::util/man-attributes.adoc[]\n// tag::purpose[]\n:manpurpose: Switch between the focused workspace and previously focused workspace back and forth\n// end::purpose[]\n:manname: aerospace-workspace-back-and-forth\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace workspace-back-and-forth [-h|--help]\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n{manpurpose}\n\nUnlike `focus-back-and-forth`, `workspace-back-and-forth` always succeeds.\nBecause unlike windows, workspaces can not be \"closed\".\nWorkspaces are name-addressable objects.\nThey are created and destroyed on the fly.\n\nAlso see: <<focus-back-and-forth, focus-back-and-forth>>\n// end::body[]\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace-workspace.adoc",
    "content": "= aerospace-workspace(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace-workspace\n// tag::purpose[]\n:manpurpose: Focus the specified workspace\n// end::purpose[]\n\n// =========================================================== Synopsis\n== Synopsis\n[verse]\n// tag::synopsis[]\naerospace workspace [-h|--help] [--auto-back-and-forth] [--fail-if-noop] <workspace-name>\naerospace workspace [-h|--help] [--wrap-around] [--stdin|--no-stdin] (next|prev)\n\n// end::synopsis[]\n\n// =========================================================== Description\n== Description\n\n// tag::body[]\n*1. <workspace-name> syntax*\n\n{manpurpose}\n\n*2. (next|prev) syntax*\n\nFocuses next or previous workspace in *the list*.\n\n* If `--stdin` is specified, then *the list* is taken from stdin\n* Otherwise, *the list* is defined as all workspaces on focused monitor in alphabetical order\n\n// =========================================================== Options\ninclude::util/conditional-options-header.adoc[]\n\n-h, --help:: Print help\n--wrap-around:: Make it possible to jump between first and last workspaces using `(next|prev)`\n\n--auto-back-and-forth::\nAutomatic `back-and-forth` when switching to already focused workspace.\nIncompatible with `--fail-if-noop`\n\n--fail-if-noop::\nExit with non-zero exit code if switch to the already focused workspace.\nIncompatible with `--auto-back-and-forth`\n\n--stdin::\nRead the list of workspaces from stdin.\nIncompatible with `--no-stdin`\n\n--no-stdin::\nIgnore the list of workspaces from stdin, even if provided.\nIncompatible with `--stdin`\n\n// =========================================================== Examples\ninclude::util/conditional-examples-header.adoc[]\n\n* Go to the next non empty workspace on the focused monitor: +\n`aerospace list-workspaces --monitor focused --empty no | aerospace workspace --stdin next`\n\n// end::body[]\n\n// =========================================================== Footer\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/aerospace.adoc",
    "content": "= aerospace(1)\ninclude::util/man-attributes.adoc[]\n:manname: aerospace\n:manpurpose: i3-like tiling window manager for macOS\n\n== Synopsis\n[verse]\naerospace [-h|--help] [-v|--version] <subcommand> [<subcommand-options>...] [<subcommand-arguments>...]\n\n== Description\n\nAeroSpace is an i3-like tiling window manager for macOS\n\n*aerospace* command line program is used to manipulate AeroSpace and query its state.\n\nSee https://nikitabobko.github.io/AeroSpace/commands for available <subcommand> options\n\nSee each <subcommand> individual man page for <subcommand-options> and <subcommand-arguments>\n\n== Options\n\n-h, --help:: Print help\n\ninclude::util/man-footer.adoc[]\n"
  },
  {
    "path": "docs/commands.adoc",
    "content": "= AeroSpace Commands\ninclude::util/site-attributes.adoc[]\n\ninclude::util/header.adoc[]\n\nCommands documentation is also available as manpages.\n\n== balance-sizes\n----\ninclude::aerospace-balance-sizes.adoc[tags=synopsis]\n----\ninclude::aerospace-balance-sizes.adoc[tags=purpose]\ninclude::aerospace-balance-sizes.adoc[tags=body]\n\n== close\n----\ninclude::aerospace-close.adoc[tags=synopsis]\n----\ninclude::aerospace-close.adoc[tags=purpose]\ninclude::aerospace-close.adoc[tags=body]\n\n== close-all-windows-but-current\n----\ninclude::aerospace-close-all-windows-but-current.adoc[tags=synopsis]\n----\ninclude::aerospace-close-all-windows-but-current.adoc[tags=purpose]\ninclude::aerospace-close-all-windows-but-current.adoc[tags=body]\n\n== enable\n----\ninclude::aerospace-enable.adoc[tags=synopsis]\n----\ninclude::aerospace-enable.adoc[tags=purpose]\ninclude::aerospace-enable.adoc[tags=body]\n\n== exec-and-forget\n----\ninclude::aerospace-exec-and-forget.adoc[tags=synopsis]\n----\ninclude::aerospace-exec-and-forget.adoc[tags=purpose]\ninclude::aerospace-exec-and-forget.adoc[tags=body]\n\n== flatten-workspace-tree\n----\ninclude::aerospace-flatten-workspace-tree.adoc[tags=synopsis]\n----\ninclude::aerospace-flatten-workspace-tree.adoc[tags=purpose]\ninclude::aerospace-flatten-workspace-tree.adoc[tags=body]\n\n== focus\n----\ninclude::aerospace-focus.adoc[tags=synopsis]\n----\ninclude::aerospace-focus.adoc[tags=purpose]\ninclude::aerospace-focus.adoc[tags=body]\n\n== focus-back-and-forth\n----\n\ninclude::./aerospace-focus-back-and-forth.adoc[tags=synopsis]\n----\ninclude::./aerospace-focus-back-and-forth.adoc[tags=purpose]\ninclude::./aerospace-focus-back-and-forth.adoc[tags=body]\n\n== focus-monitor\n----\ninclude::aerospace-focus-monitor.adoc[tags=synopsis]\n----\ninclude::aerospace-focus-monitor.adoc[tags=purpose]\ninclude::aerospace-focus-monitor.adoc[tags=body]\n\n== fullscreen\n----\ninclude::aerospace-fullscreen.adoc[tags=synopsis]\n----\ninclude::aerospace-fullscreen.adoc[tags=purpose]\ninclude::aerospace-fullscreen.adoc[tags=body]\n\n== join-with\n----\ninclude::aerospace-join-with.adoc[tags=synopsis]\n----\ninclude::aerospace-join-with.adoc[tags=purpose]\ninclude::aerospace-join-with.adoc[tags=body]\n\n== layout\n----\ninclude::aerospace-layout.adoc[tags=synopsis]\n----\ninclude::aerospace-layout.adoc[tags=purpose]\ninclude::aerospace-layout.adoc[tags=body]\n\n== macos-native-fullscreen\n----\ninclude::aerospace-macos-native-fullscreen.adoc[tags=synopsis]\n----\ninclude::aerospace-macos-native-fullscreen.adoc[tags=purpose]\ninclude::aerospace-macos-native-fullscreen.adoc[tags=body]\n\n== macos-native-minimize\n----\ninclude::aerospace-macos-native-minimize.adoc[tags=synopsis]\n----\ninclude::aerospace-macos-native-minimize.adoc[tags=purpose]\ninclude::aerospace-macos-native-minimize.adoc[tags=body]\n\n== mode\n----\ninclude::aerospace-mode.adoc[tags=synopsis]\n----\ninclude::aerospace-mode.adoc[tags=purpose]\ninclude::aerospace-mode.adoc[tags=body]\n\n[#move]\n== move\n----\ninclude::aerospace-move.adoc[tags=synopsis]\n----\ninclude::aerospace-move.adoc[tags=purpose]\ninclude::aerospace-move.adoc[tags=body]\n\n== move-mouse\n----\ninclude::./aerospace-move-mouse.adoc[tags=synopsis]\n----\ninclude::./aerospace-move-mouse.adoc[tags=purpose]\ninclude::./aerospace-move-mouse.adoc[tags=body]\n\n== move-node-to-monitor\n----\ninclude::aerospace-move-node-to-monitor.adoc[tags=synopsis]\n----\ninclude::aerospace-move-node-to-monitor.adoc[tags=purpose]\ninclude::aerospace-move-node-to-monitor.adoc[tags=body]\n\n== move-node-to-workspace\n----\ninclude::aerospace-move-node-to-workspace.adoc[tags=synopsis]\n----\ninclude::aerospace-move-node-to-workspace.adoc[tags=purpose]\ninclude::aerospace-move-node-to-workspace.adoc[tags=body]\n\n== move-workspace-to-monitor\n----\ninclude::aerospace-move-workspace-to-monitor.adoc[tags=synopsis]\n----\ninclude::aerospace-move-workspace-to-monitor.adoc[tags=purpose]\ninclude::aerospace-move-workspace-to-monitor.adoc[tags=body]\n\n== reload-config\n----\ninclude::aerospace-reload-config.adoc[tags=synopsis]\n----\ninclude::aerospace-reload-config.adoc[tags=purpose]\ninclude::aerospace-reload-config.adoc[tags=body]\n\n== resize\n----\ninclude::aerospace-resize.adoc[tags=synopsis]\n----\ninclude::aerospace-resize.adoc[tags=purpose]\ninclude::aerospace-resize.adoc[tags=body]\n\n== split\n----\ninclude::aerospace-split.adoc[tags=synopsis]\n----\ninclude::aerospace-split.adoc[tags=purpose]\ninclude::aerospace-split.adoc[tags=body]\n\n== swap\n----\ninclude::aerospace-swap.adoc[tags=synopsis]\n----\ninclude::aerospace-swap.adoc[tags=purpose]\ninclude::aerospace-swap.adoc[tags=body]\n\n== summon-workspace\n----\ninclude::./aerospace-summon-workspace.adoc[tags=synopsis]\n----\ninclude::./aerospace-summon-workspace.adoc[tags=purpose]\ninclude::./aerospace-summon-workspace.adoc[tags=body]\n\n== trigger-binding\n----\ninclude::aerospace-trigger-binding.adoc[tags=synopsis]\n----\ninclude::aerospace-trigger-binding.adoc[tags=purpose]\ninclude::aerospace-trigger-binding.adoc[tags=body]\n\n== volume\n----\ninclude::./aerospace-volume.adoc[tags=synopsis]\n----\ninclude::./aerospace-volume.adoc[tags=purpose]\ninclude::./aerospace-volume.adoc[tags=body]\n\n== workspace\n----\ninclude::aerospace-workspace.adoc[tags=synopsis]\n----\ninclude::aerospace-workspace.adoc[tags=purpose]\ninclude::aerospace-workspace.adoc[tags=body]\n\n== workspace-back-and-forth\n----\ninclude::aerospace-workspace-back-and-forth.adoc[tags=synopsis]\n----\ninclude::aerospace-workspace-back-and-forth.adoc[tags=purpose]\ninclude::aerospace-workspace-back-and-forth.adoc[tags=body]\n\n== Query commands\n\nQuery commands are commands that do not change the state but rather allow the examination of the current state.\n\n- Query commands are *NOT* available in config +\n(because there is no way to consume the stdout of these commands in config)\n- Query commands are only available in CLI\n\n=== config\n----\ninclude::aerospace-config.adoc[tags=synopsis]\n----\ninclude::aerospace-config.adoc[tags=purpose]\ninclude::aerospace-config.adoc[tags=body]\n\n=== debug-windows\n----\ninclude::aerospace-debug-windows.adoc[tags=synopsis]\n----\ninclude::aerospace-debug-windows.adoc[tags=purpose]\ninclude::aerospace-debug-windows.adoc[tags=body]\n\n=== list-apps\n----\ninclude::aerospace-list-apps.adoc[tags=synopsis]\n----\ninclude::aerospace-list-apps.adoc[tags=purpose]\ninclude::aerospace-list-apps.adoc[tags=body]\n\n=== list-exec-env-vars\n----\ninclude::aerospace-list-exec-env-vars.adoc[tags=synopsis]\n----\ninclude::aerospace-list-exec-env-vars.adoc[tags=purpose]\ninclude::aerospace-list-exec-env-vars.adoc[tags=body]\n\n=== list-modes\n----\ninclude::aerospace-list-modes.adoc[tags=synopsis]\n----\ninclude::aerospace-list-modes.adoc[tags=purpose]\ninclude::aerospace-list-modes.adoc[tags=body]\n\n=== list-monitors\n----\ninclude::aerospace-list-monitors.adoc[tags=synopsis]\n----\ninclude::aerospace-list-monitors.adoc[tags=purpose]\ninclude::aerospace-list-monitors.adoc[tags=body]\n\n=== list-windows\n----\ninclude::aerospace-list-windows.adoc[tags=synopsis]\n----\ninclude::aerospace-list-windows.adoc[tags=purpose]\ninclude::aerospace-list-windows.adoc[tags=body]\n\n=== list-workspaces\n----\ninclude::aerospace-list-workspaces.adoc[tags=synopsis]\n----\ninclude::aerospace-list-workspaces.adoc[tags=purpose]\ninclude::aerospace-list-workspaces.adoc[tags=body]\n\n=== subscribe\n----\ninclude::aerospace-subscribe.adoc[tags=synopsis]\n----\ninclude::aerospace-subscribe.adoc[tags=purpose]\ninclude::aerospace-subscribe.adoc[tags=body]\n"
  },
  {
    "path": "docs/config-examples/default-config.toml",
    "content": "# Place a copy of this config to ~/.aerospace.toml\n# After that, you can edit ~/.aerospace.toml to your liking\n\n# Config version for compatibility and deprecations\n# Fallback value (if you omit the key): config-version = 1\nconfig-version = 2\n\n# You can use it to add commands that run after AeroSpace startup.\n# Available commands : https://nikitabobko.github.io/AeroSpace/commands\nafter-startup-command = []\n\n# Start AeroSpace at login\nstart-at-login = false\n\n# Automatically reload the config when the config file is saved\n# After setting this to true, reload once manually to start the auto-reloading\nauto-reload-config = false\n\n# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization\nenable-normalization-flatten-containers = true\nenable-normalization-opposite-orientation-for-nested-containers = true\n\n# See: https://nikitabobko.github.io/AeroSpace/guide#layouts\n# The 'accordion-padding' specifies the size of accordion padding\n# You can set 0 to disable the padding feature\naccordion-padding = 30\n\n# Possible values: tiles|accordion\ndefault-root-container-layout = 'tiles'\n\n# Possible values: horizontal|vertical|auto\n# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation,\n#               tall monitor (anything higher than wide) gets vertical orientation\ndefault-root-container-orientation = 'auto'\n\n# Mouse follows focus when focused monitor changes\n# Drop it from your config, if you don't like this behavior\n# See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks\n# See https://nikitabobko.github.io/AeroSpace/commands#move-mouse\n# Fallback value (if you omit the key): on-focused-monitor-changed = []\non-focused-monitor-changed = ['move-mouse monitor-lazy-center']\n\n# You can effectively turn off macOS \"Hide application\" (cmd-h) feature by toggling this flag\n# Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key\n# Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app\nautomatically-unhide-macos-hidden-apps = false\n\n# List of workspaces that should stay alive even when they contain no windows,\n# even when they are invisible.\n# This config option is only available since 'config-version = 2'\n# Fallback value (if you omit the key): persistent-workspaces = []\npersistent-workspaces = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"A\", \"B\",\n                         \"C\", \"D\", \"E\", \"F\", \"G\", \"I\", \"M\", \"N\", \"O\", \"P\", \"Q\",\n                         \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"]\n\n# A callback that runs every time binding mode changes\n# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes\n# See: https://nikitabobko.github.io/AeroSpace/commands#mode\non-mode-changed = []\n\n# Possible values: (qwerty|dvorak|colemak)\n# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping\n[key-mapping]\n    preset = 'qwerty'\n\n# Gaps between windows (inner-*) and between monitor edges (outer-*).\n# Possible values:\n# - Constant:     gaps.outer.top = 8\n# - Per monitor:  gaps.outer.top = [{ monitor.main = 16 }, { monitor.\"some-pattern\" = 32 }, 24]\n#                 In this example, 24 is a default value when there is no match.\n#                 Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'.\n#                 See:\n#                 https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors\n[gaps]\n    inner.horizontal = 0\n    inner.vertical =   0\n    outer.left =       0\n    outer.bottom =     0\n    outer.top =        0\n    outer.right =      0\n\n# 'main' binding mode declaration\n# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes\n# 'main' binding mode must be always presented\n# Fallback value (if you omit the key): mode.main.binding = {}\n[mode.main.binding]\n\n    # All possible keys:\n    # - Letters.        a, b, c, ..., z\n    # - Numbers.        0, 1, 2, ..., 9\n    # - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9\n    # - F-keys.         f1, f2, ..., f20\n    # - Special keys.   minus, equal, period, comma, slash, backslash, quote, semicolon,\n    #                   backtick, leftSquareBracket, rightSquareBracket, space, enter, esc,\n    #                   backspace, tab, pageUp, pageDown, home, end, forwardDelete,\n    #                   sectionSign (ISO keyboards only, european keyboards only)\n    # - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual,\n    #                   keypadMinus, keypadMultiply, keypadPlus\n    # - Arrows.         left, down, up, right\n\n    # All possible modifiers: cmd, alt, ctrl, shift\n\n    # All possible commands: https://nikitabobko.github.io/AeroSpace/commands\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget\n    # You can uncomment the following lines to open up terminal with alt + enter shortcut\n    # (like in i3)\n    # alt-enter = '''exec-and-forget osascript -e '\n    # tell application \"Terminal\"\n    #     do script\n    #     activate\n    # end tell'\n    # '''\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#layout\n    alt-slash = 'layout tiles horizontal vertical'\n    alt-comma = 'layout accordion horizontal vertical'\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#focus\n    alt-h = 'focus left'\n    alt-j = 'focus down'\n    alt-k = 'focus up'\n    alt-l = 'focus right'\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#move\n    alt-shift-h = 'move left'\n    alt-shift-j = 'move down'\n    alt-shift-k = 'move up'\n    alt-shift-l = 'move right'\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#resize\n    alt-minus = 'resize smart -50'\n    alt-equal = 'resize smart +50'\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#workspace\n    alt-1 = 'workspace 1'\n    alt-2 = 'workspace 2'\n    alt-3 = 'workspace 3'\n    alt-4 = 'workspace 4'\n    alt-5 = 'workspace 5'\n    alt-6 = 'workspace 6'\n    alt-7 = 'workspace 7'\n    alt-8 = 'workspace 8'\n    alt-9 = 'workspace 9'\n    alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need\n    alt-b = 'workspace B'\n    alt-c = 'workspace C'\n    alt-d = 'workspace D'\n    alt-e = 'workspace E'\n    alt-f = 'workspace F'\n    alt-g = 'workspace G'\n    alt-i = 'workspace I'\n    alt-m = 'workspace M'\n    alt-n = 'workspace N'\n    alt-o = 'workspace O'\n    alt-p = 'workspace P'\n    alt-q = 'workspace Q'\n    alt-r = 'workspace R'\n    alt-s = 'workspace S'\n    alt-t = 'workspace T'\n    alt-u = 'workspace U'\n    alt-v = 'workspace V'\n    alt-w = 'workspace W'\n    alt-x = 'workspace X'\n    alt-y = 'workspace Y'\n    alt-z = 'workspace Z'\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace\n    alt-shift-1 = 'move-node-to-workspace 1'\n    alt-shift-2 = 'move-node-to-workspace 2'\n    alt-shift-3 = 'move-node-to-workspace 3'\n    alt-shift-4 = 'move-node-to-workspace 4'\n    alt-shift-5 = 'move-node-to-workspace 5'\n    alt-shift-6 = 'move-node-to-workspace 6'\n    alt-shift-7 = 'move-node-to-workspace 7'\n    alt-shift-8 = 'move-node-to-workspace 8'\n    alt-shift-9 = 'move-node-to-workspace 9'\n    alt-shift-a = 'move-node-to-workspace A'\n    alt-shift-b = 'move-node-to-workspace B'\n    alt-shift-c = 'move-node-to-workspace C'\n    alt-shift-d = 'move-node-to-workspace D'\n    alt-shift-e = 'move-node-to-workspace E'\n    alt-shift-f = 'move-node-to-workspace F'\n    alt-shift-g = 'move-node-to-workspace G'\n    alt-shift-i = 'move-node-to-workspace I'\n    alt-shift-m = 'move-node-to-workspace M'\n    alt-shift-n = 'move-node-to-workspace N'\n    alt-shift-o = 'move-node-to-workspace O'\n    alt-shift-p = 'move-node-to-workspace P'\n    alt-shift-q = 'move-node-to-workspace Q'\n    alt-shift-r = 'move-node-to-workspace R'\n    alt-shift-s = 'move-node-to-workspace S'\n    alt-shift-t = 'move-node-to-workspace T'\n    alt-shift-u = 'move-node-to-workspace U'\n    alt-shift-v = 'move-node-to-workspace V'\n    alt-shift-w = 'move-node-to-workspace W'\n    alt-shift-x = 'move-node-to-workspace X'\n    alt-shift-y = 'move-node-to-workspace Y'\n    alt-shift-z = 'move-node-to-workspace Z'\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth\n    alt-tab = 'workspace-back-and-forth'\n    # See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor\n    alt-shift-tab = 'move-workspace-to-monitor --wrap-around next'\n\n    # See: https://nikitabobko.github.io/AeroSpace/commands#mode\n    alt-shift-semicolon = 'mode service'\n\n# 'service' binding mode declaration.\n# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes\n[mode.service.binding]\n    esc = ['reload-config', 'mode main']\n    r = ['flatten-workspace-tree', 'mode main'] # reset layout\n    f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout\n    backspace = ['close-all-windows-but-current', 'mode main']\n\n    # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2\n    #s = ['layout sticky tiling', 'mode main']\n\n    alt-shift-h = ['join-with left', 'mode main']\n    alt-shift-j = ['join-with down', 'mode main']\n    alt-shift-k = ['join-with up', 'mode main']\n    alt-shift-l = ['join-with right', 'mode main']\n"
  },
  {
    "path": "docs/config-examples/i3-like-config-example.toml",
    "content": "# Reference: https://github.com/i3/i3/blob/next/etc/config\n\nconfig-version = 2\n\n# In i3, all workspaces are phantom\npersistent-workspaces = []\n\n# i3 doesn't have \"normalizations\" feature that why we disable them here.\n# But the feature is very helpful.\n# Normalizations eliminate all sorts of weird tree configurations that don't make sense.\n# Give normalizations a chance and enable them back.\nenable-normalization-flatten-containers = false\nenable-normalization-opposite-orientation-for-nested-containers = false\n\n# Mouse follows focus when focused monitor changes\non-focused-monitor-changed = ['move-mouse monitor-lazy-center']\n\n[mode.main.binding]\n    # See: https://nikitabobko.github.io/AeroSpace/goodies#open-a-new-window-with-applescript\n    alt-enter = '''exec-and-forget osascript -e '\n    tell application \"Terminal\"\n        do script\n        activate\n    end tell'\n    '''\n\n    # i3 wraps focus by default\n    alt-j =         'focus --boundaries-action wrap-around-the-workspace left'\n    alt-k =         'focus --boundaries-action wrap-around-the-workspace down'\n    alt-l =         'focus --boundaries-action wrap-around-the-workspace up'\n    alt-semicolon = 'focus --boundaries-action wrap-around-the-workspace right'\n\n    alt-shift-j = 'move left'\n    alt-shift-k = 'move down'\n    alt-shift-l = 'move up'\n    alt-shift-semicolon = 'move right'\n\n    # Consider using 'join-with' command as a 'split' replacement if you want to enable\n    # normalizations\n    alt-h = 'split horizontal'\n    alt-v = 'split vertical'\n\n    alt-f = 'fullscreen'\n\n    alt-s = 'layout v_accordion' # 'layout stacking' in i3\n    alt-w = 'layout h_accordion' # 'layout tabbed' in i3\n    alt-e = 'layout tiles horizontal vertical' # 'layout toggle split' in i3\n\n    alt-shift-space = 'layout floating tiling' # 'floating toggle' in i3\n\n    # Not supported, because this command is redundant in AeroSpace mental model.\n    # See: https://nikitabobko.github.io/AeroSpace/guide#floating-windows\n    #alt-space = 'focus toggle_tiling_floating'\n\n    # `focus parent`/`focus child` are not yet supported, and it's not clear whether they\n    # should be supported at all https://github.com/nikitabobko/AeroSpace/issues/5\n    # alt-a = 'focus parent'\n\n    alt-1 = 'workspace 1'\n    alt-2 = 'workspace 2'\n    alt-3 = 'workspace 3'\n    alt-4 = 'workspace 4'\n    alt-5 = 'workspace 5'\n    alt-6 = 'workspace 6'\n    alt-7 = 'workspace 7'\n    alt-8 = 'workspace 8'\n    alt-9 = 'workspace 9'\n    alt-0 = 'workspace 10'\n\n    alt-shift-1 = 'move-node-to-workspace 1'\n    alt-shift-2 = 'move-node-to-workspace 2'\n    alt-shift-3 = 'move-node-to-workspace 3'\n    alt-shift-4 = 'move-node-to-workspace 4'\n    alt-shift-5 = 'move-node-to-workspace 5'\n    alt-shift-6 = 'move-node-to-workspace 6'\n    alt-shift-7 = 'move-node-to-workspace 7'\n    alt-shift-8 = 'move-node-to-workspace 8'\n    alt-shift-9 = 'move-node-to-workspace 9'\n    alt-shift-0 = 'move-node-to-workspace 10'\n\n    alt-shift-c = 'reload-config'\n\n    alt-r = 'mode resize'\n\n[mode.resize.binding]\n    h = 'resize width -50'\n    j = 'resize height +50'\n    k = 'resize height -50'\n    l = 'resize width +50'\n    enter = 'mode main'\n    esc = 'mode main'\n"
  },
  {
    "path": "docs/goodies.adoc",
    "content": "= AeroSpace Goodies\ninclude::util/site-attributes.adoc[]\n\ninclude::util/header.adoc[]\n\nDo you have a cool automatization, AeroSpace integration, or workflow?\nFeel free to open an issue or pull request to add it to this list!\nThe source code of the page can be found in the `./docs` directory.\n\n[#move-by-dragging-any-part-of-the-window]\n== Move windows by dragging any part of the window\n\n[source,bash]\n----\ndefaults write -g NSWindowShouldDragOnGesture -bool true\n----\n\nNow, you can move windows by holding `ctrl + cmd` and dragging any part of the window (not necessarily the window title)\n\n[#non-native-fullscreen-in-firefox]\n== Non-native fullscreen in Firefox\n\nChange the following settings in `about:config`:\n\n----\n// Disable macOS native fullscreen in Firefox\nfull-screen-api.macos-native-full-screen = false\n\n// Disable fullscreen transition animations\nfull-screen-api.transition-duration.enter = 0 0\nfull-screen-api.transition-duration.leave = 0 0\n----\n\n`full-screen-api.ignore-widgets` is also an interesting config knob that might be of your preference.\n\n[#highlight-focused-windows-with-colored-borders]\n== Highlight focused windows with colored borders\n\nTo highlight the focused window with colored border you can use link:https://github.com/FelixKratz/JankyBorders[JankyBorders].\n\nYou can also use `after-startup-command` to start JankyBorders together with AeroSpace\n\n[source,toml]\n----\nafter-startup-command = [\n    # JankyBorders has a built-in detection of already running process,\n    # so it won't be run twice on AeroSpace restart\n    'exec-and-forget borders active_color=0xffe1e3e4 inactive_color=0xff494d64 width=5.0'\n]\n----\n\n[#raycast-extension]\n== AeroSpace Raycast extension\n\nThere is a third party Raycast extension for AeroSpace. https://www.raycast.com/limonkufu/aerospace\n\nIf you struggle remembering shortcuts, it's useful to search for commands until they become muscle memory.\n\n[#disable-open-animations]\n== Disable windows opening animations\n\nObservable in Google Chrome\n\n[source,bash]\n----\ndefaults write -g NSAutomaticWindowAnimationsEnabled -bool false\n----\n\n[#use-trackpad-gestures-to-switch-workspaces]\n== Use trackpad gestures to switch workspaces\n\nThe following commands focus next or previous workspaces on monitors where the mouse is located\n\n[source,bash]\n----\naerospace workspace \"$(aerospace list-workspaces --monitor mouse --visible)\" && aerospace workspace next\n\naerospace workspace \"$(aerospace list-workspaces --monitor mouse --visible)\" && aerospace workspace prev\n----\n\nUse the software of your choice to assign trackpad gestures to the respective commands.\nHere are a few third party options in alphabetical order:\n\n* https://github.com/acsandmann/aerospace-swipe\n* link:https://folivora.ai/[BetterTouchTool] can assign arbitrary commands to trackpad gestures.\nBeware that you might need to specify full path to aerospace executable https://community.folivora.ai/t/how-to-execute-terminal-command-to-switch-workspaces-with-aerospace/35914\n* https://github.com/MediosZ/SwipeAeroSpace\n\nCAUTION: Make sure that you trust project authors before running the distributed binaries.\nAlternatively, inspect the source code, and build it yourself.\n\n[#show-aerospace-workspaces-in-sketchybar]\n== Show AeroSpace workspaces in Sketchybar\n\nYou can integrate AeroSpace workspace indicators with link:https://github.com/FelixKratz/SketchyBar[Sketchybar].\nUse these snippets as a starting point.\n\n.~/.aerospace.toml\n[source,toml]\n----\n# Run Sketchybar together with AeroSpace\n# sketchybar has a built-in detection of already running process,\n# so it won't be run twice on AeroSpace restart\nafter-startup-command = ['exec-and-forget sketchybar']\n\n# Notify Sketchybar about workspace change\nexec-on-workspace-change = ['/bin/bash', '-c',\n    'sketchybar --trigger aerospace_workspace_change FOCUSED_WORKSPACE=$AEROSPACE_FOCUSED_WORKSPACE'\n]\n----\n\n.~/.config/sketchybar/sketchybarrc\n[source,bash]\n----\nsketchybar --add event aerospace_workspace_change\n\nfor sid in $(aerospace list-workspaces --all); do\n    sketchybar --add item space.$sid left \\\n        --subscribe space.$sid aerospace_workspace_change \\\n        --set space.$sid \\\n        background.color=0x44ffffff \\\n        background.corner_radius=5 \\\n        background.height=20 \\\n        background.drawing=off \\\n        label=\"$sid\" \\\n        click_script=\"aerospace workspace $sid\" \\\n        script=\"$CONFIG_DIR/plugins/aerospace.sh $sid\"\ndone\n----\n\n.~/.config/sketchybar/plugins/aerospace.sh\n[source,bash]\n----\n#!/usr/bin/env bash\n\n# make sure it's executable with:\n# chmod +x ~/.config/sketchybar/plugins/aerospace.sh\n\nif [ \"$1\" = \"$FOCUSED_WORKSPACE\" ]; then\n    sketchybar --set $NAME background.drawing=on\nelse\n    sketchybar --set $NAME background.drawing=off\nfi\n----\n\n[#show-aerospace-workspaces-in-simple-bar]\n== Show AeroSpace workspaces in simple-bar\n\nlink:https://github.com/Jean-Tinland/simple-bar[simple-bar] can be used to display AeroSpace workspaces.\n\nIn order to sync simple-bar with AeroSpace, add these lines to your AeroSpace config file:\n\n.~/.aerospace.toml\n[source,toml]\n----\n# Notify simple-bar about window focus change\non-focus-changed = [\n  \"exec-and-forget osascript -e 'tell application id \\\"tracesOf.Uebersicht\\\" to refresh widget id \\\"simple-bar-index-jsx\\\"'\",\n]\n\n# Notify simple-bar about workspace change\nexec-on-workspace-change = [\n  '/bin/zsh',\n  '-c',\n  '/usr/bin/osascript -e \"tell application id \\\"tracesOf.Uebersicht\\\" to refresh widget id \\\"simple-bar-index-jsx\\\"\"',\n]\n----\n\n[#open-a-new-window-with-applescript]\n== Open a new window with AppleScript\n\nInvoking Safari/Terminal with a command the obvious way (`exec-and-forget open -a Safari`) results in an outcome that is probably not the intended one.\nNamely, that any workspace already containing an instance of Safari/Terminal is brought in focus.\n\nOpening *a new window* of a program that can support multiple windows (such as Safari or Terminal.app) can be accomplished with an AppleScript inlined in `aerospace.toml` as follows:\n\n- Safari\n+\n[source,toml]\n----\nctrl-g = '''exec-and-forget osascript -e '\ntell application \"Safari\"\n    make new document at end of documents\n    activate\nend tell'\n'''\n----\n- Terminal\n+\n[source,toml]\n----\nctrl-g = '''exec-and-forget osascript -e '\ntell application \"Terminal\"\n    do script\n    activate\nend tell'\n'''\n----\n\n[#disable-hide-app]\n== Disable annoying and useless \"hide application\" shortcut\n\nIf `automatically-unhide-macos-hidden-apps` isn't enough, you can disable `cmd-h` altogether (which will make this hotkey unavailable for apps that might use it for other purposes)\n\n.~/.aerospace.toml\n[source,toml]\n----\n[mode.main.binding]\n    cmd-h = [] # Disable \"hide application\"\n    cmd-alt-h = [] # Disable \"hide others\"\n----\n\n[#screenshoot-shortcut]\n== Take screenshots to clipboard using keyboard shortcut\n\nYou can configure a custom shortcut to take a screenshot.\n`screencapture` is a built-in macOS command.\n\n.~/.aerospace.toml\n[source,toml]\n----\nalt-shift-s = 'exec-and-forget screencapture -i -c'\n----\n\n[#i3-like-config]\n== i3 like config\n\nlink:config-examples/i3-like-config-example.toml[Download i3-like-config.toml]\n\n[source,toml,subs=\"macros+,specialchars+\"]\n----\ninclude::config-examples/i3-like-config-example.toml[]\n----\n\n[#spacelist]\n== Spacelist\n\nlink:https://github.com/magicmark/spacelist[Spacelist] is a terminal UI application that provides a searchable interface to view all open windows organized by workspace. You can hit enter on a selected application to switch to that workspace.\n\n[#popular-apps-ids]\n== List of Apple application IDs\n\nThe list is useful to compose custom xref:guide.adoc#on-window-detected-callback[on-window-detected callback].\n\n[cols=\"1,3\"]\n|===\n|Application name|Application ID\n\n|Activity Monitor|`com.apple.ActivityMonitor`\n|AirPort Utility|`com.apple.airport.airportutility`\n|App Store|`com.apple.AppStore`\n|Audio MIDI Setup|`com.apple.audio.AudioMIDISetup`\n|Automator|`com.apple.Automator`\n|Books|`com.apple.iBooksX`\n|Calculator|`com.apple.calculator`\n|Calendar|`com.apple.iCal`\n|Chess|`com.apple.Chess`\n|Clock|`com.apple.clock`\n|ColorSync Utility|`com.apple.ColorSyncUtility`\n|Console|`com.apple.Console`\n|Contacts|`com.apple.AddressBook`\n|Dictionary|`com.apple.Dictionary`\n|Disk Utility|`com.apple.DiskUtility`\n|FaceTime|`com.apple.FaceTime`\n|Find My|`com.apple.findmy`\n|Finder|`com.apple.finder`\n|Freeform|`com.apple.freeform`\n|Grapher|`com.apple.grapher`\n|Home|`com.apple.Home`\n|iMovie|`com.apple.iMovieApp`\n|Keychain Access|`com.apple.keychainaccess`\n|Keynote|`com.apple.iWork.Keynote`\n|Mail|`com.apple.mail`\n|Maps|`com.apple.Maps`\n|Messages|`com.apple.MobileSMS`\n|Music|`com.apple.Music`\n|Notes|`com.apple.Notes`\n|Pages|`com.apple.iWork.Pages`\n|Photo Booth|`com.apple.PhotoBooth`\n|Photos|`com.apple.Photos`\n|Podcasts|`com.apple.podcasts`\n|Preview|`com.apple.Preview`\n|QuickTime Player|`com.apple.QuickTimePlayerX`\n|Reminders|`com.apple.reminders`\n|Safari|`com.apple.Safari`\n|Shortcuts|`com.apple.shortcuts`\n|Stocks|`com.apple.stocks`\n|System Settings|`com.apple.systempreferences`\n|Terminal|`com.apple.Terminal`\n|TextEdit|`com.apple.TextEdit`\n|Time Machine|`com.apple.backup.launcher`\n|TV|`com.apple.TV`\n|VoiceMemos|`com.apple.VoiceMemos`\n|VoiceOver Utility|`com.apple.VoiceOverUtility`\n|Weather|`com.apple.weather`\n|Xcode|`com.apple.dt.Xcode`\n\n|===\n"
  },
  {
    "path": "docs/guide.adoc",
    "content": "= AeroSpace Guide\ninclude::util/site-attributes.adoc[]\n:url-search-for-config: https://github.com/search?q=path%3A*aerospace.toml&type=code\n\ninclude::util/header.adoc[]\n\nThis Guide is designed to be read from top to bottom as a whole.\nYou can skip parts that are obvious.\n\n[#installation]\n== Installation\n\n[#homebrew-installation]\n=== Homebrew installation (Preferred)\n\nhttps://brew.sh/[Homebrew] is a package manager for macOS\n\n[source,bash]\n----\nbrew install --cask nikitabobko/tap/aerospace\n----\n\n*(Optional)* You might need to configure your shell to enable completion provided by homebrew packages: https://docs.brew.sh/Shell-Completion\nAeroSpace provides bash, fish and zsh completions.\n\nYou can also install specific previous https://github.com/nikitabobko/homebrew-tap/tree/main/Casks[pinned homebrew Casks versions]:\n[source,bash]\n----\nbrew install --cask nikitabobko/tap/aerospace@0.12.0\n----\n\n[#manual-installation]\n=== Manual installation\n\n. Download the latest available zip from https://github.com/nikitabobko/AeroSpace/releases[releases page]\n. Unpack zip\n. Put unpacked `AeroSpace-v$VERSION/AeroSpace.app` to `/Applications`\n. Put unpacked `AeroSpace-v$VERSION/bin/aerospace` anywhere to `$PATH`\n(The step is optional. It is only needed if you want to be able to interact with AeroSpace from CLI)\n\nIf you see this message\n\n----\n\"AeroSpace.app\" can't be opened because Apple cannot check it for malicious software.\n----\n\n**Option 1** to resolve the problem\n\n```\nxattr -d com.apple.quarantine /Applications/AeroSpace.app\n```\n\n**Option 2** to resolve the problem\n\n. navigate in Finder to `/Applications/AeroSpace.app`\n. Right mouse click\n. Open (yes, it's that stupid)\n\n[#configuring-aerospace]\n== Configuring AeroSpace\n\n[#config-location]\n=== Custom config location\n\nAeroSpace tries to find the custom config in two locations:\n\n. `~/.aerospace.toml`\n. `+${XDG_CONFIG_HOME}/aerospace/aerospace.toml+`\n(environment variable `XDG_CONFIG_HOME` fallbacks to `~/.config` if the variable is not presented)\n\nIf the config is found in more than one location then the ambiguity is reported.\n\n=== Config samples\n\nPlease see the following config samples:\n\n* <<default-config,The default config>>\n* xref:./goodies.adoc#i3-like-config[i3 like config]\n* {url-search-for-config}[Search for configs by other users on GitHub] for inspiration\n\nAeroSpace uses TOML format for the config.\nTOML is easy to read, and it supports comments.\nSee https://toml.io/en/v1.0.0[TOML spec for more info]\n\n[#default-config]\n=== Default config\n\nThe default config is part of the documentation, it contains all trivial configuration keys with comments.\nPlease read the default config!\nNon-trivial configuration options are mentioned further in this guide.\nIf no custom config is found, AeroSpace will load the default config.\n\nIf the key is omitted in the custom config, it falls back to the value in the default config, unless it's stated otherwise for the specific keys. Namely:\n\n* `mode.*.binding`. It falls back to the empty TOML table. Your config is the source of truth for keyboard bindings. You must explicitly mention all the keyboard bindings and <<binding-modes,binding modes>> in your config.\n* `on-focused-monitor-changed`. It falls back to the empty TOML array.\n* `exec` TOML table. See: <<exec-env-vars>> (It's so boring and verbose, I don't even want to mention it in the `default-config.toml`)\n\nRule of thumb: all the \"scalar like\" values always fall back to the default config. All the \"vector like\" values fall back to the empty TOML array or table.\n\nThat allows you to keep your config tidy and clean from trivial config keys for which you like the default values.\nYou can bootstrap your custom config by copying the default config from the app installation -\n\n[source,shell]\n----\ncp /Applications/AeroSpace.app/Contents/Resources/default-config.toml ~/.aerospace.toml\n----\n\nlink:config-examples/default-config.toml[Download default-config.toml]\n\n[source,toml,subs=\"macros+,specialchars+\"]\n----\ninclude::config-examples/default-config.toml[]\n----\n\n[#binding-modes]\n=== Binding modes\n\nYou can create multiple sets of bindings by creating different binding modes.\nWhen you switch to a different binding mode, all the bindings from the current mode are deactivated, and only the bindings specified in the new mode become active.\nThe initial binding mode that AeroSpace starts out with is \"main\".\n\nThis feature is absolutely identical to the one\nhttps://i3wm.org/docs/userguide.html#binding_modes[in i3]\n\nWorking with binding modes consists of two parts:\n1. defining a binding to switch to the binding mode and 2. declaring the binding mode itself.\n\n[source,toml]\n----\n[mode.main.binding]            # Declare 'main' binding mode\n    alt-r = 'mode resize'      # 1. Define a binding to switch to 'resize' mode\n\n[mode.resize.binding]          # 2. Declare 'resize' binding mode\n    minus = 'resize smart -50'\n    equal = 'resize smart +50'\n----\n\n[#commands]\n=== Commands\n\nCommands are the thing you use to manipulate AeroSpace and query its state.\n\nThere are two ways on how you can use commands:\n\n. Bind keys to run AeroSpace commands. Example:\n+\n[source,toml]\n----\n[mode.main.binding]\n    # Bind alt-1 key to switch to workspace 1\n    alt-1 = 'workspace 1'\n    # Or bind a sequence of commands\n    alt-shift-1 = ['move-node-to-workspace 1', 'workspace 1']\n----\n. Run commands in CLI. Open up a Terminal.app and type:\n+\n[source,bash]\n----\naerospace workspace 1\n----\n\nFor the list of available commands see: xref:commands.adoc[]\n\n[#key-mapping]\n=== Keyboard layouts and key mapping\n\nBy default, key bindings in the config are perceived as `qwerty` layout.\n\nIf you use different layout, different alphabet, or you just want to have a fancy alias for the existing key, you can use `key-mapping.key-notation-to-key-code`.\n\n[source,toml]\n----\n# Define my fancy unicorn key notation\n[key-mapping.key-notation-to-key-code]\n    unicorn = 'u'\n\n[mode.main.binding]\n    alt-unicorn = 'workspace wonderland' # (⁀ᗢ⁀)\n----\n\n* For `dvorak` and `colemak` users, AeroSpace offers preconfigured presets.\n+\n[source,toml]\n----\n[key-mapping]\n    preset = 'dvorak'  # or 'colemak'\n----\n\n[#exec-env-vars]\n=== exec-* Environment Variables\n\nYou can configure environment variables of `exec-*` commands and callbacks (such as xref:commands.adoc#exec-and-forget[exec-and-forget], <<exec-on-workspace-change-callback>>)\n\n* `exec.inherit-env-vars = true` configures whether inherit environment variables of `AeroSpace.app` or not. (The default is `true`)\n* You can override env variables with the following syntax:\n+\n[source,toml]\n----\n[exec.env-vars]\n    PATH = '${HOME}/bin:${PATH}'\n----\n+\nEnvironment variable substitution is supported in form of `+${ENV_VAR}+`\n* You can inspect what is the end result of environment variables using xref:commands.adoc#list-exec-env-vars[`list-exec-env-vars` command]\n* GUI apps on macOS don’t have Homebrew’s prefix in their `PATH` by default (https://docs.brew.sh/FAQ#my-mac-apps-dont-find-homebrew-utilities[docs.brew.sh]).\nThat's why unless you override `exec` section in your config, AeroSpace falls back to the following `exec` configuration:\n+\n[source,toml]\n----\n[exec]\n    inherit-env-vars = true\n[exec.env-vars]\n    PATH = '/opt/homebrew/bin:/opt/homebrew/sbin:${PATH}'\n----\n\n[#tree]\n== Tree\n\nAeroSpace stores all windows and containers in a tree.\nAeroSpace tree tiling model is https://i3wm.org/docs/userguide.html#tree[inspired by i3].\n\n*Definition.* Each non-leaf node is called a \"Container\"\n\nWARNING: i3 has a different terminology.\n\"container\" in i3 is the same as \"node\" in AeroSpace.\n\n* Each workspace contains its own single root node\n* Each container can contain arbitrary number of children nodes\n* Windows are the only possible leaf nodes. Windows contain zero children nodes\n* Every container has two properties:\n. <<layouts,Layout>> (Possible values: `tiles`, `accordion`)\n. Orientation (Possible values: `horizontal`, `vertical`)\n\nWhen we say \"layout of the window\", we refer to the layout of the window’s parent container.\n\nIt’s easier to understand tree tiling model by looking at examples\n\n.Simple tree structure. Two windows side-by-side\nimage::assets/h_tiles.png[]\n\n.Complex tree structure\nimage::assets/tree.png[]\n\nYou can nest containers as deeply as you want to.\n\nYou can navigate in the tree in 4 possible cardinal directions (left, down, up, right).\nYou use xref:commands.adoc#focus[focus command] to do that.\n\nThe tree structure can be changed with three commands:\n\n. xref:commands.adoc#move[move]\n. xref:commands.adoc#join-with[join-with]\n. xref:commands.adoc#split[split] (it's for compatibility with i3. Please prefer `join-with` over `split`)\n\n[#layouts]\n=== Layouts\n\nIn total, AeroSpace provides 4 possible layouts:\n\n- `h_tiles` horizontal tiles (in i3, it’s called \"horizontal split\")\n- `v_tiles` vertical tiles (in i3, it’s called \"vertical split\")\n- `h_accordion` horizontal accordion (analog of i3’s \"tabbed layout\")\n- `v_accordion` vertical accordion (analog of i3’s \"stacked layout\")\n\n<<tree,From the previous section>>, you’re already familiar with the `tiles` layout.\n\nAccordion is a layout where windows are placed on top of each other.\n\n* *The horizontal accordion* shows left and right paddings to visually indicate the presence of other windows in those directions.\n* *The vertical accordion* shows top and bottom paddings to visually indicate the presence of other windows in those directions.\n\n.Horizontal accordion\nimage::assets/h_accordion.png[,800,align=\"center\"]\n\n.Vertical accordion\nimage::assets/v_accordion.png[,800,align=\"center\"]\n\nJust like in a `tiles` layout, you can use the xref:commands.adoc#focus[focus] command to navigate an accordion layout.\n\nYou can navigate the windows in an `h_accordion` by using the `focus (left|right)` command.\nWhile in a `v_accordion`, you can navigate the windows using the `focus (up|down)` command.\n\nAccordion padding is configurable via `accordion-padding` option.\n\n[#normalization]\n=== Normalization\n\nBy default, AeroSpace does two types of tree normalizations:\n\n. Containers that have only one child are \"flattened\".\nThe root container is an exception, it is allowed to have a single window child.\nConfigured by `enable-normalization-flatten-containers`\n. Containers that nest into each other must have opposite orientations.\nConfigured by `enable-normalization-opposite-orientation-for-nested-containers`\n\n[.lead]\n*Example 1*\n\nAccording to the first normalization, such layout isn’t possible:\n\n----\nh_tiles (root node)\n└── v_tiles\n    └── window 1\n----\n\nit will be immediately transformed into\n\n----\nv_tiles (new root node)\n└── window 1\n----\n\n[.lead]\n*Example 2*\n\nAccording to the second normalization, such layout isn’t possible:\n\n----\nh_tiles\n├── window 1\n└── h_tiles\n    ├── window 2\n    └── window 3\n----\n\nit will be immediately transformed into\n\n----\nh_tiles\n├── window 1\n└── v_tiles\n    ├── window 2\n    └── window 3\n----\n\nNormalizations make it easier to understand the tree structure by looking at how windows are placed on the screen.\nThough you can disable normalizations by placing these lines to your config:\n\n[source,toml]\n----\nenable-normalization-flatten-containers = false\nenable-normalization-opposite-orientation-for-nested-containers = false\n----\n\nUnless you're hardcore i3 user who knows what they are doing, it's recommended to keep the normalizations enabled.\n\n[#floating-windows]\n=== Floating windows\n\nNormally, floating windows are not considered to be part of the <<tree,tiling tree>>.\nBut it’s not the case with xref:commands.adoc#focus[focus] command.\n\nFrom xref:commands.adoc#focus[focus] command perspective, floating windows are part of <<tree,tiling tree>>.\nThe floating window parent container is determined as the smallest tiling container that contains the center of the floating window.\n\nThis technique eliminates the need for an additional binding for focusing floating windows.\n\n[#emulation-of-virtual-workspaces]\n== Emulation of virtual workspaces\n\nNative macOS Spaces have a lot of problems\n\n* The animation for Spaces switching is slow\n** You can’t disable animation for Spaces switching (you can only make it slightly faster by turning on `Reduce motion` setting, but it’s suboptimal)\n* You have a limit of Spaces (up to 16 Spaces with one monitor)\n* You can’t create/delete/reorder Space and move windows between Spaces with hotkeys (you can only switch between Spaces with hotkeys)\n* Apple doesn't provide public API to communicate with Spaces (create/delete/reorder/switch Space and move windows between Spaces)\n\nSince Spaces are so hard to deal with, AeroSpace reimplements Spaces and calls them \"Workspaces\".\nThe idea is that if the workspace isn’t active then all of its windows are placed outside the visible area of the screen, in the bottom right or left corner.\nOnce you switch back to the workspace, (e.g. by the means of xref:commands.adoc#workspace[workspace] command, or `cmd + tab`) windows are placed back to the visible area of the screen.\n\nWhen you quit the AeroSpace or when the AeroSpace detects that it's about to crash, AeroSpace will place all windows back to the visible area of the screen.\n\nAeroSpace shows the name of currently active workspace in its tray icon (top right corner), to give users a visual feedback on what workspace is currently active.\n\nThe intended workflow of using AeroSpace workspaces is to only have one macOS Space (or as many monitors you have, if `Displays have separate Spaces` is enabled) and don’t interact with macOS Spaces anymore.\n\n[NOTE]\n====\nFor better or worse, macOS doesn’t allow to place windows outside the visible area entirely.\nYou will still be able to see a 1 pixel vertical line of \"hidden\" windows in the bottom right or left corner of your screen.\nThat means, that if AeroSpace crashes badly you will still be able to manually \"unhide\" the windows by dragging these few pixels to the center of the screen.\n\nIf you want to minimize the visibility of hidden windows, it's recommended to place Dock in the bottom (and additionally turn automatic hiding on)\n====\n\n=== Proper monitor arrangement\n\nSince AeroSpace needs a free space to hide windows in,\nplease make sure to arrange monitors in a way where *every monitor has free space in the bottom right or left corner.* (`System Settings -> Displays -> Arrange...`)\n\nIf you fail to arrange your monitors properly, you will see parts of hidden windows on other monitors.\n\n.Bad monitor arrangement. Monitor 2 doesn't have free space in either of the bottom corners\nimage::./assets/monitor-arrangement-1-bad.svg[,,align=\"center\"]\n\n.Good monitor arrangement. Every monitor has free space in either of the bottom corners\nimage::./assets/monitor-arrangement-1-good.svg[,,align=\"center\"]\n\n.Bad monitor arrangement. Monitor 1 doesn't have free space in either of the bottom corners\nimage::./assets/monitor-arrangement-2-bad.svg[,,align=\"center\"]\n\n.Good monitor arrangement. Every monitor has free space in either of the bottom corners\nimage::./assets/monitor-arrangement-2-good.svg[,,align=\"center\"]\n\n[#a-note-on-mission-control]\n=== A note on mission control\n\nFor some reason, mission control doesn't like that AeroSpace puts a lot of windows in the bottom right corner of the screen.\nMission control shows windows too small even when there is enough space to show them bigger.\n\nThere is a workaround. You can enable `Group windows by application` setting:\n[source,bash]\n----\ndefaults write com.apple.dock expose-group-apps -bool true && killall Dock\n----\n(or in System Settings: `System Settings -> Desktop & Dock -> Group windows by application`). For whatever weird reason, it helps.\n\n[#a-note-on-displays-have-separate-spaces]\n=== A note on '`Displays have separate Spaces`'\n\nThere is an observation that macOS works better and more stable if you disable `Displays have separate Spaces`. (It's enabled by default)\nPeople report all sorts of weird issues related to focus and performance when this setting is enabled:\n\n* Wrong window may receive focus in multi-monitor setup: https://github.com/nikitabobko/AeroSpace/issues/101[#101] (Bug in Apple API)\n* Wrong borderless Alacritty window may receive focus in *single monitor* setup: https://github.com/nikitabobko/AeroSpace/issues/247[#247] (Bug in Apple API)\n* Performance issues: https://github.com/nikitabobko/AeroSpace/issues/333[#333]\n* macOS randomly switches focus back: https://github.com/nikitabobko/AeroSpace/issues/289[#289]\n\nWhen `Displays have separate Spaces` is enabled,\nmoving windows between monitors causes windows to move between different Spaces which is not correctly handled by the public APIs AeroSpace uses,\napparently, these APIs are not aware about Spaces existence.\nSpaces are just cursed in macOS. The less Spaces you have, the better macOS behaves.\n\n|===\n|    |'`Displays have separate Spaces`' is enabled |'`Displays have separate Spaces`' is disabled\n\n|Is it possible for window to span across several monitors?\n|❌ No. macOS limitation\n|👍 Yes\n\n|Overall stability and performance\n|❌ Weird focus and performance issues may happen (see the list above)\n|👍 Public Apple API are more stable (which in turn affects AeroSpace stability)\n\n|When the first monitor is in fullscreen\n|👍 Second monitor operates independently\n|❌ Second monitor is unusable black screen\n\n|macOS status bar ...\n|... is displayed on both monitors\n|... is displayed only on main monitor\n|===\n\nIf you don't care about macOS native fullscreen in multi-monitor setup (which is itself clunky anyway, since it creates a separate Space instance),\nI recommend disabling `Displays have separate Spaces`.\n\nYou can disable the setting by running:\n[source,bash]\n----\ndefaults write com.apple.spaces spans-displays -bool true && killall SystemUIServer\n----\n(or in System Settings: `System Settings -> Desktop & Dock -> Displays have separate Spaces`). Logout is required for the setting to take effect.\n\n== Callbacks\n\n[#on-window-detected-callback]\n=== 'on-window-detected' callback\n\nYou can use `on-window-detected` callback to run commands every time a new window is detected.\n\nHere is a showcase example that uses all the possible configurations:\n\n[source,toml]\n----\n[[on-window-detected]]\n    if.app-id = 'com.apple.systempreferences'\n    if.app-name-regex-substring = 'settings'\n    if.window-title-regex-substring = 'substring'\n    if.workspace = 'workspace-name'\n    if.during-aerospace-startup = true\n    check-further-callbacks = true\n    run = ['layout floating', 'move-node-to-workspace S']  # The callback itself\n----\n\n`run` commands are run only if the detected window matches all the specified conditions.\nIf no conditions are specified then `run` is run every time a new window is detected.\n\nSeveral callbacks can be declared in the config.\nThe callbacks are processed in the order they are declared.\nBy default, the first callback that matches the criteria is run, and further callbacks are not considered.\n(The behavior can be overridden with `check-further-callbacks` option)\n\nAvailable window conditions are:\n\n[cols=\"1,2\"]\n|===\n|Condition TOML key |Condition description\n\n|`if.app-id`\n|Application ID exact match of the detected window\n\n|`if.app-name-regex-substring`\n|Application name case insensitive regex substring of the detected window\n\n|`if.window-title-regex-substring`\n|Window title case insensitive regex substring of the detected window\n\n|`if.during-aerospace-startup`\na|\n* If `true` then run the callback only during AeroSpace startup.\n* If `false` then run callback only *NOT* during AeroSpace startup.\n* If not specified then the condition isn’t checked\n\n|`if.workspace`\n|Window's workspace name exact match\n\n|===\n\n* `if.during-aerospace-startup = true` is useful if you want to do the initial app arrangement only on startup.\n\n* `if.during-aerospace-startup = false` is useful if you want to relaunch AeroSpace, but the callback has side effects that you don’t want to run on every relaunch.\n(e.g. the callback opens new windows)\n\nThere are several ways to know `app-id`:\n\n* Take a look at precompiled xref:./goodies.adoc#popular-apps-ids[list of Apple application IDs]\n* You can use xref:commands.adoc#list-apps[`aerospace list-apps`] CLI command to get IDs of running applications\n* `mdls -name kMDItemCFBundleIdentifier -r /Applications/App.app`\n\nIMPORTANT: Some windows initialize their title after the window appears.\n`window-title-regex-substring` may not work as expected for such windows\n\nExamples of automations:\n\n* Assign apps on particular workspaces\n+\n[source,toml]\n----\n[[on-window-detected]]\n    if.app-id = 'org.alacritty'\n    run = 'move-node-to-workspace T' # mnemonics T - Terminal\n\n[[on-window-detected]]\n    if.app-id = 'com.google.Chrome'\n    run = 'move-node-to-workspace W' # mnemonics W - Web browser\n\n[[on-window-detected]]\n    if.app-id = 'com.jetbrains.intellij'\n    run = 'move-node-to-workspace I' # mnemonics I - IDE\n----\n* Make all windows float by default\n+\n[source,toml]\n----\n[[on-window-detected]]\n    check-further-callbacks = true\n    run = 'layout floating'\n----\n\n[#on-focus-changed-callbacks]\n=== 'on-focus-changed' callbacks\n\nYou can track focus changes using the following callbacks: `on-focus-changed` and `on-focused-monitor-changed`.\n\n* `on-focus-changed` is called every time focused window or workspace changes.\n* `on-focused-monitor-changed` is called every time focused monitor changes.\n\nA common use case for the callbacks is to implement \"mouse follows focus\" behavior. All you need is to combine the callback of your choice with xref:commands.adoc#move-mouse[move-mouse command]:\n[source,toml]\n----\non-focused-monitor-changed = ['move-mouse monitor-lazy-center'] # Mouse lazily follows focused monitor (default in i3)\n# or\non-focus-changed = ['move-mouse window-lazy-center'] # Mouse lazily follows any focus (window or workspace)\n----\n\nYou shouldn't rely on the order callbacks are called, since it's an implementation detail and can change from version to version.\n\nThe callbacks are \"recursion resistant\", which means that any focus change within the callback won't retrigger the callback.\nChanging the focus within these callbacks is a bad idea anyway, and the way it's handled will probably change in future versions.\n\n[#exec-on-workspace-change-callback]\n=== 'exec-on-workspace-change' callback\n\n`exec-on-workspace-change` callback allows to run arbitrary process when focused workspace changes.\nIt may be useful for integrating with bars.\n\n[source,toml]\n----\n# Notify Sketchybar about workspace change\nexec-on-workspace-change = ['/bin/bash', '-c',\n    'sketchybar --trigger aerospace_workspace_change FOCUSED=$AEROSPACE_FOCUSED_WORKSPACE'\n]\n----\n\nBesides the <<exec-env-vars,`exec.env-vars`>>, the process has access to the following environment variables:\n\n* `AEROSPACE_FOCUSED_WORKSPACE` - the workspace user switched to\n* `AEROSPACE_PREV_WORKSPACE` - the workspace user switched from\n\nFor a more elaborate example on how to integrate with Sketchybar see\nxref:./goodies.adoc#show-aerospace-workspaces-in-sketchybar[]\n\n[#multiple-monitors]\n== Multiple monitors\n\n* The pool of workspaces is shared between monitors\n* Each monitor shows its own workspace.\nThe showed workspaces are called \"visible\" workspaces\n* Different monitors can’t show the same workspace at the same time\n* Each workspace (even invisible, even empty) has a monitor assigned to it\n* By default, all workspaces are assigned to the \"main\" monitor (\"main\" as in `System -> Displays -> Use as`)\n\nWhen you switch to a workspace:\n\n. AeroSpace takes the assigned monitor of the workspace and makes the workspace visible on the monitor\n. AeroSpace focuses the workspace\n\nYou can move workspace to a different monitor with xref:commands.adoc#move-workspace-to-monitor[move-workspace-to-monitor] command.\n\nThe idea of making pool of workspaces shared is based on [#observation]*the observation* that most users have a limited set of workspaces on their secondary monitors.\nSecondary monitors are frequently dedicated to specific tasks (browser, shell), or for monitoring various activities such as logs and dashboards.\nThus, using one workspace per secondary monitor and \"the rest\" on the main monitor often makes sense.\n\n[NOTE]\n====\nThe only difference between AeroSpace and i3 is switching to empty workspaces.\nWhen you switch to an empty workspace, AeroSpace puts the workspace on an assigned monitor; i3 puts the workspace on currently active monitor.\n\n* I find that AeroSpace model works better with <<observation,_the observation_>> listed above.\n* AeroSpace model is more consistent (it works the same for empty workspaces and non-empty workspaces)\n====\n\n[#assign-workspaces-to-monitors]\n=== Assign workspaces to monitors\n\nYou can use `workspace-to-monitor-force-assignment` syntax to assign\nworkspaces to always appear on particular monitors\n\n[source,toml]\n----\n[workspace-to-monitor-force-assignment]\n    1 = 1                            # Monitor sequence number from left to right. 1-based indexing\n    2 = 'main'                       # Main monitor\n    3 = 'secondary'                  # Non-main monitor in case when there are only two monitors\n    4 = 'built-in'                   # Case insensitive regex substring\n    5 = '^built-in retina display$'  # Case insensitive regex match\n    6 = ['secondary', 'dell']        # You can specify multiple patterns.\n                                     #   The first matching pattern will be used\n----\n\n* Left hand side of the assignment is the workspace name\n* Right hand side of the assignment is the monitor pattern\n\nSupported monitor patterns:\n\n* `main` - \"Main\" monitor (\"main\" as in `System Settings -> Displays -> Use as`)\n* `secondary` - Non-main monitor in case when there are only two monitors\n* `<number>` (e.g. `1`, `2`) - Sequence number of the monitor from left to right. 1-based indexing\n* `<regex-pattern>` (e.g. `+dell.*+`, `+built-in.*+`) - Case insensitive regex substring pattern\n\nYou can specify multiple patterns as an array.\nThe first matching pattern will be used\n\nxref:commands.adoc#move-workspace-to-monitor[move-workspace-to-monitor] command has no effect for workspaces that have monitor assignment\n\n== Dialog heuristics\n\n* Apple provides accessibility API for apps to let others know which of their windows are dialogs\n* A lot of apps don't implement this API or implement it improperly\n+\nEven some Apple dialogs don't implement the API properly.\n(E.g. Finder \"Copy\" progress window doesn't let others know that it's a dialog)\n\nAeroSpace uses the API to gently ask windows whether they are dialogs, but AeroSpace also applies some heuristics.\n\nFor example, windows without a fullscreen button (NB! fullscreen button and maximize button are different buttons) are generally considered dialogs, excluding terminal apps (WezTerm, Alacritty, iTerm2, etc.).\n\nWindows that are recognized as dialogs are floated by default.\n\nIf you find that some windows are not handled properly, you're welcome to create a PR that improves the heuristic.\nIt's fine to hardcode special handling for popular applications, AeroSpace already does it.\nPlease see `isDialogHeuristic` function in AeroSpace sources.\n\nYou can also use `on-window-detected` to force tile or force float all windows of a particular application:\n\n. Force tile all the windows (or windows of a particular app)\n+\n[source,toml]\n----\n[[on-window-detected]]\n    if.app-id = '...'\n    run = 'layout tiling'\n----\n. Force float all the windows (or windows of a particular app)\n+\n[source,toml]\n----\n[[on-window-detected]]\n    if.app-id = '...'\n    run = 'layout floating'\n----\n\n== Common pitfall: keyboard keys handling\n\nIf you can't make AeroSpace handle some keys in your config, please make sure that you don't have keys conflict with other software that might listen to global keys (e.g. skhd, Karabiner-Elements, Raycast)\n"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\" />\n    <meta http-equiv=\"Refresh\" content=\"0; url=https://github.com/nikitabobko/AeroSpace\" />\n    <title>Redirect</title>\n  </head>\n  <body>\n    <a href=\"https://github.com/nikitabobko/AeroSpace\">Redirect</a>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/util/all-monitors-option.adoc",
    "content": "--all::\nAlias for `--monitor all`.\nPlease use this option *with caution*.\nUse it when you really need to get workspaces/windows from *all monitors*.\n+\nFor multi-monitor setup `--monitor focused` is almost always a preferred option.\nIf you're automating something then you don't want to mess up with workspaces/windows on a different monitor.\n+\nWith great power comes great responsibility.\n"
  },
  {
    "path": "docs/util/conditional-arguments-header.adoc",
    "content": "ifndef::env-site[]\n== Arguments\nendif::[]\n\nifdef::env-site[]\n[.lead]\n**ARGUMENTS**\nendif::[]\n"
  },
  {
    "path": "docs/util/conditional-examples-header.adoc",
    "content": "ifndef::env-site[]\n== Examples\nendif::[]\n\nifdef::env-site[]\n[.lead]\n**EXAMPLES**\nendif::[]\n"
  },
  {
    "path": "docs/util/conditional-exit-code-header.adoc",
    "content": "ifndef::env-site[]\n== Exit code\nendif::[]\n\nifdef::env-site[]\n[.lead]\n**EXIT CODE**\nendif::[]\n"
  },
  {
    "path": "docs/util/conditional-options-header.adoc",
    "content": "ifndef::env-site[]\n== Options\nendif::[]\n\nifdef::env-site[]\n[.lead]\n**OPTIONS**\nendif::[]\n"
  },
  {
    "path": "docs/util/conditional-output-format-header.adoc",
    "content": "ifndef::env-site[]\n== Output Format\nendif::[]\n\nifdef::env-site[]\n[.lead]\n**OUTPUT FORMAT**\nendif::[]\n"
  },
  {
    "path": "docs/util/header.adoc",
    "content": "====\nAeroSpace is an i3-like tiling window manager for macOS\n\n*Project homepage*: https://github.com/nikitabobko/AeroSpace\n\nimage:assets/icon.png[300,300,float=\"right\"]\n\n* xref:guide.adoc[AeroSpace Guide]\n* xref:commands.adoc[AeroSpace Commands]\n* xref:goodies.adoc[AeroSpace Goodies]\n====\n"
  },
  {
    "path": "docs/util/man-attributes.adoc",
    "content": "ifndef::env-site[]\n:doctype: manpage\n:manmanual: AeroSpace Manual\n:mansource: AeroSpace\nendif::[]\n"
  },
  {
    "path": "docs/util/man-footer.adoc",
    "content": "== Resources\n\n*Project homepage:* https://github.com/nikitabobko/AeroSpace +\n*Guide:* https://nikitabobko.github.io/AeroSpace/guide +\n\n== BUGS\n\nBugs can be reported to https://github.com/nikitabobko/AeroSpace/discussions/categories/potential-bugs\n\nMaintainers will move verified bugs to https://github.com/nikitabobko/AeroSpace/issues\n\n== License\n\nCopyright (C) 2023 Nikita Bobko +\nFree use of this software is granted under the terms of the MIT License +\nYou can find the full text of AeroSpace license and its dependencies in the 'legal' directory of the distributed zip archive.\n\n== AUTHOR\n\nNikita Bobko and contributors\n"
  },
  {
    "path": "docs/util/monitor-option.adoc",
    "content": "--monitor <monitors>::\nFilter results to only print workspaces/windows that are attached to specified monitors.\n`<monitors>` is a space separated list of monitor IDs. +\n+\nPossible monitors IDs: +\n+\n. 1-based index of a monitor as if monitors were ordered horizontally from left to right\n. `all` is a special monitor ID that represents all monitors\n. `mouse` is a special monitor ID that represents monitor with the mouse\n. `focused` is a special monitor ID that represents the focused monitor\n"
  },
  {
    "path": "docs/util/site-attributes.adoc",
    "content": ":idprefix:\n:idseparator: -\n:prewrap!:\n:relfilesuffix:\n:sectanchors:\n:sectlinks:\n:sectnums:\n:source-highlighter: pygments\n:toc: left\n:env-site:\n:favicon: ./assets/icon.png\n"
  },
  {
    "path": "docs/util/window-id-flag-desc.adoc",
    "content": "Act on the specified window instead of the focused window\n"
  },
  {
    "path": "docs/util/workspace-flag-desc.adoc",
    "content": "Act on the specified workspace instead of the focused workspace\n"
  },
  {
    "path": "format.sh",
    "content": "#!/usr/bin/env bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\ncheck_uncommitted_files=0\nwhile test $# -gt 0; do\n    case $1 in\n        --check-uncommitted-files) check_uncommitted_files=1; shift 1 ;;\n        *) echo \"Unknown option $1\"; exit 1 ;;\n    esac\ndone\n\nif test $check_uncommitted_files -eq 1; then ./script/check-uncommitted-files.sh; fi\n\n./script/install-dep.sh --swiftformat\n./.deps/swiftformat/swiftformat .\n\nif test $check_uncommitted_files -eq 1; then ./script/check-uncommitted-files.sh; fi\n\n./script/install-dep.sh --swiftlint\n./.deps/swiftlint/swiftlint lint --quiet --fix\n"
  },
  {
    "path": "generate-shell-parser.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\n./script/install-dep.sh --antlr\n./.deps/python-venv/bin/antlr4 -v \"$antlr_version\" -no-listener -Dlanguage=Swift \\\n    -o ./ShellParserGenerated/Sources/ShellParserGenerated \\\n    ./grammar/ShellLexer.g4 \\\n    ./grammar/ShellParser.g4\n\n\nmv ./ShellParserGenerated/Sources/ShellParserGenerated/grammar/*.swift ./ShellParserGenerated/Sources/ShellParserGenerated/\nrm -rf ./ShellParserGenerated/Sources/ShellParserGenerated/grammar # Antlr generates weird *.interp and *.tokens files\n\n# Sources/ShellParserGenerated/ShellParser.swift:557:7: warning: variable '_prevctx' was written to, but never read\n#                 var _prevctx: CmdContext = _localctx\nsed -i '' '/_prevctx/d' ./ShellParserGenerated/Sources/ShellParserGenerated/ShellParser.swift\n"
  },
  {
    "path": "generate.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\nexport XCODEGEN_AEROSPACE_CODE_SIGN_IDENTITY=\"aerospace-codesign-certificate\"\nbuild_version=\"0.0.0-SNAPSHOT\"\ngenerate_xcodeproj=1\ngenerate_cmd_help=1\ngenerate_shell_parser=1\ngenerate_git_hash=0\nwhile test $# -gt 0; do\n    case $1 in\n        --build-version) build_version=\"$2\"; shift 2 ;;\n        --codesign-identity) XCODEGEN_AEROSPACE_CODE_SIGN_IDENTITY=\"$2\"; shift 2 ;;\n        --generate-git-hash) generate_git_hash=1; shift 1;;\n        --ignore-cmd-help) generate_cmd_help=0; shift 1 ;;\n        --ignore-xcodeproj) generate_xcodeproj=0; shift 1 ;;\n        --ignore-shell-parser) generate_shell_parser=0; shift 1 ;;\n        *) echo \"Unknown option $1\"; exit 1 ;;\n    esac\ndone\n\nif test $generate_shell_parser = 1; then\n    ./generate-shell-parser.sh\nfi\n\nif test $generate_cmd_help = 1; then\n    # It takes 300ms for the script to complete\n    ./script/generate-cmd-help.sh\nfi\n\ncat > Sources/Common/versionGenerated.swift <<EOF\n// FILE IS GENERATED BY generate.sh\npublic let aeroSpaceAppVersion = \"$build_version\"\nEOF\n\nentries() {\n    for file in docs/aerospace-*.adoc; do\n        if grep -q 'exec-and-forget' <<< $file; then\n            continue\n        fi\n        subcommand=$(basename $file | sed 's/^aerospace-//' | sed 's/\\.adoc$//')\n        desc=\"$(grep :manpurpose: \"$file\" | sed -E 's/:manpurpose: //')\"\n        echo \"    [\\\"  $subcommand\\\", \\\"$desc\\\"],\"\n    done\n}\n\ncat <<EOF > ./Sources/Cli/subcommandDescriptionsGenerated.swift\n// FILE IS GENERATED FROM docs/aerospace-*.adoc files\n// TO REGENERATE THE FILE RUN generate.sh\n\nlet subcommandDescriptions = [\n$(entries)\n]\nEOF\n\ncat <<EOF > ./Sources/Common/gitHashGenerated.swift\n// FILE IS GENERATED BY generate.sh\npublic let gitHash = \"$(if test $generate_git_hash = 0; then echo \"SNAPSHOT\"; else git rev-parse HEAD; fi)\"\npublic let gitShortHash = \"$(if test $generate_git_hash = 0; then echo \"SNAPSHOT\"; else git rev-parse --short HEAD; fi)\"\nEOF\n\nif test $generate_xcodeproj = 1; then\n    export XCODEGEN_AEROSPACE_VERSION=$build_version\n    ./script/install-dep.sh --xcodegen\n    ./.deps/xcodegen/xcodegen # https://github.com/yonaskolb/XcodeGen\nfi\n"
  },
  {
    "path": "grammar/ShellLexer.g4",
    "content": "// shell lexer grammar. Powered by https://github.com/antlr/antlr4\n// Use ./generate-shell-parser.sh to regenerate grammar code\nlexer grammar ShellLexer;\n\nTRIPLE_QUOTE : '\"\"\"' | '\\'\\'\\'' ; // Reserved\n\nSINGLE_QUOTED_STRING : '\\'' .*? '\\'' ;\n\nLDQUOTE : '\"' -> pushMode(IN_DSTRING) ;\nLPAR : '(' -> pushMode(DEFAULT_MODE) ;\nINTERPOLATION_START : '$(' -> pushMode(DEFAULT_MODE) ;\nRPAR : ')' {\n    _ = try? popMode()\n} ;\n\n// Keywords (some of them are unused, just reserved)\nELIF : 'elif' NL* ;\nIF : 'if' NL* ;\nSWITCH : 'switch' NL* ;\nCASE : 'case' NL* ;\nDO : 'do' NL* ;\nTHEN : 'then' NL* ;\nELSE : 'else' NL* ;\nFOR : 'for' NL* ;\nWHILE : 'while' NL* ;\nCATCH : 'catch' NL* ;\nIN : 'in' NL* ;\nEND : 'end' NL* ;\nDEFER : 'defer' NL* ;\n\nAND : '&&' ;\nPIPE : '|' ;\nOR : '||' ;\nSEMICOLON : ';' ;\nNL : SPACES? ('\\r')? '\\n' ;\nWORD : ([a-zA-Z]    | '.' | '_' | '-' | '/')+ ;\nARG :  ([a-zA-Z0-9] | '.' | '_' | '-' | '/' | '+' | ',' | '=' | '!' | '%' | '{' | '}' | '^')+ ;\n\nESCAPE_NEWLINE : '\\\\' SPACES? COMMENT? '\\n' -> skip ;\nCOMMENT : '#' ~('\\n')* -> skip ;\nSPACES : [ \\t]+ -> skip ;\n\nANY : . ; // Catch all other\n\nmode IN_DSTRING;\nTEXT : ~('\\\\' | '\"' | '$')+ ;\nINTERPOLATION_START_IN_DSTRING : '$(' -> pushMode(DEFAULT_MODE) ;\nESCAPE_SEQUENCE : '\\\\' . ;\nRDQUOTE : '\"' {\n    _ = try? popMode()\n} ;\n"
  },
  {
    "path": "grammar/ShellParser.g4",
    "content": "// shell parser grammar. Powered by https://github.com/antlr/antlr4\n// Use ./generate-shell-parser.sh to regenerate grammar code\nparser grammar ShellParser;\n\noptions {\n    tokenVocab = './grammar/ShellLexer';\n}\n\nroot : NL* (cmds EOF | EOF) ; // Consume ALL the input\n\ncmds\n    : IF cmd THEN cmds? (ELIF cmd THEN cmds?)* (ELSE cmds?)? END  #IfElse\n    | cmd (SEMICOLON | NL)+ (cmds)*?                              #Seq\n    | cmd                                                         #Seq\n    ;\n\ncmd\n    : WORD arg*                                                              #Args\n    | cmd NL* PIPE cmd                                                       #Pipe\n    | cmd NL* AND cmd                                                        #And\n    | cmd NL* OR cmd                                                         #Or\n    | LPAR cmds RPAR                                                         #Parens\n    | LPAR cmds RPAR RPAR  {notifyErrorListeners(\"Unbalanced parenthesis\")}  #CmdError\n    | LPAR cmds            {notifyErrorListeners(\"Unbalanced parenthesis\")}  #CmdError\n    ;\n\narg\n    : ARG                                #Word\n    | WORD                               #Word\n    | SINGLE_QUOTED_STRING               #SQuotedString\n    | LDQUOTE dStringFragment* RDQUOTE   #DQuotedString\n    | INTERPOLATION_START cmds RPAR      #Substitution\n\n    | LDQUOTE dStringFragment* RDQUOTE RDQUOTE {notifyErrorListeners(\"Unbalanced quotes\")}  #ArgError\n    | LDQUOTE dStringFragment*                 {notifyErrorListeners(\"Unbalanced quotes\")}  #ArgError\n    | INTERPOLATION_START cmds RPAR RPAR {notifyErrorListeners(\"Unbalanced parenthesis\")}   #ArgError\n    | INTERPOLATION_START cmds           {notifyErrorListeners(\"Unbalanced parenthesis\")}   #ArgError\n    ;\n\ndStringFragment\n    : TEXT                                                                                            #Text\n    | ESCAPE_SEQUENCE                                                                                 #EscapeSequence\n    | INTERPOLATION_START_IN_DSTRING cmds RPAR                                                        #Interpolation\n    | INTERPOLATION_START_IN_DSTRING cmds RPAR RPAR {notifyErrorListeners(\"Unbalanced parenthesis\")}  #DStringFragmentError\n    | INTERPOLATION_START_IN_DSTRING cmds           {notifyErrorListeners(\"Unbalanced parenthesis\")}  #DStringFragmentError\n    ;\n"
  },
  {
    "path": "grammar/commands-bnf-grammar.txt",
    "content": "# EBNF-like grammar of aerospace CLI args to generate shell completion. Managed by https://github.com/adaszko/complgen\n# Run ./build-shell-completion.sh to generate shell completion\naerospace <subcommand>;\naerospace -v;\naerospace --version;\naerospace --help;\naerospace -h;\n\n<subcommand> ::=\n\n    balance-sizes [--workspace <workspace>]\n\n    | close [--quit-if-last-window|--window-id <window_id>]...\n\n    | close-all-windows-but-current [--quit-if-last-window]\n\n    | enable toggle\n    | enable [--fail-if-noop] on [--fail-if-noop]\n    | enable [--fail-if-noop] off [--fail-if-noop]\n\n    | flatten-workspace-tree [--workspace <workspace>]\n\n    | focus [<focus_direction_flag>]... (left|down|up|right) [<focus_direction_flag>]...\n    | focus --window-id <window_id>\n    | focus --dfs-index <number>\n    | focus [<focus_dfs_relative_flag>]... (dfs-next|dfs-prev) [<focus_dfs_relative_flag>]...\n\n    | focus-back-and-forth\n\n    | focus-monitor [--wrap-around] (left|down|up|right) [--wrap-around]\n    | focus-monitor [--wrap-around] (next|prev) [--wrap-around]\n    | focus-monitor <monitor_pattern>...\n\n    | fullscreen [--no-outer-gaps|--window-id <window_id>]...\n    | fullscreen [--no-outer-gaps|--fail-if-noop|--window-id <window_id>]... on [--no-outer-gaps|--fail-if-noop|--window-id <window_id>]...\n    | fullscreen [--fail-if-noop|--window-id <window_id>] off [--fail-if-noop|--window-id <window_id>]\n\n    | join-with [--window-id <window_id>] (left|down|up|right)\n\n    | layout [--window-id <window_id>] (h_tiles|v_tiles|h_accordion|v_accordion|tiles|accordion|horizontal|vertical|tiling|floating)...\n\n    | macos-native-fullscreen [--fail-if-noop|--window-id <window_id>]... [on|off] [--fail-if-noop|--window-id <window_id>]...\n\n    | macos-native-minimize [--window-id <window_id>]\n\n    | mode <mode_id>\n\n    | move [<move_command_flag>]... (left|down|up|right) [<move_command_flag>]...\n\n    | move-mouse [--fail-if-noop] (monitor-lazy-center|monitor-force-center|window-lazy-center|window-force-center) [--fail-if-noop]\n\n    | move-node-to-monitor [<move_node_to_monitor1_flag>]... (left|down|up|right|next|prev) [<move_node_to_monitor1_flag>]...\n    | move-node-to-monitor [<move_node_to_monitor2_flag>]... <monitor_pattern>... [<move_node_to_monitor2_flag>]...\n\n    | move-node-to-workspace [--wrap-around|--focus-follows-window|--stdin|--no-stdin]... (next|prev) [--wrap-around|--focus-follows-window|--stdin|--no-stdin]...\n    | move-node-to-workspace [--fail-if-noop|--window-id <window_id>|--focus-follows-window]... <workspace> [--fail-if-noop|--window-id <window_id>|--focus-follows-window]...\n\n    | move-workspace-to-monitor [--wrap-around] (left|down|up|right|next|prev) [--wrap-around]\n    | move-workspace-to-monitor [--wrap-around] <monitor_pattern>... [--wrap-around]\n\n    | reload-config [--no-gui | --dry-run]...\n\n    | resize [--window-id <window_id>] (smart|smart-opposite|width|height) [+|-]<number> [--window-id <window_id>]\n\n    | split [--window-id <window_id>] (horizontal|vertical|opposite) [--window-id <window_id>]\n\n    | swap [--swap-focus|--wrap-around|--window-id <window_id>]... (left|down|up|right|dfs-next|dfs-prev) [--swap-focus|--wrap-around|--window-id <window_id>]...\n\n    | summon-workspace [--fail-if-noop] <workspace> [--fail-if-noop]\n\n    | trigger-binding <binding> --mode <mode_id>\n    | trigger-binding --mode <mode_id> <binding>\n\n    | volume [--no-gui] (up|down) [--no-gui]\n    | volume [--no-gui] (mute-toggle|mute-on|mute-off) [--no-gui]\n    | volume [--no-gui] set <number> [--no-gui]\n\n    | workspace [--auto-back-and-forth|--fail-if-noop]... <workspace> [--auto-back-and-forth|--fail-if-noop]...\n    | workspace [--wrap-around|--stdin|--no-stdin] (next|prev) [--wrap-around|--stdin|--no-stdin]\n\n    | workspace-back-and-forth\n\n    | config [--json | --keys]... --get {{{ aerospace config --major-keys }}} [--json | --keys]...\n    | config --major-keys\n    | config --all-keys\n    | config --config-path\n\n    | debug-windows [--window-id <window_id>]\n\n    | list-apps [--macos-native-hidden [no] | --format <output_format> | --count | --json]...\n\n    | list-exec-env-vars\n\n    | list-modes [--current|--json|--count]...\n\n    | list-monitors [--focused [no] | --mouse [no] | --format <output_format> | --count | --json]...\n\n    | list-windows [<list_windows_filter_flag> | --format <output_format> | --count | --json]...\n    | list-windows [--format <output_format>|--count|--json] (--all|--focused) [--format <output_format>|--count|--json]\n\n    | list-workspaces [<list_workspaces1_flag>]... --monitor <monitor_id>... [<list_workspaces1_flag>]...\n    | list-workspaces [--format <output_format>|--count|--json] (--all|--focused) [--format <output_format>|--count|--json]\n\n    | subscribe [--all|--no-send-initial] <event>... [--all|--no-send-initial]\n    ;\n\n<window_id> ::= {{{ aerospace list-windows --all --format '%{window-id}%{tab}%{app-name} - %{window-title}' }}};\n<binding> ::= {{{ aerospace config --get mode --keys | xargs -I{} aerospace config --get mode.{}.binding --keys }}};\n<mode_id> ::= {{{ aerospace config --get mode --keys }}};\n<workspace> ::= {{{ aerospace list-workspaces --monitor all --empty no }}};\n<number> ::= {{{ true }}};\n<monitor_pattern> ::= {{{ true }}};\n\n<list_workspaces1_flag> ::= --visible [no] | --empty [no] | --format <output_format> | --format <output_format> | --count | --json;\n\n<move_command_flag> ::= --window-id <window_id> | --boundaries <boundary> | --boundaries-action <move_boundaries_action>;\n<move_boundaries_action> ::= stop|fail|create-implicit-container;\n\n<move_node_to_monitor1_flag> ::= --window-id <window_id>|--focus-follows-window|--fail-if-noop|--wrap-around;\n<move_node_to_monitor2_flag> ::= --window-id <window_id>|--focus-follows-window|--fail-if-noop;\n\n<focus_direction_flag> ::= --boundaries <boundary>|--boundaries-action <boundaries_action>|--ignore-floating|--wrap-around;\n<focus_dfs_relative_flag> ::= --boundaries-action <boundaries_action>|--ignore-floating|--wrap-around;\n<boundaries_action> ::= stop|fail|wrap-around-the-workspace|wrap-around-all-monitors;\n<boundary> ::= workspace|all-monitors-outer-frame;\n\n<list_windows_filter_flag> ::= --workspace (visible | focused | <workspace>)...\n    | --monitor <monitor_id>...\n    | --pid <pid>\n    | --app-bundle-id <app_bundle_id>\n    ;\n<output_format> ::= {{{ true }}};\n\n<app_bundle_id> ::= {{{ aerospace list-apps --format '%{app-bundle-id}%{tab}%{app-name}' }}};\n<pid> ::= {{{ aerospace list-apps --format '%{app-pid}%{tab}%{app-name}' }}};\n<monitor_id> ::= all | mouse | focused | {{{ aerospace list-monitors --format '%{monitor-id}%{tab}%{monitor-name}' }}};\n\n<event> ::= focus-changed | focused-monitor-changed | focused-workspace-changed | mode-changed | window-detected | binding-triggered;\n"
  },
  {
    "path": "install-from-sources.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\nrebuild=1\nwhile test $# -gt 0; do\n    case $1 in\n        --dont-rebuild) rebuild=0; shift ;;\n        *) echo \"Unknown option $1\"; exit 1 ;;\n    esac\ndone\n\nif test $rebuild == 1; then\n    ./build-release.sh\nfi\n\nPATH=\"$PATH:$(brew --prefix)/bin\"\nexport PATH\n\nbrew list aerospace-dev-user/aerospace-dev-tap/aerospace-dev > /dev/null 2>&1 && brew uninstall aerospace-dev-user/aerospace-dev-tap/aerospace-dev # Compatibility. Drop after a while\nbrew list nikitabobko/local-tap/aerospace-dev > /dev/null 2>&1 && brew uninstall nikitabobko/local-tap/aerospace-dev\nbrew list aerospace > /dev/null 2>&1 && brew uninstall aerospace\nwhich brew-install-path > /dev/null 2>&1 || brew install nikitabobko/tap/brew-install-path\n\n# Override HOMEBREW_CACHE. Otherwise, homebrew refuses to \"redownload\" the snapshot file\n# Maybe there is a better way, I don't know\nrm -rf /tmp/aerospace-from-sources-brew-cache\nHOMEBREW_CACHE=/tmp/aerospace-from-sources-brew-cache brew install-path ./.release/aerospace-dev.rb\n\nrm -rf \"$(brew --prefix)/Library/Taps/aerospace-dev-user\" # Compatibility. Drop after a while\n"
  },
  {
    "path": "legal/README.md",
    "content": "# LICENSE\n\nThe AeroSpace itself is licensed under MIT. See [LICENSE](./LICENSE.txt) for the full license text.\n\n## Bundled dependencies and materials\n\nAeroSpace bundles the following dependencies and uses the following materials:\n\n**HotKey**.\n[HotKey GitHub link](https://github.com/soffes/HotKey).\n[HotKey MIT license](./third-party-license/LICENSE-HotKey.txt).\nHotKey is used as a more convenient wrapper around macOS Carbon API to listen for global shortcuts.\n\n**TOMLKIT**.\n[TOMLKIT GitHub link](https://github.com/LebJe/TOMLKit).\n[TOMLKIT MIT license](./third-party-license/LICENSE-TOMLKIT.txt).\nTOMLKIT is used as a more convenient Swift wrapper around tomlplusplus C++ API.\n\n**tomlplusplus**.\n[tomlplusplus GitHub link](https://github.com/marzer/tomlplusplus).\n[tomlplusplus MIT license](./third-party-license/LICENSE-tomlplusplus.txt).\ntomlplusplus is used as TOML parser. tomlplusplus is used indirectly through TOMLKIT Swift API.\n\n**ANTLR v4**.\n[ANTLR v4 GitHub link](https://github.com/antlr/antlr4).\n[ANTLR BSD-3 license](./third-party-license/LICENSE-antlr.txt).\nANTLR is used to parse AeroSpace built-in shell like language.\n\n**swift-collections**.\n[swift-collections GitHub link](https://github.com/apple/swift-collections).\n[swift-collections Apache 2.0 license](./third-party-license/LICENSE-swift-collections.txt).\nswift-collections is used for more advanced Swift collections.\n\n**ISSoundAdditions**\n[ISSoundAdditions GitHub link](https://github.com/InerziaSoft/ISSoundAdditions).\n[ISSoundAdditions MIT license](./third-party-license/LICENSE-ISSoundAdditions.txt).\nISSoundAdditions is used as a convenient API to change system volume.\n"
  },
  {
    "path": "legal/third-party-license/LICENSE-HotKey.txt",
    "content": "Copyright (c) 2017–2019 Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "legal/third-party-license/LICENSE-ISSoundAdditions.txt",
    "content": "MIT License\n\nCopyright (c) 2021 InerziaSoft - Massimo and Alessio Moiso.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "legal/third-party-license/LICENSE-TOMLKIT.txt",
    "content": "MIT License\n\nCopyright (c) 2024 Jeff Lebrun\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "legal/third-party-license/LICENSE-antlr.txt",
    "content": "Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\n3. Neither name of copyright holders nor the names of its contributors\nmay be used to endorse or promote products derived from this software\nwithout specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "legal/third-party-license/LICENSE-swift-collections.txt",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n    1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n    2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n    3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n    4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n    5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n    6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n    7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n    8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n    9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n    END OF TERMS AND CONDITIONS\n\n    APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n    Copyright [yyyy] [name of copyright owner]\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n\n\n## Runtime Library Exception to the Apache 2.0 License: ##\n\n\n    As an exception, if you use this Software to compile your source code and\n    portions of this Software are embedded into the binary product as a result,\n    you may redistribute such product without providing attribution as would\n    otherwise be required by Sections 4(a), 4(b) and 4(d) of the License.\n"
  },
  {
    "path": "legal/third-party-license/LICENSE-tomlplusplus.txt",
    "content": "MIT License\n\nCopyright (c) Mark Gillard <mark.gillard@outlook.com.au>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the\nSoftware.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "lint.sh",
    "content": "#!/usr/bin/env bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\n./format.sh \"$@\"\n\nif sw_vers -productVersion | grep -q \"^14\"; then # macOS 14\n    # dyld[6263]: Library not loaded: /usr/lib/swift/libswiftSynchronization.dylib\n    # Referenced from: <0A48220F-3DCA-3C6C-A54C-FE6C3B854E23> /Users/runner/work/AeroSpace/AeroSpace/.deps/periphery/dist/periphery-3.6.0.artifactbundle/periphery-3.6.0-macos/bin/periphery (built for macOS 15.0 which is newer than running OS)\n    # Reason: tried: '/usr/lib/swift/libswiftSynchronization.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/lib/swift/libswiftSynchronization.dylib' (no such file), '/usr/lib/swift/libswiftSynchronization.dylib' (no such file, not in dyld cache)\n    echo 'warning: periphery is disabled on macos 14'\nelse\n    ./script/install-dep.sh --periphery\n    # Disable superfluous comments detection because it's buggy. todo: report to periphery maintainer\n    ./.deps/periphery/periphery scan --quiet \\\n        --strict \\\n        --disable-redundant-public-analysis \\\n        --no-superfluous-ignore-comments \\\n        --exclude-targets \\\n        ShellParserGenerated\nfi\n"
  },
  {
    "path": "makefile",
    "content": "# makefile is used to make :make command in vim work out of the box\n.PHONY: build test format swift-test\n\nbuild:\n\t./build-debug.sh\n\ntest:\n\t./run-tests.sh\n\nswift-test:\n\t./run-swift-test.sh\n\nformat:\n\t./format.sh\n\nlint:\n\t./lint.sh\n"
  },
  {
    "path": "project.yml",
    "content": "# Xcode project configuration. Managed by https://github.com/yonaskolb/XcodeGen\n# Xcode is only used to build the release App Bundle. Debug builds only use Swift Package Manager\n\nname: AeroSpace\n\npackages:\n  AeroSpacePackage:\n    path: .\n\nconfigs:\n  Debug: debug\n  Release: release\n\ntargets:\n  AeroSpace:\n    type: application\n    platform: macOS\n    deploymentTarget: \"13.0\"\n    sources:\n      - \"Sources/AeroSpaceApp\"\n      - \"resources\"\n      - \"docs/config-examples/default-config.toml\"\n    dependencies:\n      - package: AeroSpacePackage\n        product: AppBundle\n    # https://developer.apple.com/documentation/xcode/build-settings-reference\n    settings:\n      base:\n        SWIFT_VERSION: 6.2 # Swift Language Version\n        GENERATE_INFOPLIST_FILE: YES\n        MARKETING_VERSION: ${XCODEGEN_AEROSPACE_VERSION}\n        # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/20001431-108256\n        # Specifies whether the app runs as an agent app. If this key is set to YES, Launch Services runs the app as an agent app.\n        # Agent apps do not appear in the Dock or in the Force Quit window (cmd-opt-esc)\n        INFOPLIST_KEY_LSUIElement: YES\n        CODE_SIGN_IDENTITY: ${XCODEGEN_AEROSPACE_CODE_SIGN_IDENTITY}\n      configs:\n        Debug:\n          PRODUCT_NAME: AeroSpace-Debug\n          PRODUCT_BUNDLE_IDENTIFIER: bobko.aerospace.debug\n        Release:\n          PRODUCT_NAME: AeroSpace\n          PRODUCT_BUNDLE_IDENTIFIER: bobko.aerospace\n          SWIFT_TREAT_WARNINGS_AS_ERRORS: YES\n          GCC_TREAT_WARNINGS_AS_ERRORS: YES\n    entitlements:\n      path: resources/AeroSpace.entitlements\n      properties:\n        # Accessibility API doesn't work in sandboxed apps\n        com.apple.security.app-sandbox: false\n"
  },
  {
    "path": "resources/AeroSpace.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "resources/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "resources/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"filename\" : \"icon.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "resources/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "run-cli.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\n./build-debug.sh > /dev/null || ./build-debug.sh\n./.debug/aerospace \"$@\"\n"
  },
  {
    "path": "run-debug.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\n./build-debug.sh\n./.debug/AeroSpaceApp \"$@\"\n"
  },
  {
    "path": "run-swift-test.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\nif swift test \\\n    | sed -E '/^Test (Suite|Case).*(started|passed)/d' \\\n    | sed -E '/^[[:space:]]+Executed.*with 0 failures/d' \\\n    | sed -E '/ [[:digit:]]+(:[[:digit:]]+)+/s/:/;/g' # Replace colons with semicolons in dates to avoid treating these lines as files in vim\nthen\n    echo \"✅ Swift tests have passed successfully\"\nelse\n    echo \"❌ Swift tests have failed\"\n    exit 1\nfi\n"
  },
  {
    "path": "run-tests.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")\"\nsource ./script/setup.sh\n\n./script/check-uncommitted-files.sh\n\n./build-debug.sh -Xswiftc -warnings-as-errors\n./run-swift-test.sh\n\n./.debug/aerospace -h > /dev/null\n./.debug/aerospace --help > /dev/null\n./.debug/aerospace -v | grep -q \"0.0.0-SNAPSHOT SNAPSHOT\"\n./.debug/aerospace --version | grep -q \"0.0.0-SNAPSHOT SNAPSHOT\"\n\n./lint.sh --check-uncommitted-files\n./generate.sh\n./script/check-uncommitted-files.sh\n\necho\necho \"✅ All tests have passed successfully\"\n"
  },
  {
    "path": "script/build-brew-cask.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")/..\"\nsource ./script/setup.sh\n\nzip_uri='' # mandatory\ncask_name='' # mandatory\nbuild_version=\"0.0.0-SNAPSHOT\"\nwhile test $# -gt 0; do\n    case $1 in\n        --build-version) build_version=\"$2\"; shift 2;;\n        --zip-uri) zip_uri=\"$2\"; shift 2;;\n        --cask-name) cask_name=\"$2\"; shift 2;;\n        *) echo \"Unknown arg $1\"; exit 1;;\n    esac\ndone\n\nif test -z \"$zip_uri\"; then echo \"--zip-uri is mandatory\" > /dev/stderr; exit 1; fi\nif test -z \"$cask_name\"; then echo \"--cask-name is mandatory\" > /dev/stderr; exit 1; fi\n\ncase \"$cask_name\" in\n    aerospace) conflicts_with_casks=\"conflicts_with cask: 'aerospace-dev'\";;\n    aerospace-dev) conflicts_with_casks=\"conflicts_with cask: 'aerospace'\";;\n    *) echo \"Unknown cask name: $cask_name. Allowed cask names: aerospace, aerospace-dev\" > /dev/stderr; exit 1;;\nesac\n\nzip_file=''\nif test -f \"$zip_uri\"; then\n    zip_file=$zip_uri\n    zip_uri=\"file://$(realpath \"$zip_file\")\"\nelif grep -q '^http' <<< \"$zip_uri\"; then\n    zip_file=/tmp/AeroSpace-tmp.zip\n    rm -rf $zip_file\n    curl -L \"$zip_uri\" -o $zip_file\nelse\n    echo \"$zip_uri doesn't exist\" > /dev/stderr; exit 1\nfi\nsha=$(shasum -a 256 \"$zip_file\" | awk '{print $1}')\n\ncask_version=':latest' # Prevent 'Not upgrading aerospace, the latest version is already installed'\nzip_root_dir=\"AeroSpace-v$build_version\"\nif ! grep -q SNAPSHOT <<< \"$build_version\"; then\n    cask_version=\"'$build_version'\"\n    zip_root_dir=$(sed \"s/$build_version/#{version}/g\" <<< \"$zip_root_dir\")\n    zip_uri=$(sed \"s/$build_version/#{version}/g\" <<< \"$zip_uri\")\nfi\n\nrm -f \".release/$cask_name.rb\" || true\nmkdir -p .release\ncat > \".release/$cask_name.rb\" <<EOF\ncask \"$cask_name\" do # THE FILE IS GENERATED BY build-brew-cask.sh\n  version $cask_version\n  sha256 \"$sha\"\n\n  url \"$zip_uri\"\n  name \"AeroSpace\"\n  desc \"AeroSpace is an i3-like tiling window manager for macOS\"\n  homepage \"https://github.com/nikitabobko/AeroSpace\"\n  $conflicts_with_casks\n\n  depends_on macos: \">= :ventura\" # macOS 13\n\n  postflight do\n    system \"xattr -d com.apple.quarantine #{staged_path}/$zip_root_dir/bin/aerospace\"\n    system \"xattr -d com.apple.quarantine #{appdir}/AeroSpace.app\"\n  end\n\n  app \"$zip_root_dir/AeroSpace.app\"\n  binary \"$zip_root_dir/bin/aerospace\"\n\n  binary \"$zip_root_dir/shell-completion/zsh/_aerospace\",\n      target: \"#{HOMEBREW_PREFIX}/share/zsh/site-functions/_aerospace\"\n  binary \"$zip_root_dir/shell-completion/bash/aerospace\",\n      target: \"#{HOMEBREW_PREFIX}/etc/bash_completion.d/aerospace\"\n  binary \"$zip_root_dir/shell-completion/fish/aerospace.fish\",\n      target: \"#{HOMEBREW_PREFIX}/share/fish/vendor_completions.d/aerospace.fish\"\n\n  Dir[\"#{staged_path}/$zip_root_dir/manpage/*\"].each { |man| manpage man }\nend\nEOF\n"
  },
  {
    "path": "script/check-uncommitted-files.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")/..\"\nsource ./script/setup.sh\n\nif ! test -z \"$(git status --porcelain)\"; then\n    echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    echo !!! Uncommitted files detected !!!\n    echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    git diff | sed 's/^/    /'\n    echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    echo !!! Uncommitted files detected !!!\n    echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    exit 1\nfi\n"
  },
  {
    "path": "script/clean-project.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")/..\"\nsource ./script/setup.sh\n\n./script/clean-xcode.sh\ngit clean -ffxd\n"
  },
  {
    "path": "script/clean-xcode.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")/..\"\nsource ./script/setup.sh\n\n./script/check-uncommitted-files.sh\n\nrm -rf ~/Library/Developer/Xcode/DerivedData/AeroSpace-*\nrm -rf ./.xcode-build\n\nrm -rf AeroSpace.xcodeproj\n./generate.sh\n"
  },
  {
    "path": "script/generate-cmd-help.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")/..\"\nsource ./script/setup.sh\n\nout_file='./Sources/Common/cmdHelpGenerated.swift'\n\naerospace_prefix=\"aerospace\"\n____usage_prefix=\"   USAGE:\"\n_______or_prefix=\"      OR:\"\n____strip_prefix=\"   \"\n\ntriple_quote='\"\"\"'\n\ncat << EOF > $out_file\n// FILE IS GENERATED FROM docs/aerospace-*.adoc files\n// TO REGENERATE THE FILE RUN generate.sh\n\nEOF\n\nfor file in docs/aerospace-*.adoc; do\n    subcommand=$(basename \"$file\" | sed 's/^aerospace-//' | sed 's/\\.adoc$//' | sed 's/-/_/g')\n    sed -n -E '/tag::synopsis/, /end::synopsis/ p' \"$file\" | \\\n        sed '1d' | \\\n        sed '$d' | \\\n        sed '/^$/ d' | \\\n        sed \"1   s/^$aerospace_prefix/$____usage_prefix/\" | \\\n        sed \"2,$ s/^$aerospace_prefix/$_______or_prefix/\" | \\\n        sed     \"s/^$____strip_prefix//\" | \\\n        sed \"1 s/^/let ${subcommand}_help_generated = $triple_quote\\n/\" | \\\n        sed \"\\$ s/$/\\n${triple_quote}/\" | \\\n        sed '2,$ s/^/    /' >> $out_file\ndone\n"
  },
  {
    "path": "script/install-dep.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")/..\"\nsource ./script/setup.sh\n\nall=0\nantlr=0\ncomplgen=0\nswiftlint=0\nswiftformat=0\nxcodegen=0\nbundler=0\nperiphery=0\nwhile test $# -gt 0; do\n    case $1 in\n        --antlr) antlr=1; shift ;;\n        --complgen) complgen=1; shift ;;\n        --swiftlint) swiftlint=1; shift ;;\n        --xcodegen) xcodegen=1; shift ;;\n        --swiftformat) swiftformat=1; shift ;;\n        --bundler) bundler=1; shift ;;\n        --periphery) periphery=1; shift ;;\n        --all) all=1; shift ;;\n        *) echo \"Unknown option $1\"; exit 1 ;;\n    esac\ndone\n\nget-marker() { echo \".deps/markers/$1/$(echo \"$@\" | shasum | awk '{print $1}').marker\"; }\n\ncreate-marker() {\n    dir=\"$(dirname \"$1\")\"\n    rm -rf \"$dir\" && mkdir -p \"$dir\"\n    touch \"$1\"\n}\n\nif test $all == 1 || test $bundler == 1; then\n    marker=$(get-marker bundler \"$(cat ./Gemfile)\" \"$(cat ./.bundle/*)\")\n    if ! test -f \"$marker\"; then\n        bundler install\n        create-marker \"$marker\"\n    fi\nfi\n\nif test $all == 1 || test $antlr == 1; then\n    # https://github.com/antlr/antlr4/releases\n    antlr_tools='antlr4-tools==0.2.1'\n    marker=$(get-marker antlr $antlr_tools $antlr_version)\n    if ! test -f \"$marker\"; then\n        python3 -m venv .deps/python-venv\n        source .deps/python-venv/bin/activate\n        python3 -m pip install \"$antlr_tools\"\n        create-marker \"$marker\"\n    fi\nfi\n\nif test $all == 1 || test $complgen == 1; then\n    # https://github.com/adaszko/complgen/releases\n    complgen_rev=cacb3970eb\n    marker=$(get-marker complgen $complgen_rev)\n    if ! test -f \"$marker\"; then\n        cargo install --git https://github.com/adaszko/complgen --rev $complgen_rev --root ./.deps/cargo-root\n        create-marker \"$marker\"\n    fi\nfi\n\nlazy-download-zip-and-link-bin() {\n    artifact_name=$1\n    link=$2\n    sha=$3\n    path_inside_zip=$4\n\n    root_path=\".deps/$artifact_name\"\n    marker_path=$(get-marker \"$artifact_name\" \"$@\")\n\n    if ! test -f \"$marker_path\"; then\n        root_dist_path=\"$root_path/dist\"\n        zip_name=\"zip.zip\"\n        zip_path=\"$root_dist_path/$zip_name\"\n\n        rm -rf \"$root_path\" && mkdir -p \"$root_dist_path\"\n        curl -L \"$link\" -o \"$zip_path\"\n        diff --color <(echo \"$sha\") <(shasum -a 256 \"$zip_path\")\n        (cd \"$root_dist_path\" && unzip \"$zip_name\")\n        (cd \"$root_path\" && ln -s \"./dist/$path_inside_zip\" \"$artifact_name\")\n\n        create-marker \"$marker_path\"\n    fi\n}\n\nif test $all == 1 || test $swiftlint == 1; then\n    # https://github.com/realm/SwiftLint/releases\n    swiftlint_version=0.62.2\n    lazy-download-zip-and-link-bin \\\n        swiftlint \\\n        https://github.com/realm/SwiftLint/releases/download/$swiftlint_version/SwiftLintBinary.artifactbundle.zip \\\n        '3047357eee0838a0bafc7a6e65cd1aad61734b30d7233e28f3434149fe02f522  .deps/swiftlint/dist/zip.zip' \\\n        SwiftLintBinary.artifactbundle/macos/swiftlint\nfi\n\nif test $all == 1 || test $xcodegen == 1; then\n    # https://github.com/yonaskolb/XcodeGen/releases\n    xcodegen_version=2.44.1\n    lazy-download-zip-and-link-bin \\\n        xcodegen \\\n        https://github.com/yonaskolb/XcodeGen/releases/download/$xcodegen_version/xcodegen.artifactbundle.zip \\\n        'cfa4e1ee82fc4c95bf7bd8f7db1fda6bd073605c76a8d5cbce50c54a81867eb2  .deps/xcodegen/dist/zip.zip' \\\n        xcodegen.artifactbundle/xcodegen-$xcodegen_version-macosx/bin/xcodegen\nfi\n\nif test $all == 1 || test $swiftformat == 1; then\n    # https://github.com/nicklockwood/SwiftFormat/releases\n    swiftformat_version=0.58.6\n    lazy-download-zip-and-link-bin \\\n        swiftformat \\\n        https://github.com/nicklockwood/SwiftFormat/releases/download/$swiftformat_version/swiftformat.artifactbundle.zip \\\n        'd2ee571b3f15c173b1789b82b9fcf1e799cff66de0ae9f6839bd35aa8e9b9608  .deps/swiftformat/dist/zip.zip' \\\n        swiftformat.artifactbundle/swiftformat-$swiftformat_version-macos/bin/swiftformat\nfi\n\nif test $all == 1 || test $periphery == 1; then\n    # https://github.com/peripheryapp/periphery/releases\n    periphery_version=3.6.0\n    lazy-download-zip-and-link-bin \\\n        periphery \\\n        https://github.com/peripheryapp/periphery/releases/download/$periphery_version/periphery-$periphery_version.zip \\\n        '983cb6bad09b7030f0ec151e05f650dbf450eb624bd361a0ad89c59fdbf18182  .deps/periphery/dist/zip.zip' \\\n        periphery\nfi\n"
  },
  {
    "path": "script/publish-release.sh",
    "content": "#!/bin/bash\ncd \"$(dirname \"$0\")/..\"\nsource ./script/setup.sh\n\nbuild_version=\"\"\ncask_git_repo_path=\"\"\nsite_git_repo_path=\"\"\nwhile test $# -gt 0; do\n    case $1 in\n        --build-version) build_version=\"$2\"; shift 2;;\n        --cask-git-repo-path) cask_git_repo_path=\"$2\"; shift 2;;\n        --site-git-repo-path) site_git_repo_path=\"$2\"; shift 2;;\n        *) echo \"Unknown option $1\"; exit 1;;\n    esac\ndone\n\nif test -z \"$build_version\"; then\n    echo \"--build-version flag is mandatory\" > /dev/stderr\n    exit 1\nfi\n\nif ! test -d \"$cask_git_repo_path\"; then\n    echo \"--cask-git-repo-path is a mandatory flag that must point to existing directory\" > /dev/stderr\n    exit 1\nfi\n\nif ! test -d \"$site_git_repo_path\"; then\n    echo \"--site-git-repo-path is a mandatory flag that must point to existing directory\" > /dev/stderr\n    exit 1\nfi\n\n./run-tests.sh\n./build-release.sh --build-version \"$build_version\"\n\ngit tag -a \"v$build_version\" -m \"v$build_version\" && git push git@github.com:nikitabobko/AeroSpace.git \"v$build_version\"\nlink=\"https://github.com/nikitabobko/AeroSpace/releases/new?tag=v$build_version\"\nopen \"$link\" || { echo \"$link\"; exit 1; }\nsleep 1\nopen -R \"./.release/AeroSpace-v$build_version.zip\"\n\necho \"Please upload .zip to GitHub release and hit Enter\"\nread -r\n\n./script/build-brew-cask.sh \\\n    --cask-name aerospace \\\n    --zip-uri \"https://github.com/nikitabobko/AeroSpace/releases/download/v$build_version/AeroSpace-v$build_version.zip\" \\\n    --build-version \"$build_version\"\n\neval \"$cask_git_repo_path/pin.sh\"\ncp -r .release/aerospace.rb \"$cask_git_repo_path/Casks/aerospace.rb\"\n\nrm -rf \"${site_git_repo_path:?}/*\" # https://www.shellcheck.net/wiki/SC2115\ncp -r .site/* \"$site_git_repo_path\"\n"
  },
  {
    "path": "script/reset-accessibility-permission-for-debug.sh",
    "content": "#!/bin/bash\nset -e # Exit if one of commands exit with non-zero exit code\nset -u # Treat unset variables and parameters other than the special parameters ‘@’ or ‘*’ as an error\nset -o pipefail # Any command failed in the pipe fails the whole pipe\n# set -x # Print shell commands as they are executed (or you can try -v which is less verbose)\n\ntccutil reset Accessibility bobko.AeroSpace.debug\n"
  },
  {
    "path": "script/setup.sh",
    "content": "#!/bin/bash\nset -e # Exit if one of commands exit with non-zero exit code\nset -u # Treat unset variables and parameters other than the special parameters ‘@’ or ‘*’ as an error\nset -o pipefail # Any command failed in the pipe fails the whole pipe\n# set -x # Print shell commands as they are executed (or you can try -v which is less verbose)\n\n# Don't forget to also update ./ShellParserGenerated/Package.swift\nexport antlr_version=\"4.13.1\"\n\nadd-optional-dep-to-bin() {\n    if /usr/bin/which \"$1\" &> /dev/null; then\n        /bin/cat > \".deps/bin/${2:-$1}\" <<EOF\n#!/bin/bash\nexec '$(/usr/bin/which \"$1\")' \"\\$@\"\nEOF\n    fi\n}\n\nif /bin/test -z \"${NUKE_PATH:-}\"; then\n    /bin/rm -rf .deps/bin\n    /bin/mkdir -p .deps/bin\n\n    add-optional-dep-to-bin bash not-outdated-bash # build-shell-completion.sh\n    add-optional-dep-to-bin fish # build-shell-completion.sh\n    add-optional-dep-to-bin rustc # build-shell-completion.sh\n    add-optional-dep-to-bin cargo # build-shell-completion.sh\n    add-optional-dep-to-bin brew # install-from-sources.sh\n    add-optional-dep-to-bin bundle # build-docs.sh\n    add-optional-dep-to-bin bundler # build-docs.sh\n    add-optional-dep-to-bin xcbeautify # build-release.sh\n    add-optional-dep-to-bin git\n    add-optional-dep-to-bin swift\n    add-optional-dep-to-bin swiftly\n\n    export PATH=\"${PWD}/.deps/bin:/bin:/usr/bin\"\n    chmod +x .deps/bin/*\n    export NUKE_PATH=1\nfi\n\nswift() {\n    if /usr/bin/which swiftly &> /dev/null; then\n        swiftly run swift \"$@\"\n    else\n        echo \"warning: swiftly is not installed. Fallback to plain swift. Swift compilation might not be reproducible\" > /dev/stderr\n        /usr/bin/env swift --version\n        /usr/bin/env swift \"$@\"\n    fi\n}\n\nxcodebuild-pretty() {\n    log_file=\"$1\"\n    shift\n    # Mute stderr\n    # 2024-02-12 23:48:11.713 xcodebuild[60777:7403664] [MT] DVTAssertions: Warning in /System/Volumes/Data/SWE/Apps/DT/BuildRoots/BuildRoot11/ActiveBuildRoot/Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-22269/IDEFoundation/Provisioning/Capabilities Infrastructure/IDECapabilityQuerySelection.swift:103\n    # Details:  createItemModels creation requirements should not create capability item model for a capability item model that already exists.\n    # Function: createItemModels(for:itemModelSource:)\n    # Thread:   <_NSMainThread: 0x6000037202c0>{number = 1, name = main}\n    # Please file a bug at https://feedbackassistant.apple.com with this warning message and any useful information you can provide.\n    if /usr/bin/which xcbeautify &> /dev/null; then\n        /usr/bin/xcrun xcodebuild \"$@\" 2>&1 | tee \"$log_file\" | xcbeautify --quiet # Only print tasks that have warnings or errors\n        echo \"The full unmodified xcodebuild log is saved to $log_file\"\n    else\n        /usr/bin/xcrun xcodebuild \"$@\" 2>&1 | tee \"$log_file\"\n    fi\n}\n"
  }
]