[
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n\n*.bat text eol=crlf\n*.jar binary"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug report\ndescription: Report a bug of Shizuku\n\nbody:\n  - type: checkboxes\n    id: requirements\n    attributes:\n      label: Requirements\n      options:\n        - label: Shizuku is downloaded from official channels (GitHub release or Google Play)\n        - label: Shizuku is not running in a virtual environment or broken ROM (GrapheneOS)\n        - label: (Root users) No Xposed installed / Xposed is not enabled for Shizuku\n\n  - type: input\n    id: version\n    attributes:\n      label: Latest Shizuku version\n    validations:\n      required: true\n\n  - type: input\n    id: shizuku_version\n    attributes:\n      label: Version in use\n    validations:\n      required: true\n\n  - type: dropdown\n    id: mode\n    attributes:\n      label: Mode\n      options:\n        - adb\n        - root\n        - manual\n    validations:\n      required: true\n\n  - type: input\n    id: android_version\n    attributes:\n      label: Android version\n    validations:\n      required: true\n\n  - type: input\n    id: device\n    attributes:\n      label: Device\n    validations:\n      required: true\n\n  - type: textarea\n    id: reproducer\n    attributes:\n      label: What did you do\n\n  - type: textarea\n    id: logs\n    attributes:\n      label: What happened\n      description: You can upload log and screenshot\n\n  - type: textarea\n    id: expected-behaviour\n    attributes:\n      label: What do you expect\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: GitHub Community Support\n    url: https://github.com/RikkaApps/Shizuku/discussions\n    about: Please ask and answer questions here.\n"
  },
  {
    "path": ".github/workflows/app.yml",
    "content": "name: App\n\non:\n  push:\n    paths-ignore:\n      - '.github/ISSUE_TEMPLATE'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          submodules: 'recursive'\n          fetch-depth: 0\n      - name: Setup Java\n        uses: actions/setup-java@v4\n        with:\n          distribution: 'temurin'\n          java-version: '21'\n      - name: Write key\n        if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master'\n        run: |\n          echo KEYSTORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }} > signing.properties\n          echo KEYSTORE_ALIAS=${{ secrets.KEYSTORE_ALIAS }} >> signing.properties\n          echo KEYSTORE_ALIAS_PASSWORD='${{ secrets.KEYSTORE_ALIAS_PASSWORD }}' >> signing.properties\n          echo KEYSTORE_FILE=../key.jks >> signing.properties\n          echo ${{ secrets.KEYSTORE }} | base64 --decode > key.jks\n      - name: Setup Gradle\n        uses: gradle/actions/setup-gradle@v4\n        with:\n          dependency-graph: generate-and-submit\n          build-scan-publish: true\n          build-scan-terms-of-use-url: \"https://gradle.com/terms-of-service\"\n          build-scan-terms-of-use-agree: \"yes\"\n      - name: Build with Gradle\n        id: buildWithGradle\n        run: |\n          yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses > /dev/null || true\n          echo 'android.sdk.channel=3' >> gradle.properties\n          echo 'android.native.buildOutput=verbose' >> gradle.properties\n          echo 'org.gradle.caching=true' >> gradle.properties\n          echo 'org.gradle.parallel=true' >> gradle.properties\n          ./gradlew :manager:assemble\n          releaseName=`ls manager/build/outputs/apk/release/shizuku*-v*-release.apk | awk -F '(/|-release.apk)' '{print $6}'` && echo \"releaseName=$releaseName\" >> $GITHUB_OUTPUT\n      - name: Upload release\n        if: success()\n        uses: actions/upload-artifact@v4\n        with:\n          name: ${{ steps.buildWithGradle.outputs.releaseName }}\n          path: \"manager/build/outputs\"\n          compression-level: 9\n"
  },
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n/.idea\n/manager/signing.properties\n/out\n/signing.properties\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"api\"]\n\tpath = api\n\turl = git@github.com:RikkaApps/Shizuku-API.git\n\tbranch = master\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 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."
  },
  {
    "path": "README.md",
    "content": "# Shizuku\n\n## Background\n\nWhen developing apps that requires root, the most common method is to run some commands in the su shell. For example, there is an app that uses the `pm enable/disable` command to enable/disable components.\n\nThis method has very big disadvantages:\n\n1. **Extremely slow** (Multiple process creation)\n2. Needs to process texts (**Super unreliable**)\n3. The possibility is limited to available commands\n4. Even if ADB has sufficient permissions, the app requires root privileges to run\n\nShizuku uses a completely different way. See detailed description below.\n\n## User guide & Download\n\n<https://shizuku.rikka.app/>\n\n## How does Shizuku work?\n\nFirst, we need to talk about how app use system APIs. For example, if the app wants to get installed apps, we all know we should use `PackageManager#getInstalledPackages()`. This is actually an interprocess communication (IPC) process of the app process and system server process, just the Android framework did the inner works for us.\n\nAndroid uses `binder` to do this type of IPC. `Binder` allows the server-side to learn the uid and pid of the client-side, so that the system server can check if the app has the permission to do the operation.\n\nUsually, if there is a \"manager\" (e.g., `PackageManager`) for apps to use, there should be a \"service\" (e.g., `PackageManagerService`) in the system server process. We can simply think if the app holds the `binder` of the \"service\", it can communicate with the \"service\". The app process will receive binders of system services on start.\n\nShizuku guides users to run a process, Shizuku server, with root or ADB first. When the app starts, the `binder` to Shizuku server will also be sent to the app.\n\nThe most important feature Shizuku provides is something like be a middle man to receive requests from the app, sent them to the system server, and send back the results. You can see the `transactRemote` method in `rikka.shizuku.server.ShizukuService` class, and `moe.shizuku.api.ShizukuBinderWrapper` class for the detail.\n\nSo, we reached our goal, to use system APIs with higher permission. And to the app, it is almost identical to the use of system APIs directly.\n\n## Developer guide\n\n### API & sample\n\nhttps://github.com/RikkaApps/Shizuku-API\n\n### Migrating from pre-v11\n\n> Existing applications still works, of course.\n\nhttps://github.com/RikkaApps/Shizuku-API#migration-guide-for-existing-applications-use-shizuku-pre-v11\n\n### Attention\n\n1. ADB permissions are limited\n\n   ADB has limited permissions and different on various system versions. You can see permissions granted to ADB [here](https://github.com/aosp-mirror/platform_frameworks_base/blob/master/packages/Shell/AndroidManifest.xml).\n\n   Before calling the API, you can use `ShizukuService#getUid` to check if Shizuku is running user ADB, or use `ShizukuService#checkPermission` to check if the server has sufficient permissions.\n\n2. Hidden API limitation from Android 9\n\n   As of Android 9, the usage of the hidden APIs is limited for normal apps. Please use other methods (such as <https://github.com/LSPosed/AndroidHiddenApiBypass>).\n\n3. Android 8.0 & ADB\n\n   At present, the way Shizuku service gets the app process is to combine `IActivityManager#registerProcessObserver` and `IActivityManager#registerUidObserver` (26+) to ensure that the app process will be sent when the app starts. However, on API 26, ADB lacks permissions to use `registerUidObserver`, so if you need to use Shizuku in a process that might not be started by an Activity, it is recommended to trigger the send binder by starting a transparent activity.\n\n4. Direct use of `transactRemote` requires attention\n\n   * The API may be different under different Android versions, please be sure to check it carefully. Also, the `android.app.IActivityManager` has the aidl form in API 26 and later, and `android.app.IActivityManager$Stub` exists only on API 26.\n\n   * `SystemServiceHelper.getTransactionCode` may not get the correct transaction code, such as `android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages` does not exist on API 25 and there is `android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages_47` (this situation has been dealt with, but it is not excluded that there may be other circumstances). This problem is not encountered with the `ShizukuBinderWrapper` method.\n\n## Developing Shizuku itself\n\n### Build\n\n- Clone with `git clone --recurse-submodules`\n- Run gradle task `:manager:assembleDebug` or `:manager:assembleRelease`\n\nThe `:manager:assembleDebug` task generates a debuggable server. You can attach a debugger to `shizuku_server` to debug the server. Be aware that, in Android Studio, \"Run/Debug configurations\" - \"Always install with package manager\" should be checked, so that the server will use the latest code.\n\n## License\n\nAll code files in this project are licensed under Apache 2.0\n\nUnder Apache 2.0 section 6, specifically:\n\n* You are **FORBIDDEN** to use `manager/src/main/res/mipmap*/ic_launcher*.png` image files, unless for displaying Shizuku itself.\n\n* You are **FORBIDDEN** to use `Shizuku` as app name or use `moe.shizuku.privileged.api` as application id or declare `moe.shizuku.manager.permission.*` permission.\n"
  },
  {
    "path": "build.gradle",
    "content": "plugins {\n    id(\"idea\")\n}\n\nidea.module {\n    excludeDirs += file('out')\n}\n\nsubprojects {\n    plugins.withId(\"com.android.base\") {\n        android {\n            compileSdk = 36\n            buildToolsVersion = \"36.0.0\"\n            ndkVersion = \"29.0.13113456\"\n            defaultConfig {\n                minSdk = 24\n                targetSdk = 36\n            }\n            compileOptions {\n                sourceCompatibility = JavaVersion.VERSION_21\n                targetCompatibility = JavaVersion.VERSION_21\n            }\n        }\n    }\n}\n\napply from: 'api/manifest.gradle'\ndef gitCommitId = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim()\ndef gitCommitCount = Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())\ndef baseVersionName = \"${api_version_major}.6.0\"\next {\n    versionCode = gitCommitCount\n    versionName = \"${baseVersionName}.r${gitCommitCount}.${gitCommitId}\"\n}\n"
  },
  {
    "path": "common/.gitignore",
    "content": "/build"
  },
  {
    "path": "common/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n}\n\nandroid {\n    namespace 'rikka.shizuku.common'\n    buildFeatures {\n        buildConfig = false\n    }\n}\n\ndependencies {\n    compileOnly libs.hidden.stub\n}\n"
  },
  {
    "path": "common/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest />\n"
  },
  {
    "path": "common/src/main/java/moe/shizuku/common/util/BuildUtils.java",
    "content": "package moe.shizuku.common.util;\n\nimport android.os.Build;\n\n/**\n * TODO: Replace it with {@link rikka.core.util.BuildUtils}.\n */\npublic class BuildUtils {\n\n    private static final int SDK = Build.VERSION.SDK_INT;\n\n    private static final int PREVIEW_SDK = SDK >= 23 ? Build.VERSION.PREVIEW_SDK_INT : 0;\n\n    public static boolean atLeast31() {\n        return SDK >= 31 || SDK == 30 && PREVIEW_SDK > 0;\n    }\n\n    public static boolean atLeast30() {\n        return SDK >= 30;\n    }\n\n    public static boolean atLeast29() {\n        return SDK >= 29;\n    }\n\n    public static boolean atLeast28() {\n        return SDK >= 28;\n    }\n\n    public static boolean atLeast26() {\n        return SDK >= 26;\n    }\n\n    public static boolean atLeast24() {\n        return SDK >= 24;\n    }\n\n    public static boolean atLeast23() {\n        return SDK >= 23;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/moe/shizuku/common/util/OsUtils.java",
    "content": "package moe.shizuku.common.util;\n\nimport android.os.SELinux;\n\npublic class OsUtils {\n\n    private static final int UID = android.system.Os.getuid();\n    private static final int PID = android.system.Os.getpid();\n    private static final String SELINUX_CONTEXT;\n\n    static {\n        String context;\n        try {\n            context = SELinux.getContext();\n        } catch (Throwable tr) {\n            context = null;\n        }\n        SELINUX_CONTEXT = context;\n    }\n\n\n    public static int getUid() {\n        return UID;\n    }\n\n    public static int getPid() {\n        return PID;\n    }\n\n    public static String getSELinuxContext() {\n        return SELINUX_CONTEXT;\n    }\n}\n\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\nandroid.useAndroidX=true\nandroid.nonTransitiveRClass=false\nandroid.nonFinalResIds=false\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\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#      https://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# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=\"\\\\\\\"\\\\\\\"\"\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "manager/.gitignore",
    "content": "/build\n/signing.properties\n/.cxx"
  },
  {
    "path": "manager/aapt2-resources.cfg",
    "content": "color/material_orange_50#no_obfuscate\ncolor/material_indigo_50#no_obfuscate\ncolor/material_blue_grey_50#no_obfuscate\ncolor/material_teal_50#no_obfuscate\ncolor/material_cyan_50#no_obfuscate\ncolor/material_blue_50#no_obfuscate\ncolor/material_blue_grey_50#no_obfuscate\ncolor/material_deep_purple_50#no_obfuscate\ncolor/material_red_50#no_obfuscate\n\ncolor/material_orange_100#no_obfuscate\ncolor/material_indigo_100#no_obfuscate\ncolor/material_blue_grey_100#no_obfuscate\ncolor/material_teal_100#no_obfuscate\ncolor/material_cyan_100#no_obfuscate\ncolor/material_blue_100#no_obfuscate\ncolor/material_blue_grey_100#no_obfuscate\ncolor/material_deep_purple_100#no_obfuscate\ncolor/material_red_100#no_obfuscate\n\ncolor/material_orange_600#no_obfuscate\ncolor/material_indigo_600#no_obfuscate\ncolor/material_blue_grey_600#no_obfuscate\ncolor/material_teal_600#no_obfuscate\ncolor/material_cyan_600#no_obfuscate\ncolor/material_blue_600#no_obfuscate\ncolor/material_blue_grey_600#no_obfuscate\ncolor/material_deep_purple_600#no_obfuscate\ncolor/material_red_600#no_obfuscate\n"
  },
  {
    "path": "manager/build.gradle",
    "content": "import java.nio.file.Paths\nimport com.android.build.gradle.internal.tasks.CompileArtProfileTask\n\nplugins {\n    id('com.android.application')\n    id('org.jetbrains.kotlin.android')\n    id('dev.rikka.tools.refine')\n    id('dev.rikka.tools.autoresconfig')\n    id('dev.rikka.tools.materialthemebuilder')\n}\n\nandroid {\n    namespace 'moe.shizuku.manager'\n    defaultConfig {\n        applicationId \"moe.shizuku.privileged.api\"\n        versionCode rootProject.ext.versionCode\n        versionName rootProject.ext.versionName\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=none'\n            }\n        }\n    }\n    buildFeatures {\n        buildConfig true\n        viewBinding true\n        prefab true\n    }\n    signingConfigs {\n        sign\n    }\n    buildTypes {\n        debug {\n            signingConfig signingConfigs.sign\n        }\n        release {\n            signingConfig signingConfigs.sign\n            minifyEnabled true\n            shrinkResources true\n            vcsInfo.include false\n            proguardFiles 'proguard-rules.pro'\n        }\n    }\n    externalNativeBuild {\n        cmake {\n            path 'src/main/jni/CMakeLists.txt'\n            version = \"3.31.0+\"\n        }\n    }\n    kotlinOptions {\n        jvmTarget = \"21\"\n    }\n    packagingOptions {\n        jniLibs {\n            useLegacyPackaging true\n        }\n        resources {\n            excludes += ['**']\n        }\n    }\n    dependenciesInfo {\n        includeInApk false\n    }\n    lint {\n        checkReleaseBuilds false\n    }\n}\n\nautoResConfig {\n    generatedClassFullName = \"rikka.shizuku.manager.ShizukuLocales\"\n    generateRes = false\n    generatedArrayFirstItem = \"SYSTEM\"\n    generateLocaleConfig = true\n}\n\nmaterialThemeBuilder {\n    themes {\n        shizuku {\n            primaryColor = \"#3F51B5\"\n            lightThemeFormat = \"Theme.Material3.Light.%s\"\n            lightThemeParent = \"Theme.Material3.Light.Rikka\"\n            darkThemeFormat = \"Theme.Material3.Dark.%s\"\n            darkThemeParent = \"Theme.Material3.Dark.Rikka\"\n        }\n    }\n    generatePalette = true\n    generateTextColors = true\n}\n\ndef collapseReleaseResourceNames = task('collapseReleaseResourceNames').doLast {\n    def aapt2 = Paths.get(project.android.sdkDirectory.path, 'build-tools', project.android.buildToolsVersion, 'aapt2')\n    def zip = Paths.get(project.buildDir.path, 'intermediates',\n            'optimized_processed_res', 'release', 'optimizeReleaseResources', 'resources-release-optimize.ap_')\n    def optimized = new File(\"${zip}.opt\")\n    def cmd = exec {\n        commandLine aapt2, 'optimize', '--collapse-resource-names',\n                '--resources-config-path', 'aapt2-resources.cfg',\n                '-o', optimized, zip\n        ignoreExitValue false\n    }\n    if (cmd.exitValue == 0) {\n        delete(zip)\n        optimized.renameTo(\"$zip\")\n    }\n}\n\nafterEvaluate {\n    tasks.getByName('optimizeReleaseResources').finalizedBy(collapseReleaseResourceNames)\n    tasks.getByName('preReleaseBuild').dependsOn(':shell:assembleRelease')\n    tasks.getByName('preDebugBuild').dependsOn(':shell:assembleDebug')\n}\n\nandroid.applicationVariants.configureEach { variant ->\n    variant.outputs.configureEach {\n        outputFileName = \"shizuku-v${variant.versionName}-${variant.name}.apk\"\n\n        variant.assembleProvider.get().doLast {\n            def outDir = new File(rootDir, \"out\")\n            def mappingDir = new File(outDir, \"mapping\").absolutePath\n            def apkDir = new File(outDir, \"apk\").absolutePath\n\n            if (variant.getBuildType().isMinifyEnabled()) {\n                copy {\n                    from variant.mappingFileProvider.get()\n                    into mappingDir\n                    rename { String fileName -> \"mapping-${variant.versionName}.txt\" }\n                }\n                copy {\n                    from outputFile\n                    into apkDir\n                }\n            }\n        }\n    }\n}\n\ntasks.withType(CompileArtProfileTask.class).configureEach {\n    enabled = false\n}\nconfigurations.configureEach {\n    exclude group: 'androidx.appcompat', module: 'appcompat'\n    exclude group: 'androidx.profileinstaller', module: 'profileinstaller'\n}\n\ndependencies {\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2'\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2'\n\n    implementation project(':server')\n    implementation project(':rish')\n    implementation project(':starter')\n    implementation project(':api')\n    implementation project(':provider')\n\n    implementation libs.hidden.compat\n    compileOnly libs.hidden.stub\n\n    implementation 'androidx.browser:browser:1.8.0'\n    implementation 'androidx.core:core-ktx:1.16.0'\n    implementation 'androidx.fragment:fragment-ktx:1.8.7'\n    implementation 'androidx.recyclerview:recyclerview:1.4.0'\n    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.0'\n    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.9.0'\n    implementation 'androidx.preference:preference-ktx:1.2.1'\n\n    implementation 'com.google.android.material:material:1.12.0'\n\n    implementation 'com.github.topjohnwu.libsu:core:6.0.0'\n\n    implementation 'dev.rikka.rikkax.appcompat:appcompat:1.6.1'\n    implementation 'dev.rikka.rikkax.compatibility:compatibility:2.0.0'\n    implementation 'dev.rikka.rikkax.core:core-ktx:1.4.1'\n    implementation 'dev.rikka.rikkax.material:material:2.7.2'\n    implementation 'dev.rikka.rikkax.material:material-preference:2.0.0'\n    implementation 'dev.rikka.rikkax.html:html-ktx:1.1.2'\n    implementation 'dev.rikka.rikkax.recyclerview:recyclerview-adapter:1.3.0'\n    implementation 'dev.rikka.rikkax.recyclerview:recyclerview-ktx:1.3.2'\n    implementation 'dev.rikka.rikkax.insets:insets:1.3.0'\n    implementation 'dev.rikka.rikkax.layoutinflater:layoutinflater:1.3.0'\n    implementation 'dev.rikka.rikkax.widget:borderview:1.1.0'\n    implementation 'dev.rikka.rikkax.preference:simplemenu-preference:1.0.3'\n    implementation 'dev.rikka.rikkax.lifecycle:lifecycle-resource-livedata:1.0.1'\n    implementation 'dev.rikka.rikkax.lifecycle:lifecycle-shared-viewmodel:1.0.1'\n    implementation 'dev.rikka.rikkax.lifecycle:lifecycle-viewmodel-lazy:2.0.0'\n\n    implementation 'io.github.vvb2060.ndk:boringssl:20250114'\n    implementation 'org.lsposed.libcxx:libcxx:27.0.12077973'\n\n    implementation 'org.lsposed.hiddenapibypass:hiddenapibypass:6.1'\n\n    implementation 'org.bouncycastle:bcpkix-jdk18on:1.80'\n\n    implementation 'me.zhanghai.android.appiconloader:appiconloader:1.5.0'\n}\n\napply from: rootProject.file('signing.gradle')\n"
  },
  {
    "path": "manager/proguard-rules.pro",
    "content": "-keepclassmembers class * implements android.os.Parcelable {\n    public static final ** CREATOR;\n}\n\n-keepclasseswithmembernames,includedescriptorclasses class * {\n    native <methods>;\n}\n\n-assumenosideeffects class kotlin.jvm.internal.Intrinsics {\n\tpublic static void check*(...);\n\tpublic static void throw*(...);\n}\n\n-assumenosideeffects class java.util.Objects{\n    ** requireNonNull(...);\n}\n\n-keepnames class moe.shizuku.api.BinderContainer\n\n# Missing class android.app.IProcessObserver$Stub\n# Missing class android.app.IUidObserver$Stub\n-keepclassmembers class rikka.hidden.compat.adapter.ProcessObserverAdapter {\n    <methods>;\n}\n\n-keepclassmembers class rikka.hidden.compat.adapter.UidObserverAdapter {\n    <methods>;\n}\n\n# Entrance of Shizuku service\n-keep class rikka.shizuku.server.ShizukuService {\n    public static void main(java.lang.String[]);\n}\n\n# Entrance of user service starter\n-keep class moe.shizuku.starter.ServiceStarter {\n    public static void main(java.lang.String[]);\n}\n\n# Entrance of shell\n-keep class moe.shizuku.manager.shell.Shell {\n    public static void main(java.lang.String[], java.lang.String, android.os.IBinder, android.os.Handler);\n}\n\n-assumenosideeffects class android.util.Log {\n    public static *** d(...);\n}\n\n-assumenosideeffects class moe.shizuku.manager.utils.Logger {\n    public *** d(...);\n}\n\n#noinspection ShrinkerUnresolvedReference\n-assumenosideeffects class rikka.shizuku.server.util.Logger {\n    public *** d(...);\n}\n\n-allowaccessmodification\n-repackageclasses rikka.shizuku\n-keepattributes SourceFile,LineNumberTable\n-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "manager/src/main/.gitignore",
    "content": "/assets/*.dex"
  },
  {
    "path": "manager/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n    <uses-permission\n        android:name=\"android.permission.WRITE_SECURE_SETTINGS\"\n        tools:ignore=\"ProtectedPermissions\" />\n\n    <uses-feature\n        android:name=\"android.software.leanback\"\n        android:required=\"false\" />\n    <uses-feature\n        android:name=\"android.hardware.touchscreen\"\n        android:required=\"false\" />\n\n    <permission-group\n        android:name=\"moe.shizuku.manager.permission-group.API\"\n        android:description=\"@string/permission_group_description\"\n        android:icon=\"@drawable/ic_system_icon\"\n        android:label=\"@string/permission_group_label\" />\n\n    <permission\n        android:name=\"moe.shizuku.manager.permission.MANAGER\"\n        android:protectionLevel=\"signature\" />\n    <uses-permission android:name=\"moe.shizuku.manager.permission.MANAGER\" />\n\n    <permission\n        android:name=\"moe.shizuku.manager.permission.API_V23\"\n        android:description=\"@string/permission_description\"\n        android:icon=\"@drawable/ic_system_icon\"\n        android:label=\"@string/permission_label\"\n        android:permissionGroup=\"moe.shizuku.manager.permission-group.API\"\n        android:protectionLevel=\"dangerous\" />\n    <uses-permission\n        android:name=\"moe.shizuku.manager.permission.API_V23\"\n        tools:node=\"remove\" />\n\n    <permission\n        android:name=\"${applicationId}.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION\"\n        android:protectionLevel=\"signature\"\n        tools:node=\"remove\" />\n    <uses-permission\n        android:name=\"${applicationId}.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION\"\n        tools:node=\"remove\" />\n\n    <application\n        android:name=\".ShizukuApplication\"\n        android:allowBackup=\"true\"\n        android:autoRevokePermissions=\"allowed\"\n        android:banner=\"@drawable/ic_launcher\"\n        android:dataExtractionRules=\"@xml/data_extraction_rules\"\n        android:directBootAware=\"true\"\n        android:enableOnBackInvokedCallback=\"true\"\n        android:fullBackupContent=\"@xml/backup_descriptor\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:localeConfig=\"@xml/locales_config\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        tools:ignore=\"GoogleAppIndexingWarning\"\n        tools:remove=\"android:appComponentFactory\"\n        tools:targetApi=\"33\">\n\n        <activity\n            android:name=\".MainActivity\"\n            android:banner=\"@mipmap/banner\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n\n                <!-- 2023.08.03: Google play enforces that apps with LEANBACK_LAUNCHER Activity must be uploaded with App Bundle format, -->\n                <!-- and possibly additional review steps. To avoid problems, remove it temporarily. -->\n                <!--<category android:name=\"android.intent.category.LEANBACK_LAUNCHER\" />-->\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".management.ApplicationManagementActivity\"\n            android:label=\"@string/home_app_management_title\" />\n        <activity\n            android:name=\".adb.AdbPairingTutorialActivity\"\n            android:label=\"@string/adb_pairing\" />\n        <activity\n            android:name=\".shell.ShellTutorialActivity\"\n            android:label=\"@string/home_terminal_title\" />\n        <activity\n            android:name=\".settings.SettingsActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/settings_title\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.APPLICATION_PREFERENCES\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".starter.StarterActivity\"\n            android:label=\"@string/starter\" />\n        <activity\n            android:name=\".authorization.RequestPermissionActivity\"\n            android:directBootAware=\"true\"\n            android:excludeFromRecents=\"true\"\n            android:exported=\"true\"\n            android:permission=\"android.permission.INTERACT_ACROSS_USERS_FULL\"\n            android:theme=\"@style/GrantPermissions\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.intent.action.REQUEST_PERMISSION\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".legacy.ShellRequestHandlerActivity\"\n            android:directBootAware=\"true\"\n            android:excludeFromRecents=\"true\"\n            android:exported=\"true\"\n            android:theme=\"@style/GrantPermissions\">\n            <intent-filter>\n                <action android:name=\"rikka.shizuku.intent.action.REQUEST_BINDER\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".legacy.LegacyIsNotSupportedActivity\"\n            android:excludeFromRecents=\"true\"\n            android:exported=\"true\"\n            android:permission=\"moe.shizuku.manager.permission.API\"\n            android:theme=\"@style/GrantPermissions\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.intent.action.REQUEST_AUTHORIZATION\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n\n        <service\n            android:name=\".adb.AdbPairingService\"\n            android:enabled=\"true\"\n            android:exported=\"false\"\n            android:foregroundServiceType=\"shortService\" />\n\n        <receiver\n            android:name=\".receiver.BootCompleteReceiver\"\n            android:directBootAware=\"true\"\n            android:enabled=\"true\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.LOCKED_BOOT_COMPLETED\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.BOOT_COMPLETED\" />\n            </intent-filter>\n        </receiver>\n\n        <receiver\n            android:name=\".receiver.ShizukuReceiver\"\n            android:directBootAware=\"true\"\n            android:enabled=\"true\"\n            android:exported=\"true\"\n            tools:ignore=\"ExportedReceiver\">\n            <intent-filter>\n                <action android:name=\"rikka.shizuku.intent.action.REQUEST_BINDER\" />\n            </intent-filter>\n        </receiver>\n\n        <provider\n            android:name=\".ShizukuManagerProvider\"\n            android:authorities=\"${applicationId}.shizuku\"\n            android:directBootAware=\"true\"\n            android:enabled=\"true\"\n            android:exported=\"true\"\n            android:multiprocess=\"false\"\n            android:permission=\"android.permission.INTERACT_ACROSS_USERS_FULL\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "manager/src/main/assets/rish",
    "content": "#!/system/bin/sh\nBASEDIR=$(dirname \"$0\")\nDEX=\"$BASEDIR\"/rish_shizuku.dex\n\nif [ ! -f \"$DEX\" ]; then\n  echo \"Cannot find $DEX, please check the tutorial in Shizuku app\"\n  exit 1\nfi\n\nif [ $(getprop ro.build.version.sdk) -ge 34 ]; then\n  if [ -w $DEX ]; then\n    echo \"On Android 14+, app_process cannot load writable dex.\"\n    echo \"Attempting to remove the write permission...\"\n    chmod 400 $DEX\n  fi\n  if [ -w $DEX ]; then\n    echo \"Cannot remove the write permission of $DEX.\"\n    echo \"You can copy to file to terminal app's private directory (/data/data/<package>, so that remove write permission is possible\"\n    exit 1\n  fi\nfi\n\n# Replace \"PKG\" with the application id of your terminal app\n[ -z \"$RISH_APPLICATION_ID\" ] && export RISH_APPLICATION_ID=\"PKG\"\n/system/bin/app_process -Djava.class.path=\"$DEX\" /system/bin --nice-name=rish rikka.shizuku.shell.ShizukuShellLoader \"$@\"\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/AppConstants.java",
    "content": "package moe.shizuku.manager;\n\npublic class AppConstants {\n\n    public static final String TAG = \"ShizukuManager\";\n\n    public static final String NOTIFICATION_CHANNEL_STATUS = \"starter\";\n    public static final String NOTIFICATION_CHANNEL_WORK = \"work\";\n    public static final int NOTIFICATION_ID_STATUS = 1;\n    public static final int NOTIFICATION_ID_WORK = 2;\n\n    private static final String PACKAGE = \"moe.shizuku.manager\";\n    public static final String EXTRA = PACKAGE + \".extra\";\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/Helps.java",
    "content": "package moe.shizuku.manager;\n\nimport moe.shizuku.manager.utils.MultiLocaleEntity;\n\npublic class Helps {\n\n    public static final MultiLocaleEntity ADB = new MultiLocaleEntity();\n    public static final MultiLocaleEntity ADB_ANDROID11 = new MultiLocaleEntity();\n    public static final MultiLocaleEntity APPS = new MultiLocaleEntity();\n    public static final MultiLocaleEntity HOME = new MultiLocaleEntity();\n    public static final MultiLocaleEntity DOWNLOAD = new MultiLocaleEntity();\n    public static final MultiLocaleEntity SUI = new MultiLocaleEntity();\n    public static final MultiLocaleEntity RISH = new MultiLocaleEntity();\n    public static final MultiLocaleEntity ADB_PERMISSION = new MultiLocaleEntity();\n\n    static {\n        ADB.put(\"zh-CN\", \"https://shizuku.rikka.app/zh-hans/guide/setup/\");\n        ADB.put(\"zh-TW\", \"https://shizuku.rikka.app/zh-hant/guide/setup/\");\n        ADB.put(\"en\", \"https://shizuku.rikka.app/guide/setup/\");\n\n        ADB_ANDROID11.put(\"zh-CN\", \"https://shizuku.rikka.app/zh-hans/guide/setup/\");\n        ADB_ANDROID11.put(\"zh-TW\", \"https://shizuku.rikka.app/zh-hant/guide/setup/\");\n        ADB_ANDROID11.put(\"en\", \"https://shizuku.rikka.app/guide/setup/\");\n\n        APPS.put(\"zh-CN\", \"https://shizuku.rikka.app/zh-hans/apps/\");\n        APPS.put(\"zh-TW\", \"https://shizuku.rikka.app/zh-hant/apps/\");\n        APPS.put(\"en\", \"https://shizuku.rikka.app/apps/\");\n\n        HOME.put(\"zh-CN\", \"https://shizuku.rikka.app/zh-hans/\");\n        HOME.put(\"zh-TW\", \"https://shizuku.rikka.app/zh-hant/\");\n        HOME.put(\"en\", \"https://shizuku.rikka.app/\");\n\n        DOWNLOAD.put(\"zh-CN\", \"https://shizuku.rikka.app/zh-hans/download/\");\n        DOWNLOAD.put(\"zh-TW\", \"https://shizuku.rikka.app/zh-hant/download/\");\n        DOWNLOAD.put(\"en\", \"https://shizuku.rikka.app/download/\");\n\n        ADB_PERMISSION.put(\"zh-CN\", \"https://shizuku.rikka.app/zh-hans/guide/setup/#%E9%80%9A%E8%BF%87%E6%97%A0%E7%BA%BF%E8%B0%83%E8%AF%95%E5%90%AF%E5%8A%A8-%E9%80%9A%E8%BF%87%E8%BF%9E%E6%8E%A5%E7%94%B5%E8%84%91%E5%90%AF%E5%8A%A8-adb-%E6%9D%83%E9%99%90%E5%8F%97%E9%99%90\");\n        ADB_PERMISSION.put(\"zh-TW\", \"https://shizuku.rikka.app/zh-hant/guide/setup/#%E9%80%8F%E9%81%8E%E7%84%A1%E7%B7%9A%E9%99%A4%E9%8C%AF%E5%95%9F%E5%8B%95-%E9%80%8F%E9%81%8E%E9%80%A3%E7%B7%9A%E9%9B%BB%E8%85%A6%E5%95%9F%E5%8B%95-adb-%E6%AC%8A%E9%99%90%E5%8F%97%E9%99%90\");\n        ADB_PERMISSION.put(\"en\", \"https://shizuku.rikka.app/guide/setup/#start-via-wireless-debugging-start-by-connecting-to-a-computer-the-permission-of-adb-is-limited\");\n\n        SUI.put(\"en\", \"https://github.com/RikkaApps/Sui\");\n\n        RISH.put(\"en\", \"https://github.com/RikkaApps/Shizuku-API/tree/master/rish\");\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/MainActivity.java",
    "content": "package moe.shizuku.manager;\n\nimport moe.shizuku.manager.home.HomeActivity;\n\npublic class MainActivity extends HomeActivity {\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/Manifest.java",
    "content": "package moe.shizuku.manager;\n\npublic class Manifest {\n\n    public static class permission {\n\n        public static final String API_V23 = \"moe.shizuku.manager.permission.API_V23\";\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/ShizukuApplication.kt",
    "content": "package moe.shizuku.manager\n\nimport android.app.Application\nimport android.content.Context\nimport android.os.Build\nimport androidx.appcompat.app.AppCompatDelegate\nimport com.topjohnwu.superuser.Shell\nimport moe.shizuku.manager.ktx.logd\nimport org.lsposed.hiddenapibypass.HiddenApiBypass\nimport rikka.core.util.BuildUtils.atLeast30\nimport rikka.material.app.LocaleDelegate\n\nlateinit var application: ShizukuApplication\n\nclass ShizukuApplication : Application() {\n\n    companion object {\n\n        init {\n            logd(\"ShizukuApplication\", \"init\")\n\n            Shell.setDefaultBuilder(Shell.Builder.create().setFlags(Shell.FLAG_REDIRECT_STDERR))\n            if (Build.VERSION.SDK_INT >= 28) {\n                HiddenApiBypass.setHiddenApiExemptions(\"\")\n            }\n            if (atLeast30) {\n                System.loadLibrary(\"adb\")\n            }\n        }\n    }\n\n    private fun init(context: Context?) {\n        ShizukuSettings.initialize(context)\n        LocaleDelegate.defaultLocale = ShizukuSettings.getLocale()\n        AppCompatDelegate.setDefaultNightMode(ShizukuSettings.getNightMode())\n    }\n\n    override fun onCreate() {\n        super.onCreate()\n        application = this\n        init(this)\n    }\n\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/ShizukuManagerProvider.kt",
    "content": "package moe.shizuku.manager\n\nimport android.os.Bundle\nimport androidx.core.os.bundleOf\nimport moe.shizuku.api.BinderContainer\nimport moe.shizuku.manager.utils.Logger.LOGGER\nimport rikka.shizuku.Shizuku\nimport rikka.shizuku.ShizukuApiConstants.USER_SERVICE_ARG_TOKEN\nimport rikka.shizuku.ShizukuProvider\nimport rikka.shizuku.server.ktx.workerHandler\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\nclass ShizukuManagerProvider : ShizukuProvider() {\n\n    companion object {\n        private const val EXTRA_BINDER = \"moe.shizuku.privileged.api.intent.extra.BINDER\"\n        private const val METHOD_SEND_USER_SERVICE = \"sendUserService\"\n    }\n\n    override fun onCreate(): Boolean {\n        disableAutomaticSuiInitialization()\n        return super.onCreate()\n    }\n\n    override fun call(method: String, arg: String?, extras: Bundle?): Bundle? {\n        if (extras == null) return null\n\n        return if (method == METHOD_SEND_USER_SERVICE) {\n            try {\n                extras.classLoader = BinderContainer::class.java.classLoader\n\n                val token = extras.getString(USER_SERVICE_ARG_TOKEN) ?: return null\n                val binder = extras.getParcelable<BinderContainer>(EXTRA_BINDER)?.binder ?: return null\n\n                val countDownLatch = CountDownLatch(1)\n                var reply: Bundle? = Bundle()\n\n                val listener = object : Shizuku.OnBinderReceivedListener {\n\n                    override fun onBinderReceived() {\n                        try {\n                            Shizuku.attachUserService(binder, bundleOf(\n                                USER_SERVICE_ARG_TOKEN to token\n                            ))\n                            reply!!.putParcelable(EXTRA_BINDER, BinderContainer(Shizuku.getBinder()))\n                        } catch (e: Throwable) {\n                            LOGGER.e(e, \"attachUserService $token\")\n                            reply = null\n                        }\n\n                        Shizuku.removeBinderReceivedListener(this)\n\n                        countDownLatch.countDown()\n                    }\n                }\n\n                Shizuku.addBinderReceivedListenerSticky(listener, workerHandler)\n\n                return try {\n                    countDownLatch.await(5, TimeUnit.SECONDS)\n                    reply\n                } catch (e: TimeoutException) {\n                    LOGGER.e(e, \"Binder not received in 5s\")\n                    null\n                }\n            } catch (e: Throwable) {\n                LOGGER.e(e, \"sendUserService\")\n                null\n            }\n        } else {\n            super.call(method, arg, extras)\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/ShizukuSettings.java",
    "content": "package moe.shizuku.manager;\n\nimport android.app.ActivityThread;\nimport android.content.Context;\nimport android.content.ContextWrapper;\nimport android.content.SharedPreferences;\nimport android.os.Build;\nimport android.text.TextUtils;\n\nimport androidx.annotation.IntDef;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatDelegate;\n\nimport java.lang.annotation.Retention;\nimport java.util.Locale;\n\nimport moe.shizuku.manager.utils.EmptySharedPreferencesImpl;\nimport moe.shizuku.manager.utils.EnvironmentUtils;\n\nimport static java.lang.annotation.RetentionPolicy.SOURCE;\n\npublic class ShizukuSettings {\n\n    public static final String NAME = \"settings\";\n    public static final String NIGHT_MODE = \"night_mode\";\n    public static final String LANGUAGE = \"language\";\n    public static final String KEEP_START_ON_BOOT = \"start_on_boot\";\n\n    private static SharedPreferences sPreferences;\n\n    public static SharedPreferences getPreferences() {\n        return sPreferences;\n    }\n\n    @NonNull\n    private static Context getSettingsStorageContext(@NonNull Context context) {\n        Context storageContext;\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n            storageContext = context.createDeviceProtectedStorageContext();\n        } else {\n            storageContext = context;\n        }\n\n        storageContext = new ContextWrapper(storageContext) {\n            @Override\n            public SharedPreferences getSharedPreferences(String name, int mode) {\n                try {\n                    return super.getSharedPreferences(name, mode);\n                } catch (IllegalStateException e) {\n                    // SharedPreferences in credential encrypted storage are not available until after user is unlocked\n                    return new EmptySharedPreferencesImpl();\n                }\n            }\n        };\n\n        return storageContext;\n    }\n\n    public static void initialize(Context context) {\n        if (sPreferences == null) {\n            sPreferences = getSettingsStorageContext(context)\n                    .getSharedPreferences(NAME, Context.MODE_PRIVATE);\n        }\n    }\n\n    @IntDef({\n            LaunchMethod.UNKNOWN,\n            LaunchMethod.ROOT,\n            LaunchMethod.ADB,\n    })\n    @Retention(SOURCE)\n    public @interface LaunchMethod {\n        int UNKNOWN = -1;\n        int ROOT = 0;\n        int ADB = 1;\n    }\n\n    @LaunchMethod\n    public static int getLastLaunchMode() {\n        return getPreferences().getInt(\"mode\", LaunchMethod.UNKNOWN);\n    }\n\n    public static void setLastLaunchMode(@LaunchMethod int method) {\n        getPreferences().edit().putInt(\"mode\", method).apply();\n    }\n\n    @AppCompatDelegate.NightMode\n    public static int getNightMode() {\n        int defValue = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;\n        if (EnvironmentUtils.isWatch(ActivityThread.currentActivityThread().getApplication())) {\n            defValue = AppCompatDelegate.MODE_NIGHT_YES;\n        }\n        return getPreferences().getInt(NIGHT_MODE, defValue);\n    }\n\n    public static Locale getLocale() {\n        String tag = getPreferences().getString(LANGUAGE, null);\n        if (TextUtils.isEmpty(tag) || \"SYSTEM\".equals(tag)) {\n            return Locale.getDefault();\n        }\n        return Locale.forLanguageTag(tag);\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbClient.kt",
    "content": "package moe.shizuku.manager.adb\n\nimport android.util.Log\nimport moe.shizuku.manager.adb.AdbProtocol.ADB_AUTH_RSAPUBLICKEY\nimport moe.shizuku.manager.adb.AdbProtocol.ADB_AUTH_SIGNATURE\nimport moe.shizuku.manager.adb.AdbProtocol.ADB_AUTH_TOKEN\nimport moe.shizuku.manager.adb.AdbProtocol.A_AUTH\nimport moe.shizuku.manager.adb.AdbProtocol.A_CLSE\nimport moe.shizuku.manager.adb.AdbProtocol.A_CNXN\nimport moe.shizuku.manager.adb.AdbProtocol.A_MAXDATA\nimport moe.shizuku.manager.adb.AdbProtocol.A_OKAY\nimport moe.shizuku.manager.adb.AdbProtocol.A_OPEN\nimport moe.shizuku.manager.adb.AdbProtocol.A_STLS\nimport moe.shizuku.manager.adb.AdbProtocol.A_STLS_VERSION\nimport moe.shizuku.manager.adb.AdbProtocol.A_VERSION\nimport moe.shizuku.manager.adb.AdbProtocol.A_WRTE\nimport moe.shizuku.manager.ktx.logd\nimport rikka.core.util.BuildUtils\nimport java.io.Closeable\nimport java.io.DataInputStream\nimport java.io.DataOutputStream\nimport java.net.Socket\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport javax.net.ssl.SSLSocket\n\nprivate const val TAG = \"AdbClient\"\n\nclass AdbClient(private val host: String, private val port: Int, private val key: AdbKey) : Closeable {\n\n    private lateinit var socket: Socket\n    private lateinit var plainInputStream: DataInputStream\n    private lateinit var plainOutputStream: DataOutputStream\n\n    private var useTls = false\n\n    private lateinit var tlsSocket: SSLSocket\n    private lateinit var tlsInputStream: DataInputStream\n    private lateinit var tlsOutputStream: DataOutputStream\n\n    private val inputStream get() = if (useTls) tlsInputStream else plainInputStream\n    private val outputStream get() = if (useTls) tlsOutputStream else plainOutputStream\n\n    fun connect() {\n        socket = Socket(host, port)\n        socket.tcpNoDelay = true\n        plainInputStream = DataInputStream(socket.getInputStream())\n        plainOutputStream = DataOutputStream(socket.getOutputStream())\n\n        write(A_CNXN, A_VERSION, A_MAXDATA, \"host::\")\n\n        var message = read()\n        if (message.command == A_STLS) {\n            if (!BuildUtils.atLeast29) {\n                error(\"Connect to adb with TLS is not supported before Android 9\")\n            }\n            write(A_STLS, A_STLS_VERSION, 0)\n\n            val sslContext = key.sslContext\n            tlsSocket = sslContext.socketFactory.createSocket(socket, host, port, true) as SSLSocket\n            tlsSocket.startHandshake()\n            Log.d(TAG, \"Handshake succeeded.\")\n\n            tlsInputStream = DataInputStream(tlsSocket.inputStream)\n            tlsOutputStream = DataOutputStream(tlsSocket.outputStream)\n            useTls = true\n\n            message = read()\n        } else if (message.command == A_AUTH) {\n            if (message.command != A_AUTH && message.arg0 != ADB_AUTH_TOKEN) error(\"not A_AUTH ADB_AUTH_TOKEN\")\n            write(A_AUTH, ADB_AUTH_SIGNATURE, 0, key.sign(message.data))\n\n            message = read()\n            if (message.command != A_CNXN) {\n                write(A_AUTH, ADB_AUTH_RSAPUBLICKEY, 0, key.adbPublicKey)\n                message = read()\n            }\n        }\n\n        if (message.command != A_CNXN) error(\"not A_CNXN\")\n    }\n\n    fun shellCommand(command: String, listener: ((ByteArray) -> Unit)?) {\n        val localId = 1\n        write(A_OPEN, localId, 0, \"shell:$command\")\n\n        var message = read()\n        when (message.command) {\n            A_OKAY -> {\n                while (true) {\n                    message = read()\n                    val remoteId = message.arg0\n                    if (message.command == A_WRTE) {\n                        if (message.data_length > 0) {\n                            listener?.invoke(message.data!!)\n                        }\n                        write(A_OKAY, localId, remoteId)\n                    } else if (message.command == A_CLSE) {\n                        write(A_CLSE, localId, remoteId)\n                        break\n                    } else {\n                        error(\"not A_WRTE or A_CLSE\")\n                    }\n                }\n            }\n            A_CLSE -> {\n                val remoteId = message.arg0\n                write(A_CLSE, localId, remoteId)\n            }\n            else -> {\n                error(\"not A_OKAY or A_CLSE\")\n            }\n        }\n    }\n\n    private fun write(command: Int, arg0: Int, arg1: Int, data: ByteArray? = null) = write(AdbMessage(command, arg0, arg1, data))\n\n    private fun write(command: Int, arg0: Int, arg1: Int, data: String) = write(AdbMessage(command, arg0, arg1, data))\n\n    private fun write(message: AdbMessage) {\n        outputStream.write(message.toByteArray())\n        outputStream.flush()\n        Log.d(TAG, \"write ${message.toStringShort()}\")\n    }\n\n    private fun read(): AdbMessage {\n        val buffer = ByteBuffer.allocate(AdbMessage.HEADER_LENGTH).order(ByteOrder.LITTLE_ENDIAN)\n\n        inputStream.readFully(buffer.array(), 0, 24)\n\n        val command = buffer.int\n        val arg0 = buffer.int\n        val arg1 = buffer.int\n        val dataLength = buffer.int\n        val checksum = buffer.int\n        val magic = buffer.int\n        val data: ByteArray?\n        if (dataLength >= 0) {\n            data = ByteArray(dataLength)\n            inputStream.readFully(data, 0, dataLength)\n        } else {\n            data = null\n        }\n        val message = AdbMessage(command, arg0, arg1, dataLength, checksum, magic, data)\n        message.validateOrThrow()\n        Log.d(TAG, \"read ${message.toStringShort()}\")\n        return message\n    }\n\n    override fun close() {\n        try {\n            plainInputStream.close()\n        } catch (e: Throwable) {\n        }\n        try {\n            plainOutputStream.close()\n        } catch (e: Throwable) {\n        }\n        try {\n            socket.close()\n        } catch (e: Exception) {\n        }\n\n        if (useTls) {\n            try {\n                tlsInputStream.close()\n            } catch (e: Throwable) {\n            }\n            try {\n                tlsOutputStream.close()\n            } catch (e: Throwable) {\n            }\n            try {\n                tlsSocket.close()\n            } catch (e: Exception) {\n            }\n        }\n    }\n}"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbException.kt",
    "content": "package moe.shizuku.manager.adb\n\n@Suppress(\"NOTHING_TO_INLINE\")\ninline fun adbError(message: Any): Nothing = throw AdbException(message.toString())\n\nopen class AdbException : Exception {\n\n    constructor(message: String, cause: Throwable?) : super(message, cause)\n    constructor(message: String) : super(message)\n    constructor(cause: Throwable) : super(cause)\n    constructor()\n}\n\nclass AdbInvalidPairingCodeException : AdbException()\n\nclass AdbKeyException(cause: Throwable) : AdbException(cause)\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbKey.kt",
    "content": "package moe.shizuku.manager.adb\n\nimport android.annotation.SuppressLint\nimport android.content.SharedPreferences\nimport android.os.Build\nimport android.security.keystore.KeyGenParameterSpec\nimport android.security.keystore.KeyProperties\nimport android.util.Base64\nimport android.util.Log\nimport androidx.annotation.RequiresApi\nimport androidx.core.content.edit\nimport org.bouncycastle.asn1.x500.X500Name\nimport org.bouncycastle.asn1.x509.SubjectPublicKeyInfo\nimport org.bouncycastle.cert.X509v3CertificateBuilder\nimport org.bouncycastle.operator.jcajce.JcaContentSignerBuilder\nimport rikka.core.ktx.unsafeLazy\nimport java.io.ByteArrayInputStream\nimport java.math.BigInteger\nimport java.net.Socket\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport java.security.*\nimport java.security.cert.CertificateFactory\nimport java.security.cert.X509Certificate\nimport java.security.interfaces.RSAPrivateKey\nimport java.security.interfaces.RSAPublicKey\nimport java.security.spec.PKCS8EncodedKeySpec\nimport java.security.spec.RSAKeyGenParameterSpec\nimport java.security.spec.RSAPublicKeySpec\nimport java.util.*\nimport javax.crypto.Cipher\nimport javax.crypto.KeyGenerator\nimport javax.crypto.spec.GCMParameterSpec\nimport javax.net.ssl.SSLContext\nimport javax.net.ssl.SSLEngine\nimport javax.net.ssl.X509ExtendedKeyManager\nimport javax.net.ssl.X509ExtendedTrustManager\n\nprivate const val TAG = \"AdbKey\"\n\nclass AdbKey(private val adbKeyStore: AdbKeyStore, name: String) {\n\n    companion object {\n\n        private const val ANDROID_KEYSTORE = \"AndroidKeyStore\"\n        private const val ENCRYPTION_KEY_ALIAS = \"_adbkey_encryption_key_\"\n        private const val TRANSFORMATION = \"AES/GCM/NoPadding\"\n\n        private const val IV_SIZE_IN_BYTES = 12\n        private const val TAG_SIZE_IN_BYTES = 16\n\n        private val PADDING = byteArrayOf(\n                0x00, 0x01, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x00,\n                0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00,\n                0x04, 0x14)\n    }\n\n    private val encryptionKey: Key\n\n    private val privateKey: RSAPrivateKey\n    private val publicKey: RSAPublicKey\n    private val certificate: X509Certificate\n\n    init {\n        this.encryptionKey = getOrCreateEncryptionKey() ?: error(\"Failed to generate encryption key with AndroidKeyManager.\")\n\n        this.privateKey = getOrCreatePrivateKey()\n        this.publicKey = KeyFactory.getInstance(\"RSA\").generatePublic(RSAPublicKeySpec(privateKey.modulus, RSAKeyGenParameterSpec.F4)) as RSAPublicKey\n\n        val signer = JcaContentSignerBuilder(\"SHA256withRSA\").build(privateKey)\n        val x509Certificate = X509v3CertificateBuilder(X500Name(\"CN=00\"),\n                BigInteger.ONE,\n                Date(0),\n                Date(2461449600 * 1000),\n                Locale.ROOT,\n                X500Name(\"CN=00\"),\n                SubjectPublicKeyInfo.getInstance(publicKey.encoded)\n        ).build(signer)\n        this.certificate = CertificateFactory.getInstance(\"X.509\")\n                .generateCertificate(ByteArrayInputStream(x509Certificate.encoded)) as X509Certificate\n\n        Log.d(TAG, privateKey.toString())\n    }\n\n    val adbPublicKey: ByteArray by unsafeLazy {\n        publicKey.adbEncoded(name)\n    }\n\n    private fun getOrCreateEncryptionKey(): Key? {\n        val keyStore = KeyStore.getInstance(ANDROID_KEYSTORE)\n        keyStore.load(null)\n\n        return keyStore.getKey(ENCRYPTION_KEY_ALIAS, null) ?: run {\n            val parameterSpec = KeyGenParameterSpec.Builder(ENCRYPTION_KEY_ALIAS, KeyProperties.PURPOSE_DECRYPT or KeyProperties.PURPOSE_ENCRYPT)\n                    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)\n                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)\n                    .setKeySize(256)\n                    .build()\n            val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEYSTORE)\n            keyGenerator.init(parameterSpec)\n            keyGenerator.generateKey()\n        }\n    }\n\n    private fun encrypt(plaintext: ByteArray, aad: ByteArray?): ByteArray? {\n        if (plaintext.size > Int.MAX_VALUE - IV_SIZE_IN_BYTES - TAG_SIZE_IN_BYTES) {\n            return null\n        }\n        val ciphertext = ByteArray(IV_SIZE_IN_BYTES + plaintext.size + TAG_SIZE_IN_BYTES)\n        val cipher = Cipher.getInstance(TRANSFORMATION)\n        cipher.init(Cipher.ENCRYPT_MODE, encryptionKey)\n        cipher.updateAAD(aad)\n        cipher.doFinal(plaintext, 0, plaintext.size, ciphertext, IV_SIZE_IN_BYTES)\n        System.arraycopy(cipher.iv, 0, ciphertext, 0, IV_SIZE_IN_BYTES)\n        return ciphertext\n    }\n\n    private fun decrypt(ciphertext: ByteArray, aad: ByteArray?): ByteArray? {\n        if (ciphertext.size < IV_SIZE_IN_BYTES + TAG_SIZE_IN_BYTES) {\n            return null\n        }\n        val params = GCMParameterSpec(8 * TAG_SIZE_IN_BYTES, ciphertext, 0, IV_SIZE_IN_BYTES)\n        val cipher = Cipher.getInstance(TRANSFORMATION)\n        cipher.init(Cipher.DECRYPT_MODE, encryptionKey, params)\n        cipher.updateAAD(aad)\n        return cipher.doFinal(ciphertext, IV_SIZE_IN_BYTES, ciphertext.size - IV_SIZE_IN_BYTES)\n    }\n\n    private fun getOrCreatePrivateKey(): RSAPrivateKey {\n        var privateKey: RSAPrivateKey? = null\n\n        val aad = ByteArray(16)\n        \"adbkey\".toByteArray().copyInto(aad)\n\n        var ciphertext = adbKeyStore.get()\n        if (ciphertext != null) {\n            try {\n                val plaintext = decrypt(ciphertext, aad)\n\n                val keyFactory = KeyFactory.getInstance(\"RSA\")\n                privateKey = keyFactory.generatePrivate(PKCS8EncodedKeySpec(plaintext)) as RSAPrivateKey\n            } catch (e: Exception) {\n            }\n        }\n        if (privateKey == null) {\n            val keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA)\n            keyPairGenerator.initialize(RSAKeyGenParameterSpec(2048, RSAKeyGenParameterSpec.F4))\n            val keyPair = keyPairGenerator.generateKeyPair()\n            privateKey = keyPair.private as RSAPrivateKey\n\n            ciphertext = encrypt(privateKey.encoded, aad)\n            if (ciphertext != null) {\n                adbKeyStore.put(ciphertext)\n            }\n        }\n        return privateKey\n    }\n\n    fun sign(data: ByteArray?): ByteArray {\n        val cipher = Cipher.getInstance(\"RSA/ECB/NoPadding\")\n        cipher.init(Cipher.ENCRYPT_MODE, privateKey)\n        cipher.update(PADDING)\n        return cipher.doFinal(data)\n    }\n\n    private val keyManager\n        get() = object : X509ExtendedKeyManager() {\n            private val alias = \"key\"\n\n            override fun chooseClientAlias(keyTypes: Array<out String>, issuers: Array<out Principal>?, socket: Socket?): String? {\n                Log.d(TAG, \"chooseClientAlias: keyType=${keyTypes.contentToString()}, issuers=${issuers?.contentToString()}\")\n                for (keyType in keyTypes) {\n                    if (keyType == \"RSA\") return alias\n                }\n                return null\n            }\n\n            override fun getCertificateChain(alias: String?): Array<X509Certificate>? {\n                Log.d(TAG, \"getCertificateChain: alias=$alias\")\n                return if (alias == this.alias) arrayOf(certificate) else null\n            }\n\n            override fun getPrivateKey(alias: String?): PrivateKey? {\n                Log.d(TAG, \"getPrivateKey: alias=$alias\")\n                return if (alias == this.alias) privateKey else null\n            }\n\n            override fun getClientAliases(keyType: String?, issuers: Array<out Principal>?): Array<String>? {\n                return null\n            }\n\n            override fun getServerAliases(keyType: String, issuers: Array<out Principal>?): Array<String>? {\n                return null\n            }\n\n            override fun chooseServerAlias(keyType: String, issuers: Array<out Principal>?, socket: Socket?): String? {\n                return null\n            }\n        }\n\n\n    private val trustManager\n        get() =\n            @RequiresApi(Build.VERSION_CODES.R)\n            object : X509ExtendedTrustManager() {\n\n                @SuppressLint(\"TrustAllX509TrustManager\")\n                override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?, socket: Socket?) {\n                }\n\n                @SuppressLint(\"TrustAllX509TrustManager\")\n                override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?, engine: SSLEngine?) {\n                }\n\n                @SuppressLint(\"TrustAllX509TrustManager\")\n                override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {\n                }\n\n                @SuppressLint(\"TrustAllX509TrustManager\")\n                override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?, socket: Socket?) {\n                }\n\n                @SuppressLint(\"TrustAllX509TrustManager\")\n                override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?, engine: SSLEngine?) {\n                }\n\n                @SuppressLint(\"TrustAllX509TrustManager\")\n                override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {\n                }\n\n                override fun getAcceptedIssuers(): Array<X509Certificate> {\n                    return emptyArray()\n                }\n            }\n\n    @delegate:RequiresApi(Build.VERSION_CODES.R)\n    val sslContext: SSLContext by unsafeLazy {\n        val sslContext = SSLContext.getInstance(\"TLSv1.3\")\n        sslContext.init(arrayOf(keyManager), arrayOf(trustManager), SecureRandom())\n        sslContext\n    }\n}\n\ninterface AdbKeyStore {\n\n    fun put(bytes: ByteArray)\n\n    fun get(): ByteArray?\n}\n\nclass PreferenceAdbKeyStore(private val preference: SharedPreferences) : AdbKeyStore {\n\n    private val preferenceKey = \"adbkey\"\n\n    override fun put(bytes: ByteArray) {\n        preference.edit { putString(preferenceKey, String(Base64.encode(bytes, Base64.NO_WRAP))) }\n    }\n\n    override fun get(): ByteArray? {\n        if (!preference.contains(preferenceKey)) return null\n        return Base64.decode(preference.getString(preferenceKey, null), Base64.NO_WRAP)\n    }\n}\n\nconst val ANDROID_PUBKEY_MODULUS_SIZE = 2048 / 8\nconst val ANDROID_PUBKEY_MODULUS_SIZE_WORDS = ANDROID_PUBKEY_MODULUS_SIZE / 4\nconst val RSAPublicKey_Size = 524\n\nprivate fun BigInteger.toAdbEncoded(): IntArray {\n    // little-endian integer with padding zeros in the end\n\n    val endcoded = IntArray(ANDROID_PUBKEY_MODULUS_SIZE_WORDS)\n    val r32 = BigInteger.ZERO.setBit(32)\n\n    var tmp = this.add(BigInteger.ZERO)\n    for (i in 0 until ANDROID_PUBKEY_MODULUS_SIZE_WORDS) {\n        val out = tmp.divideAndRemainder(r32)\n        tmp = out[0]\n        endcoded[i] = out[1].toInt()\n    }\n    return endcoded\n}\n\nprivate fun RSAPublicKey.adbEncoded(name: String): ByteArray {\n    // https://cs.android.com/android/platform/superproject/+/android-10.0.0_r30:system/core/libcrypto_utils/android_pubkey.c\n\n    /*\n    typedef struct RSAPublicKey {\n        uint32_t modulus_size_words; // ANDROID_PUBKEY_MODULUS_SIZE\n        uint32_t n0inv; // n0inv = -1 / N[0] mod 2^32\n        uint8_t modulus[ANDROID_PUBKEY_MODULUS_SIZE];\n        uint8_t rr[ANDROID_PUBKEY_MODULUS_SIZE]; // rr = (2^(rsa_size)) ^ 2 mod N\n        uint32_t exponent;\n    } RSAPublicKey;\n    */\n\n    val r32 = BigInteger.ZERO.setBit(32)\n    val n0inv = modulus.remainder(r32).modInverse(r32).negate()\n    val r = BigInteger.ZERO.setBit(ANDROID_PUBKEY_MODULUS_SIZE * 8)\n    val rr = r.modPow(BigInteger.valueOf(2), modulus)\n\n    val buffer = ByteBuffer.allocate(RSAPublicKey_Size).order(ByteOrder.LITTLE_ENDIAN)\n    buffer.putInt(ANDROID_PUBKEY_MODULUS_SIZE_WORDS)\n    buffer.putInt(n0inv.toInt())\n    modulus.toAdbEncoded().forEach { buffer.putInt(it) }\n    rr.toAdbEncoded().forEach { buffer.putInt(it) }\n    buffer.putInt(publicExponent.toInt())\n\n    val base64Bytes = Base64.encode(buffer.array(), Base64.NO_WRAP)\n    val nameBytes = \" $name\\u0000\".toByteArray()\n    val bytes = ByteArray(base64Bytes.size + nameBytes.size)\n    base64Bytes.copyInto(bytes)\n    nameBytes.copyInto(bytes, base64Bytes.size)\n    return bytes\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbMdns.kt",
    "content": "package moe.shizuku.manager.adb\n\nimport android.content.Context\nimport android.net.nsd.NsdManager\nimport android.net.nsd.NsdServiceInfo\nimport android.os.Build\nimport android.util.Log\nimport androidx.annotation.RequiresApi\nimport androidx.lifecycle.Observer\nimport java.io.IOException\nimport java.net.InetSocketAddress\nimport java.net.NetworkInterface\nimport java.net.ServerSocket\n\n@RequiresApi(Build.VERSION_CODES.R)\nclass AdbMdns(\n    context: Context, private val serviceType: String,\n    private val observer: Observer<Int>\n) {\n\n    private var registered = false\n    private var running = false\n    private var serviceName: String? = null\n    private val listener = DiscoveryListener(this)\n    private val nsdManager: NsdManager = context.getSystemService(NsdManager::class.java)\n\n    fun start() {\n        if (running) return\n        running = true\n        if (!registered) {\n            nsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, listener)\n        }\n    }\n\n    fun stop() {\n        if (!running) return\n        running = false\n        if (registered) {\n            nsdManager.stopServiceDiscovery(listener)\n        }\n    }\n\n    private fun onDiscoveryStart() {\n        registered = true\n    }\n\n    private fun onDiscoveryStop() {\n        registered = false\n    }\n\n    private fun onServiceFound(info: NsdServiceInfo) {\n        nsdManager.resolveService(info, ResolveListener(this))\n    }\n\n    private fun onServiceLost(info: NsdServiceInfo) {\n        if (info.serviceName == serviceName) observer.onChanged(-1)\n    }\n\n    private fun onServiceResolved(resolvedService: NsdServiceInfo) {\n        if (running && NetworkInterface.getNetworkInterfaces()\n                .asSequence()\n                .any { networkInterface ->\n                    networkInterface.inetAddresses\n                        .asSequence()\n                        .any { resolvedService.host.hostAddress == it.hostAddress }\n                }\n            && isPortAvailable(resolvedService.port)\n        ) {\n            serviceName = resolvedService.serviceName\n            observer.onChanged(resolvedService.port)\n        }\n    }\n\n    private fun isPortAvailable(port: Int) = try {\n        ServerSocket().use {\n            it.bind(InetSocketAddress(\"127.0.0.1\", port), 1)\n            false\n        }\n    } catch (e: IOException) {\n        true\n    }\n\n    internal class DiscoveryListener(private val adbMdns: AdbMdns) : NsdManager.DiscoveryListener {\n        override fun onDiscoveryStarted(serviceType: String) {\n            Log.v(TAG, \"onDiscoveryStarted: $serviceType\")\n\n            adbMdns.onDiscoveryStart()\n        }\n\n        override fun onStartDiscoveryFailed(serviceType: String, errorCode: Int) {\n            Log.v(TAG, \"onStartDiscoveryFailed: $serviceType, $errorCode\")\n        }\n\n        override fun onDiscoveryStopped(serviceType: String) {\n            Log.v(TAG, \"onDiscoveryStopped: $serviceType\")\n\n            adbMdns.onDiscoveryStop()\n        }\n\n        override fun onStopDiscoveryFailed(serviceType: String, errorCode: Int) {\n            Log.v(TAG, \"onStopDiscoveryFailed: $serviceType, $errorCode\")\n        }\n\n        override fun onServiceFound(serviceInfo: NsdServiceInfo) {\n            Log.v(TAG, \"onServiceFound: ${serviceInfo.serviceName}\")\n\n            adbMdns.onServiceFound(serviceInfo)\n        }\n\n        override fun onServiceLost(serviceInfo: NsdServiceInfo) {\n            Log.v(TAG, \"onServiceLost: ${serviceInfo.serviceName}\")\n\n            adbMdns.onServiceLost(serviceInfo)\n        }\n    }\n\n    internal class ResolveListener(private val adbMdns: AdbMdns) : NsdManager.ResolveListener {\n        override fun onResolveFailed(nsdServiceInfo: NsdServiceInfo, i: Int) {}\n\n        override fun onServiceResolved(nsdServiceInfo: NsdServiceInfo) {\n            adbMdns.onServiceResolved(nsdServiceInfo)\n        }\n\n    }\n\n    companion object {\n        const val TLS_CONNECT = \"_adb-tls-connect._tcp\"\n        const val TLS_PAIRING = \"_adb-tls-pairing._tcp\"\n        const val TAG = \"AdbMdns\"\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbMessage.kt",
    "content": "package moe.shizuku.manager.adb\n\nimport moe.shizuku.manager.adb.AdbProtocol.A_AUTH\nimport moe.shizuku.manager.adb.AdbProtocol.A_CLSE\nimport moe.shizuku.manager.adb.AdbProtocol.A_CNXN\nimport moe.shizuku.manager.adb.AdbProtocol.A_OKAY\nimport moe.shizuku.manager.adb.AdbProtocol.A_OPEN\nimport moe.shizuku.manager.adb.AdbProtocol.A_STLS\nimport moe.shizuku.manager.adb.AdbProtocol.A_SYNC\nimport moe.shizuku.manager.adb.AdbProtocol.A_WRTE\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\nclass AdbMessage(\n        val command: Int,\n        val arg0: Int,\n        val arg1: Int,\n        val data_length: Int,\n        val data_crc32: Int,\n        val magic: Int,\n        val data: ByteArray?\n) {\n\n    constructor(command: Int, arg0: Int, arg1: Int, data: String) : this(\n            command,\n            arg0,\n            arg1,\n            \"$data\\u0000\".toByteArray())\n\n    constructor(command: Int, arg0: Int, arg1: Int, data: ByteArray?) : this(\n            command,\n            arg0,\n            arg1,\n            data?.size ?: 0,\n            crc32(data),\n            (command.toLong() xor 0xFFFFFFFF).toInt(),\n            data)\n\n    fun validate(): Boolean {\n        if (command != magic xor -0x1) return false\n        if (data_length != 0 && crc32(data) != data_crc32) return false\n        return true\n    }\n\n    fun validateOrThrow() {\n        if (!validate()) throw IllegalArgumentException(\"bad message ${this.toStringShort()}\")\n    }\n\n    fun toByteArray(): ByteArray {\n        val length = HEADER_LENGTH + (data?.size ?: 0)\n        return ByteBuffer.allocate(length).apply {\n            order(ByteOrder.LITTLE_ENDIAN)\n            putInt(command)\n            putInt(arg0)\n            putInt(arg1)\n            putInt(data_length)\n            putInt(data_crc32)\n            putInt(magic)\n            if (data != null) {\n                put(data)\n            }\n        }.array()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as AdbMessage\n\n        if (command != other.command) return false\n        if (arg0 != other.arg0) return false\n        if (arg1 != other.arg1) return false\n        if (data_length != other.data_length) return false\n        if (data_crc32 != other.data_crc32) return false\n        if (magic != other.magic) return false\n        if (data != null) {\n            if (other.data == null) return false\n            if (!data.contentEquals(other.data)) return false\n        } else if (other.data != null) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = command\n        result = 31 * result + arg0\n        result = 31 * result + arg1\n        result = 31 * result + data_length\n        result = 31 * result + data_crc32\n        result = 31 * result + magic\n        result = 31 * result + (data?.contentHashCode() ?: 0)\n        return result\n    }\n\n    override fun toString(): String {\n        return \"AdbMessage(${toStringShort()})\"\n    }\n\n    fun toStringShort(): String {\n        val commandString = when (command) {\n            A_SYNC -> \"A_SYNC\"\n            A_CNXN -> \"A_CNXN\"\n            A_AUTH -> \"A_AUTH\"\n            A_OPEN -> \"A_OPEN\"\n            A_OKAY -> \"A_OKAY\"\n            A_CLSE -> \"A_CLSE\"\n            A_WRTE -> \"A_WRTE\"\n            A_STLS -> \"A_STLS\"\n            else -> command.toString()\n        }\n        return \"command=$commandString, arg0=$arg0, arg1=$arg1, data_length=$data_length, data_crc32=$data_crc32, magic=$magic, data=${data?.contentToString()}\"\n    }\n\n    companion object {\n\n        const val HEADER_LENGTH = 24\n\n\n        private fun crc32(data: ByteArray?): Int {\n            if (data == null) return 0\n            var res = 0\n            for (b in data) {\n                if (b >= 0)\n                    res += b\n                else\n                    res += b + 256\n            }\n            return res\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbPairingClient.kt",
    "content": "package moe.shizuku.manager.adb\n\nimport android.os.Build\nimport android.util.Log\nimport androidx.annotation.RequiresApi\nimport com.android.org.conscrypt.Conscrypt\nimport java.io.Closeable\nimport java.io.DataInputStream\nimport java.io.DataOutputStream\nimport java.net.Socket\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport javax.net.ssl.SSLSocket\n\nprivate const val TAG = \"AdbPairClient\"\n\nprivate const val kCurrentKeyHeaderVersion = 1.toByte()\nprivate const val kMinSupportedKeyHeaderVersion = 1.toByte()\nprivate const val kMaxSupportedKeyHeaderVersion = 1.toByte()\nprivate const val kMaxPeerInfoSize = 8192\nprivate const val kMaxPayloadSize = kMaxPeerInfoSize * 2\n\nprivate const val kExportedKeyLabel = \"adb-label\\u0000\"\nprivate const val kExportedKeySize = 64\n\nprivate const val kPairingPacketHeaderSize = 6\n\nprivate class PeerInfo(\n        val type: Byte,\n        data: ByteArray) {\n\n    val data = ByteArray(kMaxPeerInfoSize - 1)\n\n    init {\n        data.copyInto(this.data, 0, 0, data.size.coerceAtMost(kMaxPeerInfoSize - 1))\n    }\n\n    enum class Type(val value: Byte) {\n        ADB_RSA_PUB_KEY(0.toByte()),\n        ADB_DEVICE_GUID(0.toByte()),\n    }\n\n    fun writeTo(buffer: ByteBuffer) {\n        buffer.run {\n            put(type)\n            put(data)\n        }\n\n        Log.d(TAG, \"write PeerInfo ${toStringShort()}\")\n    }\n\n    override fun toString(): String {\n        return \"PeerInfo(${toStringShort()})\"\n    }\n\n    fun toStringShort(): String {\n        return \"type=$type, data=${data.contentToString()}\"\n    }\n\n    companion object {\n\n        fun readFrom(buffer: ByteBuffer): PeerInfo {\n            val type = buffer.get()\n            val data = ByteArray(kMaxPeerInfoSize - 1)\n            buffer.get(data)\n            return PeerInfo(type, data)\n        }\n    }\n}\n\nprivate class PairingPacketHeader(\n        val version: Byte,\n        val type: Byte,\n        val payload: Int) {\n\n    enum class Type(val value: Byte) {\n        SPAKE2_MSG(0.toByte()),\n        PEER_INFO(1.toByte())\n    }\n\n    fun writeTo(buffer: ByteBuffer) {\n        buffer.run {\n            put(version)\n            put(type)\n            putInt(payload)\n        }\n\n        Log.d(TAG, \"write PairingPacketHeader ${toStringShort()}\")\n    }\n\n    override fun toString(): String {\n        return \"PairingPacketHeader(${toStringShort()})\"\n    }\n\n    fun toStringShort(): String {\n        return \"version=${version.toInt()}, type=${type.toInt()}, payload=$payload\"\n    }\n\n    companion object {\n\n        fun readFrom(buffer: ByteBuffer): PairingPacketHeader? {\n            val version = buffer.get()\n            val type = buffer.get()\n            val payload = buffer.int\n\n            if (version < kMinSupportedKeyHeaderVersion || version > kMaxSupportedKeyHeaderVersion) {\n                Log.e(TAG, \"PairingPacketHeader version mismatch (us=$kCurrentKeyHeaderVersion them=${version})\")\n                return null\n            }\n            if (type != Type.SPAKE2_MSG.value && type != Type.PEER_INFO.value) {\n                Log.e(TAG, \"Unknown PairingPacket type=${type}\")\n                return null\n            }\n            if (payload <= 0 || payload > kMaxPayloadSize) {\n                Log.e(TAG, \"header payload not within a safe payload size (size=${payload})\")\n                return null\n            }\n\n            val header = PairingPacketHeader(version, type, payload)\n            Log.d(TAG, \"read PairingPacketHeader ${header.toStringShort()}\")\n            return header\n        }\n    }\n}\n\nprivate class PairingContext private constructor(private val nativePtr: Long) {\n\n    val msg: ByteArray\n\n    init {\n        msg = nativeMsg(nativePtr)\n    }\n\n    fun initCipher(theirMsg: ByteArray) = nativeInitCipher(nativePtr, theirMsg)\n\n    fun encrypt(`in`: ByteArray) = nativeEncrypt(nativePtr, `in`)\n\n    fun decrypt(`in`: ByteArray) = nativeDecrypt(nativePtr, `in`)\n\n    fun destroy() = nativeDestroy(nativePtr)\n\n    private external fun nativeMsg(nativePtr: Long): ByteArray\n\n    private external fun nativeInitCipher(nativePtr: Long, theirMsg: ByteArray): Boolean\n\n    private external fun nativeEncrypt(nativePtr: Long, inbuf: ByteArray): ByteArray?\n\n    private external fun nativeDecrypt(nativePtr: Long, inbuf: ByteArray): ByteArray?\n\n    private external fun nativeDestroy(nativePtr: Long)\n\n    companion object {\n\n        fun create(password: ByteArray): PairingContext? {\n            val nativePtr = nativeConstructor(true, password)\n            return if (nativePtr != 0L) PairingContext(nativePtr) else null\n        }\n\n        @JvmStatic\n        private external fun nativeConstructor(isClient: Boolean, password: ByteArray): Long\n    }\n}\n\n@RequiresApi(Build.VERSION_CODES.R)\nclass AdbPairingClient(private val host: String, private val port: Int, private val pairCode: String, private val key: AdbKey) : Closeable {\n\n    private enum class State {\n        Ready,\n        ExchangingMsgs,\n        ExchangingPeerInfo,\n        Stopped\n    }\n\n    private lateinit var socket: Socket\n    private lateinit var inputStream: DataInputStream\n    private lateinit var outputStream: DataOutputStream\n\n    private val peerInfo: PeerInfo = PeerInfo(PeerInfo.Type.ADB_RSA_PUB_KEY.value, key.adbPublicKey)\n    private lateinit var pairingContext: PairingContext\n    private var state: State = State.Ready\n\n    fun start(): Boolean {\n        setupTlsConnection()\n\n        state = State.ExchangingMsgs\n\n        if (!doExchangeMsgs()) {\n            state = State.Stopped\n            return false\n        }\n\n        state = State.ExchangingPeerInfo\n\n        if (!doExchangePeerInfo()) {\n            state = State.Stopped\n            return false\n        }\n\n        state = State.Stopped\n        return true\n    }\n\n    private fun setupTlsConnection() {\n        socket = Socket(host, port)\n        socket.tcpNoDelay = true\n\n        val sslContext = key.sslContext\n        val sslSocket = sslContext.socketFactory.createSocket(socket, host, port, true) as SSLSocket\n        sslSocket.startHandshake()\n        Log.d(TAG, \"Handshake succeeded.\")\n\n        inputStream = DataInputStream(sslSocket.inputStream)\n        outputStream = DataOutputStream(sslSocket.outputStream)\n\n        val pairCodeBytes = pairCode.toByteArray()\n        val keyMaterial = Conscrypt.exportKeyingMaterial(sslSocket, kExportedKeyLabel, null, kExportedKeySize)\n        val passwordBytes = ByteArray(pairCode.length + keyMaterial.size)\n        pairCodeBytes.copyInto(passwordBytes)\n        keyMaterial.copyInto(passwordBytes, pairCodeBytes.size)\n\n        val pairingContext = PairingContext.create(passwordBytes)\n        checkNotNull(pairingContext) { \"Unable to create PairingContext.\" }\n        this.pairingContext = pairingContext\n    }\n\n    private fun createHeader(type: PairingPacketHeader.Type, payloadSize: Int): PairingPacketHeader {\n        return PairingPacketHeader(kCurrentKeyHeaderVersion, type.value, payloadSize)\n    }\n\n    private fun readHeader(): PairingPacketHeader? {\n        val bytes = ByteArray(kPairingPacketHeaderSize)\n        inputStream.readFully(bytes)\n        val buffer = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN)\n        return PairingPacketHeader.readFrom(buffer)\n    }\n\n    private fun writeHeader(header: PairingPacketHeader, payload: ByteArray) {\n        val buffer = ByteBuffer.allocate(kPairingPacketHeaderSize).order(ByteOrder.BIG_ENDIAN)\n        header.writeTo(buffer)\n\n        outputStream.write(buffer.array())\n        outputStream.write(payload)\n        Log.d(TAG, \"write payload, size=${payload.size}\")\n    }\n\n    private fun doExchangeMsgs(): Boolean {\n        val msg = pairingContext.msg\n        val size = msg.size\n\n        val ourHeader = createHeader(PairingPacketHeader.Type.SPAKE2_MSG, size)\n        writeHeader(ourHeader, msg)\n\n        val theirHeader = readHeader() ?: return false\n        if (theirHeader.type != PairingPacketHeader.Type.SPAKE2_MSG.value) return false\n\n        val theirMessage = ByteArray(theirHeader.payload)\n        inputStream.readFully(theirMessage)\n\n        if (!pairingContext.initCipher(theirMessage)) return false\n        return true\n    }\n\n    private fun doExchangePeerInfo(): Boolean {\n        val buf = ByteBuffer.allocate(kMaxPeerInfoSize).order(ByteOrder.BIG_ENDIAN)\n        peerInfo.writeTo(buf)\n\n        val outbuf = pairingContext.encrypt(buf.array()) ?: return false\n\n        val ourHeader = createHeader(PairingPacketHeader.Type.PEER_INFO, outbuf.size)\n        writeHeader(ourHeader, outbuf)\n\n        val theirHeader = readHeader() ?: return false\n        if (theirHeader.type != PairingPacketHeader.Type.PEER_INFO.value) return false\n\n        val theirMessage = ByteArray(theirHeader.payload)\n        inputStream.readFully(theirMessage)\n\n        val decrypted = pairingContext.decrypt(theirMessage) ?: throw AdbInvalidPairingCodeException()\n        if (decrypted.size != kMaxPeerInfoSize) {\n            Log.e(TAG, \"Got size=${decrypted.size} PeerInfo.size=$kMaxPeerInfoSize\")\n            return false\n        }\n        val theirPeerInfo = PeerInfo.readFrom(ByteBuffer.wrap(decrypted))\n        Log.d(TAG, theirPeerInfo.toString())\n        return true\n    }\n\n    override fun close() {\n        try {\n            inputStream.close()\n        } catch (e: Throwable) {\n        }\n        try {\n            outputStream.close()\n        } catch (e: Throwable) {\n        }\n        try {\n            socket.close()\n        } catch (e: Exception) {\n        }\n\n        if (state != State.Ready) {\n            pairingContext.destroy()\n        }\n    }\n\n    companion object {\n\n        init {\n            System.loadLibrary(\"adb\")\n        }\n\n        @JvmStatic\n        external fun available(): Boolean\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbPairingService.kt",
    "content": "package moe.shizuku.manager.adb\n\nimport android.annotation.TargetApi\nimport android.app.*\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.ServiceInfo\nimport android.os.Build\nimport android.os.IBinder\nimport android.util.Log\nimport androidx.lifecycle.Observer\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.launch\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.ShizukuSettings\nimport rikka.core.ktx.unsafeLazy\nimport java.net.ConnectException\n\n@TargetApi(Build.VERSION_CODES.R)\nclass AdbPairingService : Service() {\n\n    companion object {\n\n        const val notificationChannel = \"adb_pairing\"\n\n        private const val tag = \"AdbPairingService\"\n\n        private const val notificationId = 1\n        private const val replyRequestId = 1\n        private const val stopRequestId = 2\n        private const val retryRequestId = 3\n        private const val startAction = \"start\"\n        private const val stopAction = \"stop\"\n        private const val replyAction = \"reply\"\n        private const val remoteInputResultKey = \"paring_code\"\n        private const val portKey = \"paring_code\"\n\n        fun startIntent(context: Context): Intent {\n            return Intent(context, AdbPairingService::class.java).setAction(startAction)\n        }\n\n        private fun stopIntent(context: Context): Intent {\n            return Intent(context, AdbPairingService::class.java).setAction(stopAction)\n        }\n\n        private fun replyIntent(context: Context, port: Int): Intent {\n            return Intent(context, AdbPairingService::class.java).setAction(replyAction).putExtra(portKey, port)\n        }\n    }\n\n    private var adbMdns: AdbMdns? = null\n\n    private val observer = Observer<Int> { port ->\n        Log.i(tag, \"Pairing service port: $port\")\n        if (port <= 0) return@Observer\n\n        // Since the service could be killed before user finishing input,\n        // we need to put the port into Intent\n        val notification = createInputNotification(port)\n\n        getSystemService(NotificationManager::class.java).notify(notificationId, notification)\n    }\n\n    private var started = false\n\n    override fun onCreate() {\n        super.onCreate()\n\n        getSystemService(NotificationManager::class.java).createNotificationChannel(\n            NotificationChannel(\n                notificationChannel,\n                getString(R.string.notification_channel_adb_pairing),\n                NotificationManager.IMPORTANCE_HIGH\n            ).apply {\n                setSound(null, null)\n                setShowBadge(false)\n                setAllowBubbles(false)\n            })\n    }\n\n    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n        val notification = when (intent?.action) {\n            startAction -> {\n                onStart()\n            }\n            replyAction -> {\n                val code = RemoteInput.getResultsFromIntent(intent)?.getCharSequence(remoteInputResultKey) ?: \"\"\n                val port = intent.getIntExtra(portKey, -1)\n                if (port != -1) {\n                    onInput(code.toString(), port)\n                } else {\n                    onStart()\n                }\n            }\n            stopAction -> {\n                stopForeground(STOP_FOREGROUND_REMOVE)\n                stopSelf()\n                null\n            }\n            else -> {\n                return START_NOT_STICKY\n            }\n        }\n        if (notification != null) {\n            try {\n                startForeground(notificationId, notification,\n                    ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST)\n            } catch (e: Throwable) {\n                Log.e(tag, \"startForeground failed\", e)\n\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S\n                    && e is ForegroundServiceStartNotAllowedException) {\n                    getSystemService(NotificationManager::class.java).notify(notificationId, notification)\n                }\n            }\n        }\n        return START_REDELIVER_INTENT\n    }\n\n    private fun startSearch() {\n        if (started) return\n        started = true\n        adbMdns = AdbMdns(this, AdbMdns.TLS_PAIRING, observer).apply { start() }\n    }\n\n    private fun stopSearch() {\n        if (!started) return\n        started = false\n        adbMdns?.stop()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        stopSearch()\n    }\n\n    private fun onStart(): Notification {\n        startSearch()\n        return searchingNotification\n    }\n\n    private fun onInput(code: String, port: Int): Notification {\n        GlobalScope.launch(Dispatchers.IO) {\n            val host = \"127.0.0.1\"\n\n            val key = try {\n                AdbKey(PreferenceAdbKeyStore(ShizukuSettings.getPreferences()), \"shizuku\")\n            } catch (e: Throwable) {\n                e.printStackTrace()\n                return@launch\n            }\n\n            AdbPairingClient(host, port, code, key).runCatching {\n                start()\n            }.onFailure {\n                handleResult(false, it)\n            }.onSuccess {\n                handleResult(it, null)\n            }\n        }\n\n        return workingNotification\n    }\n\n    private fun handleResult(success: Boolean, exception: Throwable?) {\n        stopForeground(STOP_FOREGROUND_REMOVE)\n\n        val title: String\n        val text: String?\n\n        if (success) {\n            Log.i(tag, \"Pair succeed\")\n\n            title = getString(R.string.notification_adb_pairing_succeed_title)\n            text = getString(R.string.notification_adb_pairing_succeed_text)\n\n            stopSearch()\n        } else {\n            title = getString(R.string.notification_adb_pairing_failed_title)\n\n            text = when (exception) {\n                is ConnectException -> {\n                    getString(R.string.cannot_connect_port)\n                }\n                is AdbInvalidPairingCodeException -> {\n                    getString(R.string.paring_code_is_wrong)\n                }\n                is AdbKeyException -> {\n                    getString(R.string.adb_error_key_store)\n                }\n                else -> {\n                    exception?.let { Log.getStackTraceString(it) }\n                }\n            }\n\n            if (exception != null) {\n                Log.w(tag, \"Pair failed\", exception)\n            } else {\n                Log.w(tag, \"Pair failed\")\n            }\n        }\n\n        getSystemService(NotificationManager::class.java).notify(\n            notificationId,\n            Notification.Builder(this, notificationChannel)\n                .setColor(getColor(R.color.notification))\n                .setSmallIcon(R.drawable.ic_system_icon)\n                .setContentTitle(title)\n                .setContentText(text)\n                /*.apply {\n                    if (!success) {\n                        addAction(retryNotificationAction)\n                    }\n                }*/\n                .build()\n        )\n        stopSelf()\n    }\n\n    private val stopNotificationAction by unsafeLazy {\n        val pendingIntent = PendingIntent.getService(\n            this,\n            stopRequestId,\n            stopIntent(this),\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)\n                PendingIntent.FLAG_IMMUTABLE\n            else\n                0\n        )\n\n        Notification.Action.Builder(\n            null,\n            getString(R.string.notification_adb_pairing_stop_searching),\n            pendingIntent\n        )\n            .build()\n    }\n\n    private val retryNotificationAction by unsafeLazy {\n        val pendingIntent = PendingIntent.getService(\n            this,\n            retryRequestId,\n            startIntent(this),\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)\n                PendingIntent.FLAG_IMMUTABLE\n            else\n                0\n        )\n\n        Notification.Action.Builder(\n            null,\n            getString(R.string.notification_adb_pairing_retry),\n            pendingIntent\n        )\n            .build()\n    }\n\n    private val replyNotificationAction by unsafeLazy {\n        val remoteInput = RemoteInput.Builder(remoteInputResultKey).run {\n            setLabel(getString(R.string.dialog_adb_pairing_paring_code))\n            build()\n        }\n\n        val pendingIntent = PendingIntent.getForegroundService(\n            this,\n            replyRequestId,\n            replyIntent(this, -1),\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)\n                PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT\n            else\n                PendingIntent.FLAG_UPDATE_CURRENT\n        )\n\n        Notification.Action.Builder(\n            null,\n            getString(R.string.notification_adb_pairing_input_paring_code),\n            pendingIntent\n        )\n            .addRemoteInput(remoteInput)\n            .build()\n    }\n\n    private fun replyNotificationAction(port: Int): Notification.Action {\n        // Ensure pending intent is created\n        val action = replyNotificationAction\n\n        PendingIntent.getForegroundService(\n            this,\n            replyRequestId,\n            replyIntent(this, port),\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)\n                PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT\n            else\n                PendingIntent.FLAG_UPDATE_CURRENT\n        )\n\n        return action\n    }\n\n    private val searchingNotification by unsafeLazy {\n        Notification.Builder(this, notificationChannel)\n            .setColor(getColor(R.color.notification))\n            .setSmallIcon(R.drawable.ic_system_icon)\n            .setContentTitle(getString(R.string.notification_adb_pairing_searching_for_service_title))\n            .addAction(stopNotificationAction)\n            .build()\n    }\n\n    private fun createInputNotification(port: Int): Notification {\n        return Notification.Builder(this, notificationChannel)\n            .setColor(getColor(R.color.notification))\n            .setContentTitle(getString(R.string.notification_adb_pairing_service_found_title))\n            .setSmallIcon(R.drawable.ic_system_icon)\n            .addAction(replyNotificationAction(port))\n            .build()\n    }\n\n    private val workingNotification by unsafeLazy {\n        Notification.Builder(this, notificationChannel)\n            .setColor(getColor(R.color.notification))\n            .setContentTitle(getString(R.string.notification_adb_pairing_working_title))\n            .setSmallIcon(R.drawable.ic_system_icon)\n            .build()\n    }\n\n    override fun onBind(intent: Intent?): IBinder? {\n        return null\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbPairingTutorialActivity.kt",
    "content": "package moe.shizuku.manager.adb\n\nimport android.app.AppOpsManager\nimport android.app.ForegroundServiceStartNotAllowedException\nimport android.app.NotificationManager\nimport android.content.ActivityNotFoundException\nimport android.content.Intent\nimport android.os.Build\nimport android.os.Bundle\nimport android.provider.Settings\nimport android.util.Log\nimport android.widget.Toast\nimport androidx.annotation.RequiresApi\nimport androidx.core.view.isGone\nimport androidx.core.view.isVisible\nimport moe.shizuku.manager.AppConstants\nimport moe.shizuku.manager.app.AppBarActivity\nimport moe.shizuku.manager.databinding.AdbPairingTutorialActivityBinding\nimport rikka.compatibility.DeviceCompatibility\n\n@RequiresApi(Build.VERSION_CODES.R)\nclass AdbPairingTutorialActivity : AppBarActivity() {\n\n    private lateinit var binding: AdbPairingTutorialActivityBinding\n\n    private var notificationEnabled: Boolean = false\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val context = this\n\n        binding = AdbPairingTutorialActivityBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        notificationEnabled = isNotificationEnabled()\n\n        if (notificationEnabled) {\n            startPairingService()\n        }\n\n        binding.apply {\n            syncNotificationEnabled()\n\n            if (DeviceCompatibility.isMiui()) {\n                miui.isVisible = true\n            }\n\n            developerOptions.setOnClickListener {\n                val intent = Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)\n                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n                intent.putExtra(\":settings:fragment_args_key\", \"toggle_adb_wireless\")\n                try {\n                    context.startActivity(intent)\n                } catch (e: ActivityNotFoundException) {\n                }\n            }\n\n            notificationOptions.setOnClickListener {\n                val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)\n                intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)\n                try {\n                    context.startActivity(intent)\n                } catch (e: ActivityNotFoundException) {\n                }\n            }\n        }\n    }\n\n    private fun syncNotificationEnabled() {\n        binding.apply {\n            step1.isVisible = notificationEnabled\n            step2.isVisible = notificationEnabled\n            step3.isVisible = notificationEnabled\n            network.isVisible = notificationEnabled\n            notification.isVisible = notificationEnabled\n            notificationDisabled.isGone = notificationEnabled\n        }\n    }\n\n    private fun isNotificationEnabled(): Boolean {\n        val context = this\n\n        val nm = context.getSystemService(NotificationManager::class.java)\n        val channel = nm.getNotificationChannel(AdbPairingService.notificationChannel)\n        return nm.areNotificationsEnabled() &&\n                (channel == null || channel.importance != NotificationManager.IMPORTANCE_NONE)\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        val newNotificationEnabled = isNotificationEnabled()\n        if (newNotificationEnabled != notificationEnabled) {\n            notificationEnabled = newNotificationEnabled\n            syncNotificationEnabled()\n\n            if (newNotificationEnabled) {\n                startPairingService()\n            }\n        }\n    }\n\n    private fun startPairingService() {\n        val intent = AdbPairingService.startIntent(this)\n        try {\n            startForegroundService(intent)\n        } catch (e: Throwable) {\n            Log.e(AppConstants.TAG, \"startForegroundService\", e)\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S\n                && e is ForegroundServiceStartNotAllowedException\n            ) {\n                val mode = getSystemService(AppOpsManager::class.java)\n                    .noteOpNoThrow(\"android:start_foreground\", android.os.Process.myUid(), packageName, null, null)\n                if (mode == AppOpsManager.MODE_ERRORED) {\n                    Toast.makeText(this, \"OP_START_FOREGROUND is denied. What are you doing?\", Toast.LENGTH_LONG).show()\n                }\n                startService(intent)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/adb/AdbProtocol.kt",
    "content": "package moe.shizuku.manager.adb\n\nobject AdbProtocol {\n\n    const val A_SYNC = 0x434e5953\n    const val A_CNXN = 0x4e584e43\n    const val A_AUTH = 0x48545541\n    const val A_OPEN = 0x4e45504f\n    const val A_OKAY = 0x59414b4f\n    const val A_CLSE = 0x45534c43\n    const val A_WRTE = 0x45545257\n    const val A_STLS = 0x534C5453\n\n    const val A_VERSION = 0x01000000\n    const val A_MAXDATA = 4096\n\n    const val A_STLS_VERSION = 0x01000000\n\n    const val ADB_AUTH_TOKEN = 1\n    const val ADB_AUTH_SIGNATURE = 2\n    const val ADB_AUTH_RSAPUBLICKEY = 3\n}"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/app/AppActivity.kt",
    "content": "package moe.shizuku.manager.app\n\nimport android.content.res.Resources\nimport android.content.res.Resources.Theme\nimport android.graphics.Color\nimport android.os.Build\nimport androidx.annotation.RequiresApi\nimport moe.shizuku.manager.R\nimport rikka.core.res.isNight\nimport rikka.core.res.resolveColor\nimport rikka.material.app.MaterialActivity\n\nabstract class AppActivity : MaterialActivity() {\n\n    override fun computeUserThemeKey(): String {\n        return ThemeHelper.getTheme(this) + ThemeHelper.isUsingSystemColor()\n    }\n\n    override fun onApplyUserThemeResource(theme: Theme, isDecorView: Boolean) {\n        if (ThemeHelper.isUsingSystemColor()) {\n            if (resources.configuration.isNight())\n                theme.applyStyle(R.style.ThemeOverlay_DynamicColors_Dark, true)\n            else\n                theme.applyStyle(R.style.ThemeOverlay_DynamicColors_Light, true)\n        }\n\n        theme.applyStyle(ThemeHelper.getThemeStyleRes(this), true)\n    }\n\n    @RequiresApi(Build.VERSION_CODES.M)\n    override fun onApplyTranslucentSystemBars() {\n        super.onApplyTranslucentSystemBars()\n\n        val window = window\n        val theme = theme\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            window?.decorView?.post {\n                if (window.decorView.rootWindowInsets?.systemWindowInsetBottom ?: 0 >= Resources.getSystem().displayMetrics.density * 40) {\n                    window.navigationBarColor =\n                        theme.resolveColor(android.R.attr.navigationBarColor) and 0x00ffffff or -0x20000000\n                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n                        window.isNavigationBarContrastEnforced = false\n                    }\n                } else {\n                    window.navigationBarColor = Color.TRANSPARENT\n                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n                        window.isNavigationBarContrastEnforced = true\n                    }\n                }\n            }\n        }\n    }\n\n    override fun onSupportNavigateUp(): Boolean {\n        if (!super.onSupportNavigateUp()) {\n            finish()\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/app/AppBarActivity.kt",
    "content": "package moe.shizuku.manager.app\n\nimport android.graphics.Color\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.annotation.LayoutRes\nimport androidx.annotation.RequiresApi\nimport androidx.appcompat.widget.Toolbar\nimport com.google.android.material.appbar.AppBarLayout\nimport moe.shizuku.manager.R\nimport rikka.core.ktx.unsafeLazy\n\nabstract class AppBarActivity : AppActivity() {\n\n    private val rootView: ViewGroup by unsafeLazy {\n        findViewById<ViewGroup>(R.id.root)\n    }\n\n    private val toolbarContainer: AppBarLayout by unsafeLazy {\n        findViewById<AppBarLayout>(R.id.toolbar_container)\n    }\n\n    private val toolbar: Toolbar by unsafeLazy {\n        findViewById<Toolbar>(R.id.toolbar)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        super.setContentView(getLayoutId())\n\n        setSupportActionBar(toolbar)\n    }\n\n    @LayoutRes\n    open fun getLayoutId(): Int {\n        return R.layout.appbar_activity\n    }\n\n    override fun setContentView(layoutResID: Int) {\n        layoutInflater.inflate(layoutResID, rootView, true)\n        rootView.bringChildToFront(toolbarContainer)\n    }\n\n    override fun setContentView(view: View?) {\n        setContentView(view, FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))\n    }\n\n    override fun setContentView(view: View?, params: ViewGroup.LayoutParams?) {\n        rootView.addView(view, 0, params)\n    }\n\n    @RequiresApi(Build.VERSION_CODES.M)\n    override fun onApplyTranslucentSystemBars() {\n        super.onApplyTranslucentSystemBars()\n        window?.statusBarColor = Color.TRANSPARENT\n    }\n}\n\nabstract class AppBarFragmentActivity : AppBarActivity() {\n\n    override fun getLayoutId(): Int {\n        return R.layout.appbar_fragment_activity\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/app/ThemeHelper.java",
    "content": "package moe.shizuku.manager.app;\n\nimport android.content.Context;\nimport android.os.Build;\n\nimport androidx.annotation.StyleRes;\n\nimport moe.shizuku.manager.R;\nimport moe.shizuku.manager.ShizukuSettings;\nimport moe.shizuku.manager.utils.EnvironmentUtils;\nimport rikka.core.util.ResourceUtils;\n\npublic class ThemeHelper {\n\n    private static final String THEME_DEFAULT = \"DEFAULT\";\n    private static final String THEME_BLACK = \"BLACK\";\n\n    public static final String KEY_LIGHT_THEME = \"light_theme\";\n    public static final String KEY_BLACK_NIGHT_THEME = \"black_night_theme\";\n    public static final String KEY_USE_SYSTEM_COLOR = \"use_system_color\";\n\n    public static boolean isBlackNightTheme(Context context) {\n        return ShizukuSettings.getPreferences().getBoolean(KEY_BLACK_NIGHT_THEME, EnvironmentUtils.isWatch(context));\n    }\n\n    public static boolean isUsingSystemColor() {\n        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S\n                && ShizukuSettings.getPreferences().getBoolean(KEY_USE_SYSTEM_COLOR, true);\n    }\n\n    public static String getTheme(Context context) {\n        if (isBlackNightTheme(context)\n                && ResourceUtils.isNightMode(context.getResources().getConfiguration()))\n            return THEME_BLACK;\n\n        return ShizukuSettings.getPreferences().getString(KEY_LIGHT_THEME, THEME_DEFAULT);\n    }\n\n    @StyleRes\n    public static int getThemeStyleRes(Context context) {\n        switch (getTheme(context)) {\n            case THEME_BLACK:\n                return R.style.ThemeOverlay_Black;\n            case THEME_DEFAULT:\n            default:\n                return R.style.ThemeOverlay;\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/authorization/AuthorizationManager.kt",
    "content": "package moe.shizuku.manager.authorization\n\nimport android.content.pm.PackageInfo\nimport android.content.pm.PackageManager\nimport android.os.Parcel\nimport moe.shizuku.manager.BuildConfig\nimport moe.shizuku.manager.Manifest\nimport moe.shizuku.manager.utils.Logger.LOGGER\nimport moe.shizuku.manager.utils.ShizukuSystemApis\nimport rikka.shizuku.server.ServerConstants\nimport rikka.parcelablelist.ParcelableListSlice\nimport rikka.shizuku.Shizuku\nimport java.util.*\n\nobject AuthorizationManager {\n\n    private const val FLAG_ALLOWED = 1 shl 1\n    private const val FLAG_DENIED = 1 shl 2\n    private const val MASK_PERMISSION = FLAG_ALLOWED or FLAG_DENIED\n\n    private fun getApplications(userId: Int): List<PackageInfo> {\n        val data = Parcel.obtain()\n        val reply = Parcel.obtain()\n        return try {\n            data.writeInterfaceToken(\"moe.shizuku.server.IShizukuService\")\n            data.writeInt(userId)\n            try {\n                Shizuku.getBinder()!!.transact(ServerConstants.BINDER_TRANSACTION_getApplications, data, reply, 0)\n            } catch (e: Throwable) {\n                throw RuntimeException(e)\n            }\n            reply.readException()\n            @Suppress(\"UNCHECKED_CAST\")\n            (ParcelableListSlice.CREATOR.createFromParcel(reply) as ParcelableListSlice<PackageInfo>).list!!\n        } finally {\n            reply.recycle()\n            data.recycle()\n        }\n    }\n\n    fun getPackages(): List<PackageInfo> {\n        val packages: MutableList<PackageInfo> = ArrayList()\n        if (Shizuku.isPreV11() || (Shizuku.getVersion() == 11 && Shizuku.getServerPatchVersion() < 3)) {\n            val allPackages: MutableList<PackageInfo> = ArrayList()\n            for (user in ShizukuSystemApis.getUsers(useCache = false)) {\n                try {\n                    allPackages.addAll(ShizukuSystemApis.getInstalledPackages((PackageManager.GET_META_DATA or PackageManager.GET_PERMISSIONS).toLong(), user.id))\n                } catch (e: Throwable) {\n                    LOGGER.w(e, \"getInstalledPackages\")\n                }\n            }\n            for (pi in allPackages) {\n                if (BuildConfig.APPLICATION_ID == pi.packageName) continue\n                if (pi.applicationInfo?.metaData?.getBoolean(\"moe.shizuku.client.V3_SUPPORT\") != true) continue\n                if (pi.requestedPermissions?.contains(Manifest.permission.API_V23) != true) continue\n\n                packages.add(pi)\n            }\n        } else {\n            packages.addAll(getApplications(-1))\n        }\n        return packages\n    }\n\n    fun granted(packageName: String, uid: Int): Boolean {\n        return if (Shizuku.isPreV11()) {\n            ShizukuSystemApis.checkPermission(Manifest.permission.API_V23, packageName, uid / 100000) == PackageManager.PERMISSION_GRANTED\n        } else {\n            (Shizuku.getFlagsForUid(uid, MASK_PERMISSION) and FLAG_ALLOWED) == FLAG_ALLOWED\n        }\n    }\n\n    fun grant(packageName: String, uid: Int) {\n        if (Shizuku.isPreV11()) {\n            ShizukuSystemApis.grantRuntimePermission(packageName, Manifest.permission.API_V23, uid / 100000)\n        } else {\n            Shizuku.updateFlagsForUid(uid, MASK_PERMISSION, FLAG_ALLOWED)\n        }\n    }\n\n    fun revoke(packageName: String, uid: Int) {\n        if (Shizuku.isPreV11()) {\n            ShizukuSystemApis.revokeRuntimePermission(packageName, Manifest.permission.API_V23, uid / 100000)\n        } else {\n            Shizuku.updateFlagsForUid(uid, MASK_PERMISSION, 0)\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/authorization/RequestPermissionActivity.kt",
    "content": "package moe.shizuku.manager.authorization\n\nimport android.app.Dialog\nimport android.content.pm.ApplicationInfo\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport android.text.method.LinkMovementMethod\nimport android.widget.TextView\nimport androidx.appcompat.app.AlertDialog\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.app.AppActivity\nimport moe.shizuku.manager.databinding.ConfirmationDialogBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.utils.Logger.LOGGER\nimport rikka.core.res.resolveColor\nimport rikka.html.text.HtmlCompat\nimport rikka.shizuku.Shizuku\nimport rikka.shizuku.ShizukuApiConstants.REQUEST_PERMISSION_REPLY_ALLOWED\nimport rikka.shizuku.ShizukuApiConstants.REQUEST_PERMISSION_REPLY_IS_ONETIME\nimport rikka.shizuku.server.ktx.workerHandler\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\nclass RequestPermissionActivity : AppActivity() {\n\n    private lateinit var dialog: Dialog\n\n    private fun setResult(requestUid: Int, requestPid: Int, requestCode: Int, allowed: Boolean, onetime: Boolean) {\n        val data = Bundle()\n        data.putBoolean(REQUEST_PERMISSION_REPLY_ALLOWED, allowed)\n        data.putBoolean(REQUEST_PERMISSION_REPLY_IS_ONETIME, onetime)\n        try {\n            Shizuku.dispatchPermissionConfirmationResult(requestUid, requestPid, requestCode, data)\n        } catch (e: Throwable) {\n            LOGGER.e(\"dispatchPermissionConfirmationResult\")\n        }\n    }\n\n    private fun checkSelfPermission(): Boolean {\n        val permission = Shizuku.checkRemotePermission(\"android.permission.GRANT_RUNTIME_PERMISSIONS\") == PackageManager.PERMISSION_GRANTED\n        if (permission) return true\n\n        val icon = getDrawable(R.drawable.ic_system_icon)\n        icon?.setTint(theme.resolveColor(android.R.attr.colorAccent))\n\n        val dialog = MaterialAlertDialogBuilder(this)\n                .setIcon(icon)\n                .setTitle(\"Shizuku: ${getString(R.string.app_management_dialog_adb_is_limited_title)}\")\n                .setMessage(getString(R.string.app_management_dialog_adb_is_limited_message, Helps.ADB.get()).toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE))\n                .setPositiveButton(android.R.string.ok, null)\n                .setOnDismissListener { finish() }\n                .create()\n        dialog.setOnShowListener {\n            (it as AlertDialog).findViewById<TextView>(android.R.id.message)?.movementMethod = LinkMovementMethod.getInstance()\n        }\n        try {\n            dialog.show()\n        } catch (ignored: Throwable) {\n        }\n        return false\n    }\n\n    private fun waitForBinder(): Boolean {\n        val countDownLatch = CountDownLatch(1)\n\n        val listener = object : Shizuku.OnBinderReceivedListener {\n            override fun onBinderReceived() {\n                countDownLatch.countDown()\n                Shizuku.removeBinderReceivedListener(this)\n            }\n        }\n\n        Shizuku.addBinderReceivedListenerSticky(listener, workerHandler)\n\n        return try {\n            countDownLatch.await(5, TimeUnit.SECONDS)\n            true\n        } catch (e: TimeoutException) {\n            LOGGER.e(e, \"Binder not received in 5s\")\n            false\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        if (!waitForBinder()) {\n            finish()\n            return\n        }\n\n        val uid = intent.getIntExtra(\"uid\", -1)\n        val pid = intent.getIntExtra(\"pid\", -1)\n        val requestCode = intent.getIntExtra(\"requestCode\", -1)\n        val ai = intent.getParcelableExtra<ApplicationInfo>(\"applicationInfo\")\n        if (uid == -1 || pid == -1 || ai == null) {\n            finish()\n            return\n        }\n        if (!checkSelfPermission()) {\n            setResult(uid, pid, requestCode, allowed = false, onetime = true)\n            return\n        }\n\n        val label = try {\n            ai.loadLabel(packageManager)\n        } catch (e: Exception) {\n            ai.packageName\n        }\n\n        val binding = ConfirmationDialogBinding.inflate(layoutInflater).apply {\n            button1.setOnClickListener {\n                setResult(uid, pid, requestCode, allowed = true, onetime = false)\n                dialog.dismiss()\n            }\n            button3.setOnClickListener {\n                setResult(uid, pid, requestCode, allowed = false, onetime = true)\n                dialog.dismiss()\n            }\n            title.text = HtmlCompat.fromHtml(getString(R.string.permission_warning_template,\n                    label, getString(R.string.permission_group_description)))\n        }\n\n        dialog = MaterialAlertDialogBuilder(this)\n                .setView(binding.root)\n                .setCancelable(false)\n                .setOnDismissListener { finish() }\n                .create()\n        dialog.setCanceledOnTouchOutside(false)\n        dialog.show()\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/AdbDialogFragment.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.Manifest.permission.WRITE_SECURE_SETTINGS\nimport android.app.Dialog\nimport android.content.ActivityNotFoundException\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport android.os.Bundle\nimport android.provider.Settings\nimport androidx.annotation.RequiresApi\nimport androidx.appcompat.app.AlertDialog\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.lifecycle.MutableLiveData\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.adb.AdbMdns\nimport moe.shizuku.manager.databinding.AdbDialogBinding\nimport moe.shizuku.manager.starter.StarterActivity\nimport moe.shizuku.manager.utils.EnvironmentUtils\n\n@RequiresApi(Build.VERSION_CODES.R)\nclass AdbDialogFragment : DialogFragment() {\n\n    private lateinit var binding: AdbDialogBinding\n    private lateinit var adbMdns: AdbMdns\n    private val port = MutableLiveData<Int>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val context = requireContext()\n        binding = AdbDialogBinding.inflate(layoutInflater)\n        adbMdns = AdbMdns(context, AdbMdns.TLS_CONNECT) {\n            port.postValue(it)\n        }\n\n        val port = EnvironmentUtils.getAdbTcpPort()\n\n        val builder = MaterialAlertDialogBuilder(context).apply {\n            setTitle(R.string.dialog_adb_discovery)\n            setView(binding.root)\n            setNegativeButton(android.R.string.cancel, null)\n            setPositiveButton(R.string.development_settings, null)\n\n            if (port != -1) {\n                setNeutralButton(\"$port\", null)\n            }\n        }\n        val dialog = builder.create()\n        dialog.setCanceledOnTouchOutside(false)\n        dialog.setOnShowListener { onDialogShow(dialog) }\n        return dialog\n    }\n\n    override fun onDismiss(dialog: DialogInterface) {\n        super.onDismiss(dialog)\n        adbMdns.stop()\n    }\n\n    private fun onDialogShow(dialog: AlertDialog) {\n        adbMdns.start()\n        val context = dialog.context\n        if (context.checkSelfPermission(WRITE_SECURE_SETTINGS) == PackageManager.PERMISSION_GRANTED) {\n            val cr = context.contentResolver\n            Settings.Global.putInt(cr, \"adb_wifi_enabled\", 1)\n            Settings.Global.putInt(cr, Settings.Global.ADB_ENABLED, 1)\n            Settings.Global.putLong(cr, \"adb_allowed_connection_time\", 0L)\n        }\n\n        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {\n            val intent = Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)\n            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n            intent.putExtra(\":settings:fragment_args_key\", \"toggle_adb_wireless\")\n            try {\n                it.context.startActivity(intent)\n            } catch (_: ActivityNotFoundException) {\n            }\n        }\n\n        dialog.getButton(AlertDialog.BUTTON_NEUTRAL)?.setOnClickListener {\n            startAndDismiss(EnvironmentUtils.getAdbTcpPort())\n        }\n\n        port.observe(this) {\n            if (it > 65535 || it < 1) return@observe\n            startAndDismiss(it)\n        }\n    }\n\n    private fun startAndDismiss(port: Int) {\n        val host = \"127.0.0.1\"\n        val intent = Intent(context, StarterActivity::class.java).apply {\n            putExtra(StarterActivity.EXTRA_IS_ROOT, false)\n            putExtra(StarterActivity.EXTRA_HOST, host)\n            putExtra(StarterActivity.EXTRA_PORT, port)\n        }\n        requireContext().startActivity(intent)\n\n        dismissAllowingStateLoss()\n    }\n\n    fun show(fragmentManager: FragmentManager) {\n        if (fragmentManager.isStateSaved) return\n        show(fragmentManager, javaClass.simpleName)\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/AdbPairDialogFragment.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.annotation.SuppressLint\nimport android.app.Dialog\nimport android.content.ActivityNotFoundException\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build.VERSION_CODES\nimport android.os.Bundle\nimport android.provider.Settings\nimport android.view.Gravity\nimport android.view.LayoutInflater\nimport android.widget.Toast\nimport androidx.annotation.RequiresApi\nimport androidx.appcompat.app.AlertDialog\nimport androidx.core.view.isVisible\nimport androidx.core.widget.doAfterTextChanged\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.launch\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.ShizukuSettings\nimport moe.shizuku.manager.adb.*\nimport moe.shizuku.manager.databinding.AdbPairDialogBinding\nimport rikka.lifecycle.viewModels\nimport java.net.ConnectException\n\n@RequiresApi(VERSION_CODES.R)\nclass AdbPairDialogFragment : DialogFragment() {\n\n    private lateinit var binding: AdbPairDialogBinding\n\n    private val viewModel by viewModels { ViewModel(requireContext()) }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val context = requireContext()\n        binding = AdbPairDialogBinding.inflate(LayoutInflater.from(context))\n\n        val builder = MaterialAlertDialogBuilder(context).apply {\n            setTitle(R.string.dialog_adb_pairing_title)\n            setView(binding.root)\n            setNegativeButton(android.R.string.cancel, null)\n            setPositiveButton(android.R.string.ok, null)\n            setNeutralButton(R.string.development_settings, null)\n        }\n        val dialog = builder.create()\n        dialog.setCanceledOnTouchOutside(false)\n        dialog.setOnShowListener { onDialogShow(dialog) }\n        return dialog\n    }\n\n    private fun onDialogShow(dialog: AlertDialog) {\n        binding.pairingCode.editText!!.doAfterTextChanged {\n            binding.pairingCode.error = null\n        }\n\n        binding.pairingCode.error = null\n\n        dialog.getButton(AlertDialog.BUTTON_POSITIVE).isVisible = false\n\n        dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {\n            val intent = Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)\n            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n            intent.putExtra(\":settings:fragment_args_key\", \"toggle_adb_wireless\")\n            try {\n                it.context.startActivity(intent)\n            } catch (e: ActivityNotFoundException) {\n            }\n        }\n\n        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {\n            val context = it.context\n            val port = try {\n                binding.port.editText!!.text.toString().toInt()\n            } catch (e: Exception) {\n                -1\n            }\n            if (port > 65535 || port < 1) {\n                binding.port.isVisible = true\n                binding.port.error = context.getString(R.string.dialog_adb_invalid_port)\n                return@setOnClickListener\n            }\n\n            val password = binding.pairingCode.editText!!.text.toString()\n\n            viewModel.run(port, password)\n        }\n\n        viewModel.port.observe(this) {\n            if (it == -1) {\n                dialog.setTitle(R.string.dialog_adb_pairing_discovery)\n                binding.text1.isVisible = true\n                binding.pairingCode.isVisible = false\n                binding.port.editText!!.setText(it.toString())\n                dialog.getButton(AlertDialog.BUTTON_POSITIVE).isVisible = false\n                dialog.getButton(AlertDialog.BUTTON_NEUTRAL).isVisible = true\n            } else {\n                dialog.setTitle(R.string.dialog_adb_pairing_title)\n                binding.text1.isVisible = false\n                binding.pairingCode.isVisible = true\n                binding.port.editText!!.setText(it.toString())\n                dialog.getButton(AlertDialog.BUTTON_POSITIVE).isVisible = true\n                dialog.getButton(AlertDialog.BUTTON_NEUTRAL).isVisible = false\n            }\n        }\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n\n        val context = requireContext()\n        val inMultiScreenOrDisplay = (requireActivity().isInMultiWindowMode\n                || (requireActivity().window?.decorView?.display?.displayId ?: -1) > 0)\n\n        binding.text1.isVisible = inMultiScreenOrDisplay\n        binding.text2.isVisible = !inMultiScreenOrDisplay\n\n        if (inMultiScreenOrDisplay) {\n            dialog?.setTitle(R.string.dialog_adb_pairing_discovery)\n        } else {\n            dialog?.setTitle(R.string.dialog_adb_pairing_title)\n        }\n\n        viewModel.result.observe(this) {\n            if (it == null) {\n                dismissAllowingStateLoss()\n            } else {\n                when (it) {\n                    is ConnectException -> {\n                        binding.port.error = context.getString(R.string.cannot_connect_port)\n                    }\n                    is AdbInvalidPairingCodeException -> {\n                        binding.pairingCode.error = context.getString(R.string.paring_code_is_wrong)\n                    }\n                    is AdbKeyException -> {\n                        Toast.makeText(context, context.getString(R.string.adb_error_key_store), Toast.LENGTH_LONG)\n                            .apply { setGravity(Gravity.CENTER, 0, 0) }.show()\n                    }\n                }\n            }\n        }\n    }\n\n    fun show(fragmentManager: FragmentManager) {\n        if (fragmentManager.isStateSaved) return\n        show(fragmentManager, javaClass.simpleName)\n    }\n\n    override fun getDialog(): AlertDialog? {\n        return super.getDialog() as AlertDialog?\n    }\n}\n\n@SuppressLint(\"NewApi\")\nprivate class ViewModel(context: Context) : androidx.lifecycle.ViewModel() {\n\n    private val _result = MutableLiveData<Throwable?>()\n    val result = _result as LiveData<Throwable?>\n\n    private val _port = MutableLiveData<Int>()\n    val port = _port as LiveData<Int>\n\n    private val adbMdns: AdbMdns = AdbMdns(context, AdbMdns.TLS_PAIRING) {\n        _port.postValue(it)\n    }\n\n    init {\n        adbMdns.start()\n    }\n\n    fun run(port: Int, password: String) {\n        GlobalScope.launch(Dispatchers.IO) {\n            val host = \"127.0.0.1\"\n\n            val key = try {\n                AdbKey(PreferenceAdbKeyStore(ShizukuSettings.getPreferences()), \"shizuku\")\n            } catch (e: Throwable) {\n                e.printStackTrace()\n                _result.postValue(AdbKeyException(e))\n                return@launch\n            }\n\n            AdbPairingClient(host, port, password, key).runCatching {\n                start()\n            }.onFailure {\n                _result.postValue(it)\n                it.printStackTrace()\n            }.onSuccess {\n                if (it) {\n                    _result.postValue(null)\n                }\n            }\n        }\n    }\n\n    override fun onCleared() {\n        super.onCleared()\n        adbMdns.stop()\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/AdbPermissionLimitedViewHolder.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.databinding.HomeExtraStepRequiredBinding\nimport moe.shizuku.manager.databinding.HomeItemContainerBinding\nimport moe.shizuku.manager.utils.CustomTabsHelper\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\n\nclass AdbPermissionLimitedViewHolder(binding: HomeExtraStepRequiredBinding, root: View) : BaseViewHolder<Any?>(root) {\n\n    companion object {\n        val CREATOR = Creator<Any> { inflater: LayoutInflater, parent: ViewGroup? ->\n            val outer = HomeItemContainerBinding.inflate(inflater, parent, false)\n            val inner = HomeExtraStepRequiredBinding.inflate(inflater, outer.root, true)\n            AdbPermissionLimitedViewHolder(inner, outer.root)\n        }\n    }\n\n    init {\n        binding.button1.setOnClickListener { v: View -> CustomTabsHelper.launchUrlOrCopy(v.context, Helps.ADB_PERMISSION.get()) }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/HomeActivity.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.os.Bundle\nimport android.os.Process\nimport android.text.method.LinkMovementMethod\nimport android.util.TypedValue\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuItem\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.ShizukuSettings\nimport moe.shizuku.manager.app.AppBarActivity\nimport moe.shizuku.manager.databinding.AboutDialogBinding\nimport moe.shizuku.manager.databinding.HomeActivityBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.management.appsViewModel\nimport moe.shizuku.manager.settings.SettingsActivity\nimport moe.shizuku.manager.utils.AppIconCache\nimport rikka.core.ktx.unsafeLazy\nimport rikka.lifecycle.Status\nimport rikka.lifecycle.viewModels\nimport rikka.recyclerview.addEdgeSpacing\nimport rikka.recyclerview.addItemSpacing\nimport rikka.recyclerview.fixEdgeEffect\nimport rikka.shizuku.Shizuku\n\nabstract class HomeActivity : AppBarActivity() {\n\n    private val binderReceivedListener = Shizuku.OnBinderReceivedListener {\n        checkServerStatus()\n        appsModel.load()\n    }\n\n    private val binderDeadListener = Shizuku.OnBinderDeadListener {\n        checkServerStatus()\n    }\n\n    private val homeModel by viewModels { HomeViewModel() }\n    private val appsModel by appsViewModel()\n    private val adapter by unsafeLazy { HomeAdapter(homeModel, appsModel) }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val binding = HomeActivityBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        homeModel.serviceStatus.observe(this) {\n            if (it.status == Status.SUCCESS) {\n                val status = homeModel.serviceStatus.value?.data ?: return@observe\n                adapter.updateData()\n                ShizukuSettings.setLastLaunchMode(if (status.uid == 0) ShizukuSettings.LaunchMethod.ROOT else ShizukuSettings.LaunchMethod.ADB)\n            }\n        }\n        appsModel.grantedCount.observe(this) {\n            if (it.status == Status.SUCCESS) {\n                adapter.updateData()\n            }\n        }\n\n        val recyclerView = binding.list\n        recyclerView.adapter = adapter\n        recyclerView.fixEdgeEffect()\n        recyclerView.addItemSpacing(top = 4f, bottom = 4f, unit = TypedValue.COMPLEX_UNIT_DIP)\n        recyclerView.addEdgeSpacing(top = 4f, bottom = 4f, left = 16f, right = 16f, unit = TypedValue.COMPLEX_UNIT_DIP)\n\n        Shizuku.addBinderReceivedListenerSticky(binderReceivedListener)\n        Shizuku.addBinderDeadListener(binderDeadListener)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        checkServerStatus()\n    }\n\n    private fun checkServerStatus() {\n        homeModel.reload()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        Shizuku.removeBinderReceivedListener(binderReceivedListener)\n        Shizuku.removeBinderDeadListener(binderDeadListener)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.main, menu)\n        return true\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.action_about -> {\n                val binding = AboutDialogBinding.inflate(LayoutInflater.from(this), null, false)\n                binding.sourceCode.movementMethod = LinkMovementMethod.getInstance()\n                binding.sourceCode.text = getString(\n                    R.string.about_view_source_code,\n                    \"<b><a href=\\\"https://github.com/RikkaApps/Shizuku\\\">GitHub</a></b>\"\n                ).toHtml()\n                binding.icon.setImageBitmap(\n                    AppIconCache.getOrLoadBitmap(\n                        this,\n                        applicationInfo,\n                        Process.myUid() / 100000,\n                        resources.getDimensionPixelOffset(R.dimen.default_app_icon_size)\n                    )\n                )\n                binding.versionName.text = packageManager.getPackageInfo(packageName, 0).versionName\n                MaterialAlertDialogBuilder(this)\n                    .setView(binding.root)\n                    .show()\n                true\n            }\n            R.id.action_stop -> {\n                if (!Shizuku.pingBinder()) {\n                    return true\n                }\n                MaterialAlertDialogBuilder(this)\n                    .setMessage(R.string.dialog_stop_message)\n                    .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->\n                        try {\n                            Shizuku.exit()\n                        } catch (e: Throwable) {\n                        }\n                    }\n                    .setNegativeButton(android.R.string.cancel, null)\n                    .show()\n                true\n            }\n            R.id.action_settings -> {\n                startActivity(Intent(this, SettingsActivity::class.java))\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/HomeAdapter.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.os.Build\nimport moe.shizuku.manager.management.AppsViewModel\nimport moe.shizuku.manager.utils.EnvironmentUtils\nimport moe.shizuku.manager.utils.UserHandleCompat\nimport rikka.recyclerview.IdBasedRecyclerViewAdapter\nimport rikka.recyclerview.IndexCreatorPool\nimport rikka.shizuku.Shizuku\n\nclass HomeAdapter(private val homeModel: HomeViewModel, private val appsModel: AppsViewModel) :\n    IdBasedRecyclerViewAdapter(ArrayList()) {\n\n    init {\n        updateData()\n        setHasStableIds(true)\n    }\n\n    companion object {\n\n        private const val ID_STATUS = 0L\n        private const val ID_APPS = 1L\n        private const val ID_TERMINAL = 2L\n        private const val ID_START_ROOT = 3L\n        private const val ID_START_WADB = 4L\n        private const val ID_START_ADB = 5L\n        private const val ID_LEARN_MORE = 6L\n        private const val ID_ADB_PERMISSION_LIMITED = 7L\n    }\n\n    override fun onCreateCreatorPool(): IndexCreatorPool {\n        return IndexCreatorPool()\n    }\n\n    fun updateData() {\n        val status = homeModel.serviceStatus.value?.data ?: return\n        val grantedCount = appsModel.grantedCount.value?.data ?: 0\n        val adbPermission = status.permission\n        val running = status.isRunning\n        val isPrimaryUser = UserHandleCompat.myUserId() == 0\n\n        clear()\n        addItem(ServerStatusViewHolder.CREATOR, status, ID_STATUS)\n\n        if (adbPermission) {\n            addItem(ManageAppsViewHolder.CREATOR, status to grantedCount, ID_APPS)\n            addItem(TerminalViewHolder.CREATOR, status, ID_TERMINAL)\n        }\n\n        if (running && !adbPermission) {\n            addItem(AdbPermissionLimitedViewHolder.CREATOR, status, ID_ADB_PERMISSION_LIMITED)\n        }\n\n        if (isPrimaryUser) {\n            val root = EnvironmentUtils.isRooted()\n            val rootRestart = running && status.uid == 0\n\n            if (root) {\n                addItem(StartRootViewHolder.CREATOR, rootRestart, ID_START_ROOT)\n            }\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || EnvironmentUtils.getAdbTcpPort() > 0) {\n                addItem(StartWirelessAdbViewHolder.CREATOR, null, ID_START_WADB)\n            }\n\n            addItem(StartAdbViewHolder.CREATOR, null, ID_START_ADB)\n\n            if (!root) {\n                addItem(StartRootViewHolder.CREATOR, rootRestart, ID_START_ROOT)\n            }\n        }\n        addItem(LearnMoreViewHolder.CREATOR, null, ID_LEARN_MORE)\n        notifyDataSetChanged()\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/HomeViewModel.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.content.pm.PackageManager\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport moe.shizuku.manager.BuildConfig\nimport moe.shizuku.manager.Manifest\nimport moe.shizuku.manager.model.ServiceStatus\nimport moe.shizuku.manager.utils.Logger.LOGGER\nimport moe.shizuku.manager.utils.ShizukuSystemApis\nimport rikka.lifecycle.Resource\nimport rikka.shizuku.Shizuku\n\nclass HomeViewModel : ViewModel() {\n\n    private val _serviceStatus = MutableLiveData<Resource<ServiceStatus>>()\n    val serviceStatus = _serviceStatus as LiveData<Resource<ServiceStatus>>\n\n    private fun load(): ServiceStatus {\n        if (!Shizuku.pingBinder()) {\n            return ServiceStatus()\n        }\n\n        val uid = Shizuku.getUid()\n        val apiVersion = Shizuku.getVersion()\n        val patchVersion = Shizuku.getServerPatchVersion().let { if (it < 0) 0 else it }\n        val seContext = if (apiVersion >= 6) {\n            try {\n                Shizuku.getSELinuxContext()\n            } catch (tr: Throwable) {\n                LOGGER.w(tr, \"getSELinuxContext\")\n                null\n            }\n        } else null\n        val permissionTest =\n            Shizuku.checkRemotePermission(\"android.permission.GRANT_RUNTIME_PERMISSIONS\") == PackageManager.PERMISSION_GRANTED\n\n        // Before a526d6bb, server will not exit on uninstall, manager installed later will get not permission\n        // Run a random remote transaction here, report no permission as not running\n        ShizukuSystemApis.checkPermission(Manifest.permission.API_V23, BuildConfig.APPLICATION_ID, 0)\n        return ServiceStatus(uid, apiVersion, patchVersion, seContext, permissionTest)\n    }\n\n    fun reload() {\n        viewModelScope.launch(Dispatchers.IO) {\n            try {\n                val status = load()\n                _serviceStatus.postValue(Resource.success(status))\n            } catch (e: CancellationException) {\n\n            } catch (e: Throwable) {\n                _serviceStatus.postValue(Resource.error(e, ServiceStatus()))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/LearnMoreViewHolder.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.databinding.HomeItemContainerBinding\nimport moe.shizuku.manager.databinding.HomeLearnMoreBinding\nimport moe.shizuku.manager.utils.CustomTabsHelper\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\n\nclass LearnMoreViewHolder(binding: HomeLearnMoreBinding, root: View) : BaseViewHolder<Any?>(root) {\n\n    companion object {\n        val CREATOR = Creator<Any> { inflater: LayoutInflater, parent: ViewGroup? ->\n            val outer = HomeItemContainerBinding.inflate(inflater, parent, false)\n            val inner = HomeLearnMoreBinding.inflate(inflater, outer.root, true)\n            LearnMoreViewHolder(inner, outer.root)\n        }\n    }\n\n    init {\n        root.setOnClickListener { v: View -> CustomTabsHelper.launchUrlOrCopy(v.context, Helps.HOME.get()) }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/ManageAppsViewHolder.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.content.Intent\nimport android.text.method.LinkMovementMethod\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.databinding.HomeItemContainerBinding\nimport moe.shizuku.manager.databinding.HomeManageAppsItemBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.management.ApplicationManagementActivity\nimport moe.shizuku.manager.model.ServiceStatus\nimport rikka.html.text.HtmlCompat\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\n\nclass ManageAppsViewHolder(private val binding: HomeManageAppsItemBinding, root: View) :\n    BaseViewHolder<Pair<ServiceStatus, Int>>(root), View.OnClickListener {\n\n    companion object {\n        val CREATOR = Creator<Pair<ServiceStatus, Int>> { inflater: LayoutInflater, parent: ViewGroup? ->\n            val outer = HomeItemContainerBinding.inflate(inflater, parent, false)\n            val inner = HomeManageAppsItemBinding.inflate(inflater, outer.root, true)\n            ManageAppsViewHolder(inner, outer.root)\n        }\n    }\n\n    init {\n        root.setOnClickListener(this)\n    }\n\n    private inline val title get() = binding.text1\n    private inline val summary get() = binding.text2\n\n    override fun onBind() {\n        val context = itemView.context\n        if (!data.first.isRunning) {\n            itemView.isEnabled = false\n            title.setText(R.string.home_app_management_title)\n            summary.text = context.getString(\n                R.string.home_status_service_not_running,\n                context.getString(R.string.app_name)\n            )\n        } else {\n            itemView.isEnabled = true\n            title.text = context.resources.getQuantityString(\n                R.plurals.home_app_management_authorized_apps_count,\n                data.second,\n                data.second\n            )\n            summary.text = context.getString(R.string.home_app_management_view_authorized_apps)\n        }\n    }\n\n    override fun onClick(v: View) {\n        v.context.startActivity(Intent(v.context, ApplicationManagementActivity::class.java))\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/ServerStatusViewHolder.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.text.TextUtils\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.content.ContextCompat\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.databinding.HomeItemContainerBinding\nimport moe.shizuku.manager.databinding.HomeServerStatusBinding\nimport moe.shizuku.manager.model.ServiceStatus\nimport rikka.html.text.HtmlCompat\nimport rikka.html.text.toHtml\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\nimport rikka.shizuku.Shizuku\nimport rikka.shizuku.ShizukuApiConstants\nimport rikka.shizuku.server.ServerConstants\n\nclass ServerStatusViewHolder(private val binding: HomeServerStatusBinding, root: View) :\n    BaseViewHolder<ServiceStatus>(root) {\n\n    companion object {\n        val CREATOR = Creator<ServiceStatus> { inflater: LayoutInflater, parent: ViewGroup? ->\n            val outer = HomeItemContainerBinding.inflate(inflater, parent, false)\n            val inner = HomeServerStatusBinding.inflate(inflater, outer.root, true)\n            ServerStatusViewHolder(inner, outer.root)\n        }\n    }\n\n    private inline val textView get() = binding.text1\n    private inline val summaryView get() = binding.text2\n    private inline val iconView get() = binding.icon\n\n    override fun onBind() {\n        val context = itemView.context\n        val status = data\n        val ok = status.isRunning\n        val isRoot = status.uid == 0\n        val apiVersion = status.apiVersion\n        val patchVersion = status.patchVersion\n        if (ok) {\n            iconView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_server_ok_24dp))\n        } else {\n            iconView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_server_error_24dp))\n        }\n        val user = if (isRoot) \"root\" else \"adb\"\n        val title = if (ok) {\n            context.getString(R.string.home_status_service_is_running, context.getString(R.string.app_name))\n        } else {\n            context.getString(R.string.home_status_service_not_running, context.getString(R.string.app_name))\n        }\n        val summary = if (ok) {\n            if (apiVersion != Shizuku.getLatestServiceVersion() || status.patchVersion != ShizukuApiConstants.SERVER_PATCH_VERSION) {\n                context.getString(\n                    R.string.home_status_service_version_update, user,\n                    \"${apiVersion}.${patchVersion}\",\n                    \"${Shizuku.getLatestServiceVersion()}.${ShizukuApiConstants.SERVER_PATCH_VERSION}\"\n                )\n            } else {\n                context.getString(R.string.home_status_service_version, user, \"${apiVersion}.${patchVersion}\")\n            }\n        } else {\n            \"\"\n        }\n        textView.text = title.toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE)\n        summaryView.text = summary.toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE)\n        if (TextUtils.isEmpty(summaryView.text)) {\n            summaryView.visibility = View.GONE\n        } else {\n            summaryView.visibility = View.VISIBLE\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/StartAdbViewHolder.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.content.Intent\nimport android.text.method.LinkMovementMethod\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.databinding.HomeItemContainerBinding\nimport moe.shizuku.manager.databinding.HomeStartAdbBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.starter.Starter\nimport rikka.core.util.ClipboardUtils\nimport rikka.html.text.HtmlCompat\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\n\nclass StartAdbViewHolder(binding: HomeStartAdbBinding, root: View) : BaseViewHolder<Any?>(root) {\n\n    companion object {\n        val CREATOR = Creator<Any> { inflater: LayoutInflater, parent: ViewGroup? ->\n            val outer = HomeItemContainerBinding.inflate(inflater, parent, false)\n            val inner = HomeStartAdbBinding.inflate(inflater, outer.root, true)\n            StartAdbViewHolder(inner, outer.root)\n        }\n    }\n\n    init {\n        binding.button1.setOnClickListener { v: View ->\n            val context = v.context\n            MaterialAlertDialogBuilder(context)\n                .setTitle(R.string.home_adb_button_view_command)\n                .setMessage(\n                    HtmlCompat.fromHtml(\n                        context.getString(\n                            R.string.home_adb_dialog_view_command_message,\n                            Starter.adbCommand\n                        )\n                    )\n                )\n                .setPositiveButton(R.string.home_adb_dialog_view_command_copy_button) { _, _ ->\n                    if (ClipboardUtils.put(context, Starter.adbCommand)) {\n                        Toast.makeText(\n                            context,\n                            context.getString(R.string.toast_copied_to_clipboard, Starter.adbCommand),\n                            Toast.LENGTH_SHORT\n                        ).show()\n                    }\n                }\n                .setNegativeButton(android.R.string.cancel, null)\n                .setNeutralButton(R.string.home_adb_dialog_view_command_button_send) { _, _ ->\n                    var intent = Intent(Intent.ACTION_SEND)\n                    intent.type = \"text/plain\"\n                    intent.putExtra(Intent.EXTRA_TEXT, Starter.adbCommand)\n                    intent = Intent.createChooser(\n                        intent,\n                        context.getString(R.string.home_adb_dialog_view_command_button_send)\n                    )\n                    context.startActivity(intent)\n                }\n                .show()\n        }\n        binding.text1.movementMethod = LinkMovementMethod.getInstance()\n        binding.text1.text = context.getString(R.string.home_adb_description, Helps.ADB.get())\n            .toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE)\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/StartRootViewHolder.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.content.Intent\nimport android.text.method.LinkMovementMethod\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.appcompat.app.AlertDialog\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.databinding.HomeItemContainerBinding\nimport moe.shizuku.manager.databinding.HomeStartRootBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.starter.StarterActivity\nimport rikka.html.text.HtmlCompat\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\nimport rikka.shizuku.Shizuku\n\nclass StartRootViewHolder(private val binding: HomeStartRootBinding, root: View) :\n    BaseViewHolder<Boolean>(root) {\n\n    companion object {\n        val CREATOR = Creator<Boolean> { inflater: LayoutInflater, parent: ViewGroup? ->\n            val outer = HomeItemContainerBinding.inflate(inflater, parent, false)\n            val inner = HomeStartRootBinding.inflate(inflater, outer.root, true)\n            StartRootViewHolder(inner, outer.root)\n        }\n    }\n\n    private inline val start get() = binding.button1\n    private inline val restart get() = binding.button2\n\n    private var alertDialog: AlertDialog? = null\n\n    init {\n        val listener = View.OnClickListener { v: View -> onStartClicked(v) }\n        start.setOnClickListener(listener)\n        restart.setOnClickListener(listener)\n        binding.text1.movementMethod = LinkMovementMethod.getInstance()\n    }\n\n    private fun onStartClicked(v: View) {\n        val context = v.context\n        val intent = Intent(context, StarterActivity::class.java).apply {\n            putExtra(StarterActivity.EXTRA_IS_ROOT, true)\n        }\n        context.startActivity(intent)\n    }\n\n    override fun onBind() {\n        start.isEnabled = true\n        restart.isEnabled = true\n        if (data!!) {\n            start.visibility = View.GONE\n            restart.visibility = View.VISIBLE\n        } else {\n            start.visibility = View.VISIBLE\n            restart.visibility = View.GONE\n        }\n\n        val sb = StringBuilder()\n            .append(\n                context.getString(\n                    R.string.home_root_description,\n                    \"<b><a href=\\\"https://dontkillmyapp.com/\\\">Don\\'t kill my app!</a></b>\"\n                )\n            )\n        if (Shizuku.pingBinder()) {\n            sb.append(\"<p>\").append(\n                context.getString(\n                    R.string.home_root_description_sui,\n                    \"<b><a href=\\\"${Helps.SUI.get()}\\\">Sui</a></b>\",\n                    \"Sui\"\n                )\n            )\n        }\n\n        binding.text1.text = sb.toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE)\n    }\n\n    override fun onRecycle() {\n        super.onRecycle()\n        alertDialog = null\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/StartWirelessAdbViewHolder.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.os.SystemProperties\nimport android.text.method.LinkMovementMethod\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.RequiresApi\nimport androidx.core.view.isVisible\nimport androidx.fragment.app.FragmentActivity\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.adb.AdbPairingTutorialActivity\nimport moe.shizuku.manager.databinding.HomeItemContainerBinding\nimport moe.shizuku.manager.databinding.HomeStartWirelessAdbBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.starter.StarterActivity\nimport moe.shizuku.manager.utils.CustomTabsHelper\nimport moe.shizuku.manager.utils.EnvironmentUtils\nimport rikka.core.content.asActivity\nimport rikka.html.text.HtmlCompat\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\nimport java.net.Inet4Address\n\nclass StartWirelessAdbViewHolder(binding: HomeStartWirelessAdbBinding, root: View) :\n    BaseViewHolder<Any?>(root) {\n\n    companion object {\n        val CREATOR = Creator<Any> { inflater: LayoutInflater, parent: ViewGroup? ->\n            val outer = HomeItemContainerBinding.inflate(inflater, parent, false)\n            val inner = HomeStartWirelessAdbBinding.inflate(inflater, outer.root, true)\n            StartWirelessAdbViewHolder(inner, outer.root)\n        }\n    }\n\n    init {\n        binding.button1.setOnClickListener { v: View ->\n            onAdbClicked(v.context)\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n            binding.button3.setOnClickListener { v: View ->\n                CustomTabsHelper.launchUrlOrCopy(v.context, Helps.ADB_ANDROID11.get())\n            }\n            binding.button2.setOnClickListener { v: View ->\n                onPairClicked(v.context)\n            }\n            binding.text1.movementMethod = LinkMovementMethod.getInstance()\n            binding.text1.text = context.getString(R.string.home_wireless_adb_description)\n                .toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE)\n        } else {\n            binding.text1.text = context.getString(R.string.home_wireless_adb_description_pre_11)\n                .toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE)\n            binding.button2.isVisible = false\n            binding.button3.isVisible = false\n        }\n    }\n\n    override fun onBind(payloads: MutableList<Any>) {\n        super.onBind(payloads)\n    }\n\n    private fun onAdbClicked(context: Context) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n            AdbDialogFragment().show(context.asActivity<FragmentActivity>().supportFragmentManager)\n            return\n        }\n\n        val port = EnvironmentUtils.getAdbTcpPort()\n        if (port > 0) {\n            val host = \"127.0.0.1\"\n            val intent = Intent(context, StarterActivity::class.java).apply {\n                putExtra(StarterActivity.EXTRA_IS_ROOT, false)\n                putExtra(StarterActivity.EXTRA_HOST, host)\n                putExtra(StarterActivity.EXTRA_PORT, port)\n            }\n            context.startActivity(intent)\n        } else {\n            WadbNotEnabledDialogFragment().show(context.asActivity<FragmentActivity>().supportFragmentManager)\n        }\n    }\n\n    @RequiresApi(Build.VERSION_CODES.R)\n    private fun onPairClicked(context: Context) {\n        if ((context.display?.displayId ?: -1) > 0) {\n            // Running in a multi-display environment (e.g., Windows Subsystem for Android),\n            // pairing dialog can be displayed simultaneously with Shizuku.\n            // Input from notification is harder to use under this situation.\n            AdbPairDialogFragment().show(context.asActivity<FragmentActivity>().supportFragmentManager)\n        } else {\n            context.startActivity(Intent(context, AdbPairingTutorialActivity::class.java))\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/TerminalViewHolder.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.databinding.HomeItemContainerBinding\nimport moe.shizuku.manager.databinding.HomeTerminalBinding\nimport moe.shizuku.manager.model.ServiceStatus\nimport moe.shizuku.manager.shell.ShellTutorialActivity\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\n\nclass TerminalViewHolder(private val binding: HomeTerminalBinding, private val root: View) :\n    BaseViewHolder<ServiceStatus>(root),\n    View.OnClickListener {\n\n    companion object {\n        val CREATOR = Creator<ServiceStatus> { inflater: LayoutInflater, parent: ViewGroup? ->\n            val outer = HomeItemContainerBinding.inflate(inflater, parent, false)\n            val inner = HomeTerminalBinding.inflate(inflater, outer.root, true)\n            TerminalViewHolder(inner, outer.root)\n        }\n    }\n\n    init {\n        root.setOnClickListener(this)\n    }\n\n    private inline val summary get() = binding.text2\n\n    override fun onBind() {\n        val context = itemView.context\n        if (!data.isRunning) {\n            root.isEnabled = false\n            summary.text =\n                context.getString(R.string.home_status_service_not_running, context.getString(R.string.app_name))\n        } else {\n            root.isEnabled = true\n            summary.text = context.getString(R.string.home_terminal_description)\n        }\n    }\n\n    override fun onClick(v: View) {\n        v.context.startActivity(Intent(v.context, ShellTutorialActivity::class.java))\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/home/WadbNotEnabledDialogFragment.kt",
    "content": "package moe.shizuku.manager.home\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.FragmentManager\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport moe.shizuku.manager.R\n\nclass WadbNotEnabledDialogFragment :DialogFragment() {\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val context = requireContext()\n        return MaterialAlertDialogBuilder(context)\n                .setMessage(R.string.dialog_wireless_adb_not_enabled)\n                .setPositiveButton(android.R.string.ok, null)\n                .create()\n    }\n\n    fun show(fragmentManager: FragmentManager) {\n        if (fragmentManager.isStateSaved) return\n        show(fragmentManager, javaClass.simpleName)\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/ktx/Context.kt",
    "content": "package moe.shizuku.manager.ktx\n\nimport android.content.Context\nimport android.os.Build\nimport android.os.UserManager\nimport moe.shizuku.manager.ShizukuApplication\n\nval Context.application: ShizukuApplication\n    get() {\n        return applicationContext as ShizukuApplication\n    }\n\nfun Context.createDeviceProtectedStorageContextCompat(): Context {\n    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n        createDeviceProtectedStorageContext()\n    } else {\n        this\n    }\n}\n\nfun Context.createDeviceProtectedStorageContextCompatWhenLocked(): Context {\n    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && getSystemService(UserManager::class.java)?.isUserUnlocked != true) {\n        createDeviceProtectedStorageContext()\n    } else {\n        this\n    }\n}"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/ktx/Log.kt",
    "content": "@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage moe.shizuku.manager.ktx\n\nimport android.util.Log\n\ninline val <reified T> T.TAG: String\n    get() =\n        T::class.java.simpleName.let {\n            if (it.isBlank()) throw IllegalStateException(\"tag is empty\")\n            if (it.length > 23) it.substring(0, 23) else it\n        }\n\ninline fun <reified T> T.logv(message: String, throwable: Throwable? = null) = logv(TAG, message, throwable)\ninline fun <reified T> T.logi(message: String, throwable: Throwable? = null) = logi(TAG, message, throwable)\ninline fun <reified T> T.logw(message: String, throwable: Throwable? = null) = logw(TAG, message, throwable)\ninline fun <reified T> T.logd(message: String, throwable: Throwable? = null) = logd(TAG, message, throwable)\ninline fun <reified T> T.loge(message: String, throwable: Throwable? = null) = loge(TAG, message, throwable)\n\ninline fun <reified T> T.logv(tag: String, message: String, throwable: Throwable? = null) = Log.v(tag, message, throwable)\ninline fun <reified T> T.logi(tag: String, message: String, throwable: Throwable? = null) = Log.i(tag, message, throwable)\ninline fun <reified T> T.logw(tag: String, message: String, throwable: Throwable? = null) = Log.w(tag, message, throwable)\ninline fun <reified T> T.logd(tag: String, message: String, throwable: Throwable? = null) = Log.d(tag, message, throwable)\ninline fun <reified T> T.loge(tag: String, message: String, throwable: Throwable? = null) = Log.e(tag, message, throwable)"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/ktx/PackageManager.kt",
    "content": "package moe.shizuku.manager.ktx\n\nimport android.content.ComponentName\nimport android.content.pm.PackageManager\n\nfun PackageManager.setComponentEnabled(componentName: ComponentName, enabled: Boolean) {\n    val oldState = getComponentEnabledSetting(componentName)\n    val newState = if (enabled) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED\n    if (newState != oldState) {\n        val flags = PackageManager.DONT_KILL_APP\n        setComponentEnabledSetting(componentName, newState, flags)\n    }\n}\n\nfun PackageManager.isComponentEnabled(componentName: ComponentName, defaultValue: Boolean = true): Boolean {\n    return when (getComponentEnabledSetting(componentName)) {\n        PackageManager.COMPONENT_ENABLED_STATE_DISABLED -> false\n        PackageManager.COMPONENT_ENABLED_STATE_ENABLED -> true\n        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT -> defaultValue\n        else -> false\n    }\n}"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/ktx/RecyclerView.kt",
    "content": "package moe.shizuku.manager.ktx\n\nimport android.graphics.Canvas\nimport android.widget.EdgeEffect\nimport androidx.recyclerview.widget.RecyclerView\n\nclass FixedAlwaysClipToPaddingEdgeEffectFactory(\n        private val paddingLeft: Int,\n        private val paddingTop: Int,\n        private val paddingRight: Int,\n        private val paddingBottom: Int\n) : RecyclerView.EdgeEffectFactory() {\n\n\n    override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {\n\n        return object : EdgeEffect(view.context) {\n            private var ensureSize = false\n\n            private fun ensureSize() {\n                if (ensureSize) return\n                ensureSize = true\n\n                when (direction) {\n                    DIRECTION_LEFT -> {\n                        setSize(view.measuredHeight - paddingTop - paddingBottom,\n                                view.measuredWidth - paddingLeft - paddingRight)\n                    }\n                    DIRECTION_TOP -> {\n                        setSize(view.measuredWidth - paddingLeft - paddingRight,\n                                view.measuredHeight - paddingTop - paddingBottom)\n                    }\n                    DIRECTION_RIGHT -> {\n                        setSize(view.measuredHeight - paddingTop - paddingBottom,\n                                view.measuredWidth - paddingLeft - paddingRight)\n                    }\n                    DIRECTION_BOTTOM -> {\n                        setSize(view.measuredWidth - paddingLeft - paddingRight,\n                                view.measuredHeight - paddingTop - paddingBottom)\n                    }\n                }\n            }\n\n            override fun draw(c: Canvas): Boolean {\n                ensureSize()\n\n                val restore = c.save()\n                when (direction) {\n                    DIRECTION_LEFT -> {\n                        c.translate(paddingBottom.toFloat(), 0f)\n                    }\n                    DIRECTION_TOP -> {\n                        c.translate(paddingLeft.toFloat(), paddingTop.toFloat())\n                    }\n                    DIRECTION_RIGHT -> {\n                        c.translate(-paddingTop.toFloat(), 0f)\n                    }\n                    DIRECTION_BOTTOM -> {\n                        c.translate(paddingRight.toFloat(), paddingBottom.toFloat())\n                    }\n                }\n                val res = super.draw(c)\n                c.restoreToCount(restore)\n                return res\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/ktx/String.kt",
    "content": "package moe.shizuku.manager.ktx\n\nimport android.text.Spanned\nimport rikka.html.text.HtmlCompat\n\nfun CharSequence.toHtml(flags: Int = 0): Spanned {\n    return HtmlCompat.fromHtml(this.toString(), flags)\n}\n\nfun CharSequence.toHtml(tagHandler: HtmlCompat.TagHandler): Spanned {\n    return HtmlCompat.fromHtml(this.toString(), null, tagHandler)\n}\n\nfun CharSequence.toHtml(flags: Int, tagHandler: HtmlCompat.TagHandler): Spanned {\n    return HtmlCompat.fromHtml(this.toString(), flags, null, tagHandler)\n}"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/legacy/LegacyIsNotSupportedActivity.kt",
    "content": "package moe.shizuku.manager.legacy\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport moe.shizuku.manager.MainActivity\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.app.AppActivity\nimport moe.shizuku.manager.ktx.toHtml\nimport rikka.html.text.HtmlCompat\n\nclass LegacyIsNotSupportedActivity : AppActivity() {\n\n    companion object {\n\n        /**\n         * Activity result: user denied request (only API pre-23).\n         */\n        private inline val RESULT_CANCELED get() = Activity.RESULT_CANCELED\n\n        /**\n         * Activity result: error, such as manager app itself not authorized.\n         */\n        private const val RESULT_ERROR = 1\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val callingComponent = callingActivity\n        if (callingComponent == null) {\n            setResult(RESULT_CANCELED)\n            finish()\n            return\n        }\n\n        val ai = try {\n            packageManager.getApplicationInfo(callingComponent.packageName, PackageManager.GET_META_DATA)\n        } catch (e: Throwable) {\n            finish()\n            return\n        }\n\n        val label = try {\n            ai.loadLabel(packageManager)\n        } catch (e: Exception) {\n            ai.packageName\n        }\n\n        val v3Support = ai.metaData?.getBoolean(\"moe.shizuku.client.V3_SUPPORT\") == true\n        if (v3Support) {\n            MaterialAlertDialogBuilder(this)\n                    .setTitle(getString(R.string.dialog_requesting_legacy_title, label))\n                    .setMessage(getString(R.string.dialog_requesting_legacy_message, label).toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE))\n                    .setPositiveButton(android.R.string.ok, null)\n                    .setNeutralButton(R.string.dialog_requesting_legacy_button_open_shizuku) { _, _ ->\n                        startActivity(Intent(this, MainActivity::class.java)\n                                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))\n                    }\n                    .setOnDismissListener {\n                        setResult(RESULT_ERROR)\n                        finish()\n                    }\n                    .setCancelable(false)\n                    .show()\n        } else {\n            MaterialAlertDialogBuilder(this)\n                    .setTitle(getString(R.string.dialog_legacy_not_support_title, label))\n                    .setMessage(getString(R.string.dialog_legacy_not_support_message, label).toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE))\n                    .setPositiveButton(android.R.string.ok, null)\n                    .setOnDismissListener {\n                        setResult(RESULT_ERROR)\n                        finish()\n                    }\n                    .setCancelable(false)\n                    .show()\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/legacy/ShellRequestHandlerActivity.kt",
    "content": "package moe.shizuku.manager.legacy\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport moe.shizuku.manager.app.AppActivity\nimport moe.shizuku.manager.shell.ShellBinderRequestHandler\n\nclass ShellRequestHandlerActivity : AppActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        ShellBinderRequestHandler.handleRequest(this, intent)\n        finish()\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/management/AppViewHolder.kt",
    "content": "package moe.shizuku.manager.management\n\nimport android.content.pm.PackageInfo\nimport android.text.method.LinkMovementMethod\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.content.res.AppCompatResources\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport kotlinx.coroutines.Job\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.authorization.AuthorizationManager\nimport moe.shizuku.manager.databinding.AppListItemBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.utils.AppIconCache\nimport moe.shizuku.manager.utils.ShizukuSystemApis\nimport moe.shizuku.manager.utils.UserHandleCompat\nimport rikka.html.text.HtmlCompat\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\nimport rikka.shizuku.Shizuku\n\nclass AppViewHolder(private val binding: AppListItemBinding) : BaseViewHolder<PackageInfo>(binding.root), View.OnClickListener {\n\n    companion object {\n        @JvmField\n        val CREATOR = Creator<PackageInfo> { inflater: LayoutInflater, parent: ViewGroup? -> AppViewHolder(AppListItemBinding.inflate(inflater, parent, false)) }\n    }\n\n\n    private val icon get() = binding.icon\n    private val name get() = binding.title\n    private val pkg get() = binding.summary\n    private val switchWidget get() = binding.switchWidget\n    private val root get() = binding.requiresRoot\n\n    init {\n        itemView.filterTouchesWhenObscured = true\n        itemView.setOnClickListener(this)\n    }\n\n    private inline val packageName get() = data.packageName\n    private inline val ai get() = data.applicationInfo!!\n    private inline val uid get() = ai.uid\n\n    private var loadIconJob: Job? = null\n\n    override fun onClick(v: View) {\n        val context = v.context\n        try {\n            if (AuthorizationManager.granted(packageName, uid)) {\n                AuthorizationManager.revoke(packageName, uid)\n            } else {\n                AuthorizationManager.grant(packageName, uid)\n            }\n        } catch (e: SecurityException) {\n            val uid = try {\n                Shizuku.getUid()\n            } catch (ex: Throwable) {\n                return\n            }\n            if (uid != 0) {\n                val dialog = MaterialAlertDialogBuilder(context)\n                        .setTitle(R.string.app_management_dialog_adb_is_limited_title)\n                        .setMessage(context.getString(R.string.app_management_dialog_adb_is_limited_message, Helps.ADB.get()).toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE))\n                        .setPositiveButton(android.R.string.ok, null)\n                        .create()\n                dialog.setOnShowListener {\n                    (it as AlertDialog).findViewById<TextView>(android.R.id.message)?.movementMethod = LinkMovementMethod.getInstance()\n                }\n                try {\n                    dialog.show()\n                } catch (ignored: Throwable) {\n                }\n            }\n        }\n        adapter.notifyItemChanged(adapterPosition, Any())\n    }\n\n    override fun onBind() {\n        val pm = itemView.context.packageManager\n        val userId = UserHandleCompat.getUserId(uid)\n        icon.setImageDrawable(ai.loadIcon(pm))\n        name.text = if (userId != UserHandleCompat.myUserId()) {\n            val userInfo = ShizukuSystemApis.getUserInfo(userId)\n            \"${ai.loadLabel(pm)} - ${userInfo.name} ($userId)\"\n        } else {\n            ai.loadLabel(pm)\n        }\n        pkg.text = ai.packageName\n        switchWidget.isChecked = AuthorizationManager.granted(packageName, uid)\n        root.visibility = if (ai.metaData != null && ai.metaData.getBoolean(\"moe.shizuku.client.V3_REQUIRES_ROOT\")) View.VISIBLE else View.GONE\n\n        loadIconJob = AppIconCache.loadIconBitmapAsync(context, ai, ai.uid / 100000, icon)\n    }\n\n    override fun onBind(payloads: List<Any>) {\n        switchWidget.isChecked = AuthorizationManager.granted(packageName, uid)\n    }\n\n    override fun onRecycle() {\n        if (loadIconJob?.isActive == true) {\n            loadIconJob?.cancel()\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/management/ApplicationManagementActivity.kt",
    "content": "package moe.shizuku.manager.management\n\nimport android.os.Bundle\nimport android.util.TypedValue\nimport android.view.MenuItem\nimport android.widget.Toast\nimport androidx.recyclerview.widget.RecyclerView.AdapterDataObserver\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.app.AppBarActivity\nimport moe.shizuku.manager.databinding.AppsActivityBinding\nimport moe.shizuku.manager.utils.CustomTabsHelper\nimport rikka.lifecycle.Status\nimport rikka.recyclerview.addEdgeSpacing\nimport rikka.recyclerview.fixEdgeEffect\nimport rikka.shizuku.Shizuku\nimport java.util.*\n\nclass ApplicationManagementActivity : AppBarActivity() {\n\n    private val viewModel by appsViewModel()\n    private val adapter = AppsAdapter()\n\n    private val binderDeadListener = Shizuku.OnBinderDeadListener {\n        if (!isFinishing) {\n            finish()\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        if (!Shizuku.pingBinder()) {\n            finish()\n            return\n        }\n\n        val binding = AppsActivityBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        viewModel.packages.observe(this) {\n            when (it.status) {\n                Status.SUCCESS -> {\n                    adapter.updateData(it.data)\n                }\n                Status.ERROR -> {\n                    finish()\n                    val tr = it.error\n                    Toast.makeText(this, Objects.toString(tr, \"unknown\"), Toast.LENGTH_SHORT).show()\n                    tr.printStackTrace()\n                }\n                Status.LOADING -> {\n\n                }\n            }\n        }\n        if (viewModel.packages.value == null) {\n            viewModel.load()\n        }\n\n        val recyclerView = binding.list\n        recyclerView.adapter = adapter\n        recyclerView.fixEdgeEffect()\n        recyclerView.addEdgeSpacing(top = 8f, bottom = 8f, unit = TypedValue.COMPLEX_UNIT_DIP)\n\n        adapter.registerAdapterDataObserver(object : AdapterDataObserver() {\n            override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) {\n                viewModel.load(true)\n            }\n        })\n\n        Shizuku.addBinderDeadListener(binderDeadListener)\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n\n        Shizuku.removeBinderDeadListener(binderDeadListener)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        adapter.notifyDataSetChanged()\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/management/AppsAdapter.java",
    "content": "package moe.shizuku.manager.management;\n\nimport android.content.pm.PackageInfo;\n\nimport java.util.List;\n\nimport rikka.recyclerview.BaseRecyclerViewAdapter;\nimport rikka.recyclerview.ClassCreatorPool;\n\npublic class AppsAdapter extends BaseRecyclerViewAdapter<ClassCreatorPool> {\n\n    public AppsAdapter() {\n        super();\n\n        getCreatorPool().putRule(PackageInfo.class, AppViewHolder.CREATOR);\n        getCreatorPool().putRule(Object.class, EmptyViewHolder.CREATOR);\n        setHasStableIds(true);\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return getItemAt(position).hashCode();\n    }\n\n    @Override\n    public ClassCreatorPool onCreateCreatorPool() {\n        return new ClassCreatorPool();\n    }\n\n    public void updateData(List<PackageInfo> data) {\n        getItems().clear();\n        if (data.isEmpty()) {\n            getItems().add(new Object());\n        } else {\n            getItems().addAll(data);\n        }\n        notifyDataSetChanged();\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/management/AppsViewModel.kt",
    "content": "package moe.shizuku.manager.management\n\nimport android.content.Context\nimport android.content.pm.PackageInfo\nimport androidx.activity.ComponentActivity\nimport androidx.annotation.MainThread\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport moe.shizuku.manager.authorization.AuthorizationManager\nimport rikka.lifecycle.Resource\nimport rikka.lifecycle.activityViewModels\nimport rikka.lifecycle.viewModels\n\n@MainThread\nfun ComponentActivity.appsViewModel() = viewModels { AppsViewModel(this) }\n\n@MainThread\nfun Fragment.appsViewModel() = activityViewModels { AppsViewModel(requireContext()) }\n\nclass AppsViewModel(context: Context) : ViewModel() {\n\n    private val _packages = MutableLiveData<Resource<List<PackageInfo>>>()\n    val packages = _packages as LiveData<Resource<List<PackageInfo>>>\n\n    private val _grantedCount = MutableLiveData<Resource<Int>>()\n    val grantedCount = _grantedCount as LiveData<Resource<Int>>\n\n    fun load(onlyCount: Boolean = false) {\n        viewModelScope.launch(Dispatchers.IO) {\n            try {\n                val list: MutableList<PackageInfo> = ArrayList()\n                var count = 0\n                for (pi in AuthorizationManager.getPackages()) {\n                    list.add(pi)\n                    if (AuthorizationManager.granted(pi.packageName, pi.applicationInfo!!.uid)) count++\n                }\n                if (!onlyCount) _packages.postValue(Resource.success(list))\n                _grantedCount.postValue(Resource.success(count))\n            } catch (e: CancellationException) {\n\n            } catch (e: Throwable) {\n                _packages.postValue(Resource.error(e, null))\n                _grantedCount.postValue(Resource.error(e, 0))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/management/EmptyViewHolder.kt",
    "content": "package moe.shizuku.manager.management\n\nimport android.content.pm.PackageInfo\nimport android.text.method.LinkMovementMethod\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.content.res.AppCompatResources\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport kotlinx.coroutines.Job\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.authorization.AuthorizationManager\nimport moe.shizuku.manager.databinding.AppListEmptyBinding\nimport moe.shizuku.manager.databinding.AppListItemBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.utils.AppIconCache\nimport moe.shizuku.manager.utils.ShizukuSystemApis\nimport moe.shizuku.manager.utils.UserHandleCompat\nimport rikka.html.text.HtmlCompat\nimport rikka.recyclerview.BaseViewHolder\nimport rikka.recyclerview.BaseViewHolder.Creator\nimport rikka.shizuku.Shizuku\n\nclass EmptyViewHolder(private val binding: AppListEmptyBinding) : BaseViewHolder<Any>(binding.root) {\n\n    companion object {\n        @JvmField\n        val CREATOR = Creator<Any> { inflater: LayoutInflater, parent: ViewGroup? -> EmptyViewHolder(AppListEmptyBinding.inflate(inflater, parent, false)) }\n    }\n\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/model/ServiceStatus.kt",
    "content": "package moe.shizuku.manager.model\n\nimport rikka.shizuku.Shizuku\n\ndata class ServiceStatus(\n        val uid: Int = -1,\n        val apiVersion: Int = -1,\n        val patchVersion: Int = -1,\n        val seContext: String? = null,\n        val permission: Boolean = false\n) {\n    val isRunning: Boolean\n        get() = uid != -1 && Shizuku.pingBinder()\n}"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/receiver/BootCompleteReceiver.kt",
    "content": "package moe.shizuku.manager.receiver\n\nimport android.Manifest.permission.WRITE_SECURE_SETTINGS\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport android.provider.Settings\nimport android.util.Log\nimport androidx.annotation.RequiresApi\nimport com.topjohnwu.superuser.Shell\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport moe.shizuku.manager.AppConstants\nimport moe.shizuku.manager.ShizukuSettings\nimport moe.shizuku.manager.ShizukuSettings.LaunchMethod\nimport moe.shizuku.manager.adb.AdbClient\nimport moe.shizuku.manager.adb.AdbKey\nimport moe.shizuku.manager.adb.AdbMdns\nimport moe.shizuku.manager.adb.PreferenceAdbKeyStore\nimport moe.shizuku.manager.starter.Starter\nimport moe.shizuku.manager.utils.UserHandleCompat\nimport rikka.shizuku.Shizuku\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\n\nclass BootCompleteReceiver : BroadcastReceiver() {\n\n    override fun onReceive(context: Context, intent: Intent) {\n        if (Intent.ACTION_LOCKED_BOOT_COMPLETED != intent.action\n            && Intent.ACTION_BOOT_COMPLETED != intent.action) {\n            return\n        }\n\n        if (UserHandleCompat.myUserId() > 0 || Shizuku.pingBinder()) return\n\n        if (ShizukuSettings.getLastLaunchMode() == LaunchMethod.ROOT) {\n            rootStart(context)\n        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU // https://r.android.com/2128832\n            && context.checkSelfPermission(WRITE_SECURE_SETTINGS) == PackageManager.PERMISSION_GRANTED\n            && ShizukuSettings.getLastLaunchMode() == LaunchMethod.ADB) {\n            adbStart(context)\n        } else {\n            Log.w(AppConstants.TAG, \"No support start on boot\")\n        }\n    }\n\n    private fun rootStart(context: Context) {\n        if (!Shell.getShell().isRoot) {\n            //NotificationHelper.notify(context, AppConstants.NOTIFICATION_ID_STATUS, AppConstants.NOTIFICATION_CHANNEL_STATUS, R.string.notification_service_start_no_root)\n            Shell.getCachedShell()?.close()\n            return\n        }\n\n        Shell.cmd(Starter.internalCommand).exec()\n    }\n\n    @RequiresApi(Build.VERSION_CODES.TIRAMISU)\n    private fun adbStart(context: Context) {\n        val cr = context.contentResolver\n        Settings.Global.putInt(cr, \"adb_wifi_enabled\", 1)\n        Settings.Global.putInt(cr, Settings.Global.ADB_ENABLED, 1)\n        Settings.Global.putLong(cr, \"adb_allowed_connection_time\", 0L)\n        val pending = goAsync()\n        CoroutineScope(Dispatchers.IO).launch {\n            val latch = CountDownLatch(1)\n            val adbMdns = AdbMdns(context, AdbMdns.TLS_CONNECT) { port ->\n                if (port <= 0) return@AdbMdns\n                try {\n                    val keystore = PreferenceAdbKeyStore(ShizukuSettings.getPreferences())\n                    val key = AdbKey(keystore, \"shizuku\")\n                    val client = AdbClient(\"127.0.0.1\", port, key)\n                    client.connect()\n                    client.shellCommand(Starter.internalCommand, null)\n                    client.close()\n                } catch (_: Exception) {\n                }\n                latch.countDown()\n            }\n            if (Settings.Global.getInt(cr, \"adb_wifi_enabled\", 0) == 1) {\n                adbMdns.start()\n                latch.await(3, TimeUnit.SECONDS)\n                adbMdns.stop()\n            }\n            pending.finish()\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/receiver/ShizukuReceiver.kt",
    "content": "package moe.shizuku.manager.receiver\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport moe.shizuku.manager.shell.ShellBinderRequestHandler\n\nclass ShizukuReceiver : BroadcastReceiver() {\n\n    override fun onReceive(context: Context, intent: Intent) {\n        if (\"rikka.shizuku.intent.action.REQUEST_BINDER\" == intent.action) {\n            ShellBinderRequestHandler.handleRequest(context, intent)\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/settings/IntegerSimpleMenuPreference.java",
    "content": "package moe.shizuku.manager.settings;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport android.util.AttributeSet;\nimport android.view.ContextThemeWrapper;\nimport android.view.View;\n\nimport androidx.annotation.ArrayRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.StyleableRes;\nimport androidx.core.content.res.TypedArrayUtils;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceViewHolder;\n\nimport moe.shizuku.manager.R;\nimport rikka.preference.simplemenu.SimpleMenuPopupWindow;\n\n/**\n * a {@link rikka.preference.SimpleMenuPreference} to implement night mode in user interface settings.\n * a {@link rikka.preference.SimpleMenuPreference} which use integer values array as entryValues.\n *\n * @author Haruue Icymoon haruue@caoyue.com.cn\n */\n\n@SuppressLint(\"RestrictedApi\")\npublic class IntegerSimpleMenuPreference extends Preference {\n\n    private final SimpleMenuPopupWindow mPopupWindow;\n    private View mAnchor;\n    private View mItemView;\n\n    private CharSequence[] mEntries;\n    private int[] mEntryValues;\n    private int mValue;\n    private String mSummary;\n    private boolean mValueSet;\n\n    @SuppressLint(\"RestrictedApi\")\n    public IntegerSimpleMenuPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n\n        TypedArray a = context.obtainStyledAttributes(\n                attrs, R.styleable.ListPreference, defStyleAttr, defStyleRes);\n\n        mEntries = TypedArrayUtils.getTextArray(a, R.styleable.ListPreference_entries,\n                R.styleable.ListPreference_android_entries);\n\n        mEntryValues = getIntArray(a, R.styleable.ListPreference_entryValues,\n                R.styleable.ListPreference_android_entryValues);\n\n        a.recycle();\n\n        /* Retrieve the Preference summary attribute since it's private\n         * in the Preference class.\n         */\n        a = context.obtainStyledAttributes(attrs,\n                R.styleable.Preference, defStyleAttr, defStyleRes);\n\n        mSummary = TypedArrayUtils.getString(a, R.styleable.Preference_summary,\n                R.styleable.Preference_android_summary);\n\n        a.recycle();\n\n        a = context.obtainStyledAttributes(\n                attrs, R.styleable.SimpleMenuPreference, defStyleAttr, defStyleRes);\n\n        int popupStyle = a.getResourceId(R.styleable.SimpleMenuPreference_android_popupMenuStyle, R.style.Widget_Preference_SimpleMenuPreference_PopupMenu);\n        int popupTheme = a.getResourceId(R.styleable.SimpleMenuPreference_android_popupTheme,R.style.ThemeOverlay_Preference_SimpleMenuPreference_PopupMenu);\n        Context popupContext;\n        if (popupTheme != 0) {\n            popupContext = new ContextThemeWrapper(context, popupTheme);\n        } else {\n            popupContext = context;\n        }\n        mPopupWindow = new SimpleMenuPopupWindow(popupContext, attrs, R.styleable.SimpleMenuPreference_android_popupMenuStyle, popupStyle);\n        mPopupWindow.setOnItemClickListener(i -> {\n            int value = getEntryValues()[i];\n            if (callChangeListener(value)) {\n                setValue(value);\n            }\n        });\n\n        a.recycle();\n    }\n\n    public IntegerSimpleMenuPreference(Context context, AttributeSet attrs, int defStyleAttr) {\n        this(context, attrs, defStyleAttr, R.style.Preference_SimpleMenuPreference);\n    }\n\n    public IntegerSimpleMenuPreference(Context context, AttributeSet attrs) {\n        this(context, attrs, R.attr.simpleMenuPreferenceStyle);\n    }\n\n    public IntegerSimpleMenuPreference(Context context) {\n        this(context, null);\n    }\n\n    @SuppressLint(\"RestrictedApi\")\n    private static int[] getIntArray(TypedArray a, @StyleableRes int index,\n                                     @StyleableRes int fallbackIndex) {\n        int resourceId = TypedArrayUtils.getResourceId(a, index, fallbackIndex, 0);\n        return a.getResources().getIntArray(resourceId);\n    }\n\n    @Override\n    protected void onClick() {\n        if (getEntries() == null || getEntries().length == 0) {\n            return;\n        }\n\n        if (mPopupWindow == null) {\n            return;\n        }\n\n        mPopupWindow.setEntries(getEntries());\n        mPopupWindow.setSelectedIndex(findIndexOfValue(getValue()));\n\n        View container = (View) mItemView   // itemView\n                .getParent();               // -> list (RecyclerView)\n\n        mPopupWindow.show(mItemView, container, (int) mAnchor.getX());\n    }\n\n    /**\n     * Sets the human-readable entries to be shown in the list. This will be\n     * shown in subsequent dialogs.\n     * <p>\n     * Each entry must have a corresponding index in\n     * {@link #setEntryValues(int[])}.\n     *\n     * @param entries The entries.\n     * @see #setEntryValues(int[])\n     */\n    public void setEntries(CharSequence[] entries) {\n        mEntries = entries;\n\n        mPopupWindow.requestMeasure();\n    }\n\n    /**\n     * @param entriesResId The entries array as a resource.\n     * @see #setEntries(CharSequence[])\n     */\n    public void setEntries(@ArrayRes int entriesResId) {\n        setEntries(getContext().getResources().getTextArray(entriesResId));\n    }\n\n    /**\n     * The list of entries to be shown in the list in subsequent dialogs.\n     *\n     * @return The list as an array.\n     */\n    public CharSequence[] getEntries() {\n        return mEntries;\n    }\n\n    /**\n     * The array to find the value to save for a preference when an entry from\n     * entries is selected. If a user clicks on the second item in entries, the\n     * second item in this array will be saved to the preference.\n     *\n     * @param entryValues The array to be used as values to save for the preference.\n     */\n    public void setEntryValues(int[] entryValues) {\n        mEntryValues = entryValues;\n    }\n\n    /**\n     * @param entryValuesResId The entry values array as a resource.\n     * @see #setEntryValues(int[])\n     */\n    public void setEntryValues(@ArrayRes int entryValuesResId) {\n        setEntryValues(getContext().getResources().getIntArray(entryValuesResId));\n    }\n\n    /**\n     * Returns the array of values to be saved for the preference.\n     *\n     * @return The array of values.\n     */\n    public int[] getEntryValues() {\n        return mEntryValues;\n    }\n\n    /**\n     * Sets the value of the key. This should be one of the entries in\n     * {@link #getEntryValues()}.\n     *\n     * @param value The value to set for the key.\n     */\n    public void setValue(int value) {\n        // Always persist/notify the first time.\n        final boolean changed = mValue != value;\n        if (changed || !mValueSet) {\n            mValue = value;\n            mValueSet = true;\n            persistInt(value);\n            if (changed) {\n                notifyChanged();\n            }\n        }\n    }\n\n    /**\n     * Returns the summary of this ListPreference. If the summary\n     * has a {@linkplain java.lang.String#format String formatting}\n     * marker in it (i.e. \"%s\" or \"%1$s\"), then the current entry\n     * value will be substituted in its place.\n     *\n     * @return the summary with appropriate string substitution\n     */\n    @Override\n    public CharSequence getSummary() {\n        final CharSequence entry = getEntry();\n        if (mSummary == null) {\n            return super.getSummary();\n        } else {\n            return String.format(mSummary, entry == null ? \"\" : entry);\n        }\n    }\n\n    /**\n     * Sets the summary for this Preference with a CharSequence.\n     * If the summary has a\n     * {@linkplain java.lang.String#format String formatting}\n     * marker in it (i.e. \"%s\" or \"%1$s\"), then the current entry\n     * value will be substituted in its place when it's retrieved.\n     *\n     * @param summary The summary for the preference.\n     */\n    @Override\n    public void setSummary(CharSequence summary) {\n        super.setSummary(summary);\n        if (summary == null && mSummary != null) {\n            mSummary = null;\n        } else if (summary != null && !summary.equals(mSummary)) {\n            mSummary = summary.toString();\n        }\n    }\n\n    /**\n     * Sets the value to the given index from the entry values.\n     *\n     * @param index The index of the value to set.\n     */\n    public void setValueIndex(int index) {\n        if (mEntryValues != null) {\n            setValue(mEntryValues[index]);\n        }\n    }\n\n    /**\n     * Returns the value of the key. This should be one of the entries in\n     * {@link #getEntryValues()}.\n     *\n     * @return The value of the key.\n     */\n    public int getValue() {\n        return mValue;\n    }\n\n    /**\n     * Returns the entry corresponding to the current value.\n     *\n     * @return The entry corresponding to the current value, or null.\n     */\n    public CharSequence getEntry() {\n        int index = getValueIndex();\n        return index >= 0 && mEntries != null ? mEntries[index] : null;\n    }\n\n    /**\n     * Returns the index of the given value (in the entry values array).\n     *\n     * @param value The value whose index should be returned.\n     * @return The index of the value, or -1 if not found.\n     */\n    public int findIndexOfValue(int value) {\n        if (mEntryValues != null) {\n            for (int i = mEntryValues.length - 1; i >= 0; i--) {\n                int entryValue = mEntryValues[i];\n                if (entryValue == value) {\n                    return i;\n                }\n            }\n        }\n        return -1;\n    }\n\n    private int getValueIndex() {\n        return findIndexOfValue(mValue);\n    }\n\n    @Override\n    protected Object onGetDefaultValue(TypedArray a, int index) {\n        return a.getInt(index, 1);\n    }\n\n    @Override\n    protected void onSetInitialValue(Object defaultValue) {\n        if (defaultValue == null) {\n            defaultValue = 0;\n        }\n        setValue(getPersistedInt((Integer) defaultValue));\n    }\n\n    @Override\n    protected Parcelable onSaveInstanceState() {\n        final Parcelable superState = super.onSaveInstanceState();\n        if (isPersistent()) {\n            // No need to save instance state since it's persistent\n            return superState;\n        }\n\n        final SavedState myState = new SavedState(superState);\n        myState.value = getValue();\n        return myState;\n    }\n\n    @Override\n    protected void onRestoreInstanceState(Parcelable state) {\n        if (state == null || !state.getClass().equals(SavedState.class)) {\n            // Didn't save state for us in onSaveInstanceState\n            super.onRestoreInstanceState(state);\n            return;\n        }\n\n        SavedState myState = (SavedState) state;\n        super.onRestoreInstanceState(myState.getSuperState());\n        setValue(myState.value);\n    }\n\n    private static class SavedState extends BaseSavedState {\n        int value;\n\n        public SavedState(Parcel source) {\n            super(source);\n            value = source.readInt();\n        }\n\n        @Override\n        public void writeToParcel(@NonNull Parcel dest, int flags) {\n            super.writeToParcel(dest, flags);\n            dest.writeInt(value);\n        }\n\n        public SavedState(Parcelable superState) {\n            super(superState);\n        }\n\n        public static final Parcelable.Creator<SavedState> CREATOR =\n                new Parcelable.Creator<SavedState>() {\n                    public SavedState createFromParcel(Parcel in) {\n                        return new SavedState(in);\n                    }\n\n                    public SavedState[] newArray(int size) {\n                        return new SavedState[size];\n                    }\n                };\n    }\n\n    @Override\n    public void onBindViewHolder(PreferenceViewHolder holder) {\n        super.onBindViewHolder(holder);\n\n        mItemView = holder.itemView;\n        mAnchor = holder.itemView.findViewById(android.R.id.empty);\n\n        if (mAnchor == null) {\n            throw new IllegalStateException(\"SimpleMenuPreference item layout must contain\" +\n                    \"a view id is android.R.id.empty to support iconSpaceReserved\");\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/settings/SettingsActivity.kt",
    "content": "package moe.shizuku.manager.settings\n\nimport android.content.res.Resources\nimport android.os.Bundle\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.app.AppBarFragmentActivity\n\nclass SettingsActivity : AppBarFragmentActivity() {\n\n    override fun onApplyUserThemeResource(theme: Resources.Theme, isDecorView: Boolean) {\n        super.onApplyUserThemeResource(theme, isDecorView)\n        theme.applyStyle(R.style.ThemeOverlay_Rikka_Material3_Preference, true)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        if (savedInstanceState == null) {\n            supportFragmentManager.beginTransaction()\n                    .replace(R.id.fragment_container, SettingsFragment())\n                    .commit()\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt",
    "content": "package moe.shizuku.manager.settings\n\nimport android.content.ComponentName\nimport android.content.Context\nimport android.os.Build\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.util.TypedValue\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.appcompat.app.AppCompatDelegate\nimport androidx.preference.*\nimport androidx.recyclerview.widget.RecyclerView\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.ShizukuSettings\nimport moe.shizuku.manager.ShizukuSettings.KEEP_START_ON_BOOT\nimport moe.shizuku.manager.app.ThemeHelper\nimport moe.shizuku.manager.app.ThemeHelper.KEY_BLACK_NIGHT_THEME\nimport moe.shizuku.manager.app.ThemeHelper.KEY_USE_SYSTEM_COLOR\nimport moe.shizuku.manager.ktx.isComponentEnabled\nimport moe.shizuku.manager.ktx.setComponentEnabled\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.receiver.BootCompleteReceiver\nimport moe.shizuku.manager.utils.CustomTabsHelper\nimport rikka.core.util.ResourceUtils\nimport rikka.material.app.LocaleDelegate\nimport rikka.recyclerview.addEdgeSpacing\nimport rikka.recyclerview.fixEdgeEffect\nimport rikka.shizuku.manager.ShizukuLocales\nimport rikka.widget.borderview.BorderRecyclerView\nimport java.util.*\nimport moe.shizuku.manager.ShizukuSettings.LANGUAGE as KEY_LANGUAGE\nimport moe.shizuku.manager.ShizukuSettings.NIGHT_MODE as KEY_NIGHT_MODE\n\nclass SettingsFragment : PreferenceFragmentCompat() {\n\n    private lateinit var languagePreference: ListPreference\n    private lateinit var nightModePreference: IntegerSimpleMenuPreference\n    private lateinit var blackNightThemePreference: TwoStatePreference\n    private lateinit var startOnBootPreference: TwoStatePreference\n    private lateinit var startupPreference: PreferenceCategory\n    private lateinit var translationPreference: Preference\n    private lateinit var translationContributorsPreference: Preference\n    private lateinit var useSystemColorPreference: TwoStatePreference\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        val context = requireContext()\n\n        preferenceManager.setStorageDeviceProtected()\n        preferenceManager.sharedPreferencesName = ShizukuSettings.NAME\n        preferenceManager.sharedPreferencesMode = Context.MODE_PRIVATE\n        setPreferencesFromResource(R.xml.settings, null)\n\n        languagePreference = findPreference(KEY_LANGUAGE)!!\n        nightModePreference = findPreference(KEY_NIGHT_MODE)!!\n        blackNightThemePreference = findPreference(KEY_BLACK_NIGHT_THEME)!!\n        startOnBootPreference = findPreference(KEEP_START_ON_BOOT)!!\n        startupPreference = findPreference(\"startup\")!!\n        translationPreference = findPreference(\"translation\")!!\n        translationContributorsPreference = findPreference(\"translation_contributors\")!!\n        useSystemColorPreference = findPreference(KEY_USE_SYSTEM_COLOR)!!\n\n        val componentName = ComponentName(context.packageName, BootCompleteReceiver::class.java.name)\n\n        startOnBootPreference.isChecked = context.packageManager.isComponentEnabled(componentName)\n        startOnBootPreference.onPreferenceChangeListener =\n            Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any ->\n                if (newValue is Boolean) {\n                    context.packageManager.setComponentEnabled(componentName, newValue)\n                    context.packageManager.isComponentEnabled(componentName) == newValue\n                } else false\n            }\n        languagePreference.onPreferenceChangeListener =\n            Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any ->\n                if (newValue is String) {\n                    val locale: Locale = if (\"SYSTEM\" == newValue) {\n                        LocaleDelegate.systemLocale\n                    } else {\n                        Locale.forLanguageTag(newValue)\n                    }\n                    LocaleDelegate.defaultLocale = locale\n                    activity?.recreate()\n                }\n                true\n            }\n\n        setupLocalePreference()\n\n        nightModePreference.value = ShizukuSettings.getNightMode()\n        nightModePreference.onPreferenceChangeListener =\n            Preference.OnPreferenceChangeListener { _: Preference?, value: Any? ->\n                if (value is Int) {\n                    if (ShizukuSettings.getNightMode() != value) {\n                        AppCompatDelegate.setDefaultNightMode(value)\n                        activity?.recreate()\n                    }\n                }\n                true\n            }\n        if (ShizukuSettings.getNightMode() != AppCompatDelegate.MODE_NIGHT_NO) {\n            blackNightThemePreference.isChecked = ThemeHelper.isBlackNightTheme(context)\n            blackNightThemePreference.onPreferenceChangeListener =\n                Preference.OnPreferenceChangeListener { _: Preference?, _: Any? ->\n                    if (ResourceUtils.isNightMode(context.resources.configuration)) {\n                        activity?.recreate()\n                    }\n                    true\n                }\n        } else {\n            blackNightThemePreference.isVisible = false\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n            useSystemColorPreference.onPreferenceChangeListener =\n                Preference.OnPreferenceChangeListener { _: Preference?, value: Any? ->\n                    if (value is Boolean) {\n                        if (ThemeHelper.isUsingSystemColor() != value) {\n                            activity?.recreate()\n                        }\n                    }\n                    true\n                }\n        } else {\n            useSystemColorPreference.isVisible = false\n        }\n\n        translationPreference.summary =\n            context.getString(R.string.settings_translation_summary, context.getString(R.string.app_name))\n        translationPreference.setOnPreferenceClickListener {\n            CustomTabsHelper.launchUrlOrCopy(context, context.getString(R.string.translation_url))\n            true\n        }\n\n        val contributors = context.getString(R.string.translation_contributors).toHtml().toString()\n        if (contributors.isNotBlank()) {\n            translationContributorsPreference.summary = contributors\n        } else {\n            translationContributorsPreference.isVisible = false\n        }\n    }\n\n    override fun onCreateRecyclerView(\n        inflater: LayoutInflater,\n        parent: ViewGroup,\n        savedInstanceState: Bundle?\n    ): RecyclerView {\n        val recyclerView = super.onCreateRecyclerView(inflater, parent, savedInstanceState) as BorderRecyclerView\n        recyclerView.fixEdgeEffect()\n        recyclerView.addEdgeSpacing(bottom = 8f, unit = TypedValue.COMPLEX_UNIT_DIP)\n\n        val lp = recyclerView.layoutParams\n        if (lp is FrameLayout.LayoutParams) {\n            lp.rightMargin = recyclerView.context.resources.getDimension(R.dimen.rd_activity_horizontal_margin).toInt()\n            lp.leftMargin = lp.rightMargin\n        }\n\n        return recyclerView\n    }\n\n    private fun setupLocalePreference() {\n        val localeTags = ShizukuLocales.LOCALES\n        val displayLocaleTags = ShizukuLocales.DISPLAY_LOCALES\n\n        languagePreference.entries = displayLocaleTags\n        languagePreference.entryValues = localeTags\n\n        val currentLocaleTag = languagePreference.value\n        val currentLocaleIndex = localeTags.indexOf(currentLocaleTag)\n        val currentLocale = ShizukuSettings.getLocale()\n        val localizedLocales = mutableListOf<CharSequence>()\n\n        for ((index, displayLocale) in displayLocaleTags.withIndex()) {\n            if (index == 0) {\n                localizedLocales.add(getString(R.string.follow_system))\n                continue\n            }\n\n            val locale = Locale.forLanguageTag(displayLocale.toString())\n            val localeName = if (!TextUtils.isEmpty(locale.script))\n                locale.getDisplayScript(locale)\n            else\n                locale.getDisplayName(locale)\n\n            val localizedLocaleName = if (!TextUtils.isEmpty(locale.script))\n                locale.getDisplayScript(currentLocale)\n            else\n                locale.getDisplayName(currentLocale)\n\n            localizedLocales.add(\n                if (index != currentLocaleIndex) {\n                    \"$localeName<br><small>$localizedLocaleName<small>\".toHtml()\n                } else {\n                    localizedLocaleName\n                }\n            )\n        }\n\n        languagePreference.entries = localizedLocales.toTypedArray()\n\n        languagePreference.summary = when {\n            TextUtils.isEmpty(currentLocaleTag) || \"SYSTEM\" == currentLocaleTag -> {\n                getString(R.string.follow_system)\n            }\n            currentLocaleIndex != -1 -> {\n                val localizedLocale = localizedLocales[currentLocaleIndex]\n                val newLineIndex = localizedLocale.indexOf('\\n')\n                if (newLineIndex == -1) {\n                    localizedLocale.toString()\n                } else {\n                    localizedLocale.subSequence(0, newLineIndex).toString()\n                }\n            }\n            else -> {\n                \"\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/shell/Shell.java",
    "content": "package moe.shizuku.manager.shell;\n\nimport android.content.pm.PackageManager;\nimport android.os.Handler;\nimport android.os.IBinder;\n\nimport rikka.rish.Rish;\nimport rikka.rish.RishConfig;\nimport rikka.shizuku.Shizuku;\nimport rikka.shizuku.ShizukuApiConstants;\n\npublic class Shell extends Rish {\n\n    @Override\n    public void requestPermission(Runnable onGrantedRunnable) {\n        if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) {\n            onGrantedRunnable.run();\n        } else if (Shizuku.shouldShowRequestPermissionRationale()) {\n            System.err.println(\"Permission denied\");\n            System.err.flush();\n            System.exit(1);\n        } else {\n            Shizuku.addRequestPermissionResultListener(new Shizuku.OnRequestPermissionResultListener() {\n                @Override\n                public void onRequestPermissionResult(int requestCode, int grantResult) {\n                    Shizuku.removeRequestPermissionResultListener(this);\n\n                    if (grantResult == PackageManager.PERMISSION_GRANTED) {\n                        onGrantedRunnable.run();\n                    } else {\n                        System.err.println(\"Permission denied\");\n                        System.err.flush();\n                        System.exit(1);\n                    }\n                }\n            });\n            Shizuku.requestPermission(0);\n        }\n    }\n\n    public static void main(String[] args, String packageName, IBinder binder, Handler handler) {\n        RishConfig.init(binder, ShizukuApiConstants.BINDER_DESCRIPTOR, 30000);\n        Shizuku.onBinderReceived(binder, packageName);\n        Shizuku.addBinderReceivedListenerSticky(() -> {\n            int version = Shizuku.getVersion();\n            if (version < 12) {\n                System.err.println(\"Rish requires server 12 (running \" + version + \")\");\n                System.err.flush();\n                System.exit(1);\n            }\n            new Shell().start(args);\n        });\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/shell/ShellBinderRequestHandler.kt",
    "content": "package moe.shizuku.manager.shell\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.IBinder\nimport android.os.Parcel\nimport moe.shizuku.manager.utils.Logger.LOGGER\nimport rikka.shizuku.Shizuku\n\nobject ShellBinderRequestHandler {\n\n    fun handleRequest(context: Context, intent: Intent): Boolean {\n        if (intent.action != \"rikka.shizuku.intent.action.REQUEST_BINDER\") {\n            return false\n        }\n\n        val binder = intent.getBundleExtra(\"data\")?.getBinder(\"binder\") ?: return false\n        val shizukuBinder = Shizuku.getBinder()\n        if (shizukuBinder == null) {\n            LOGGER.w(\"Binder not received or Shizuku service not running\")\n        }\n\n        val data = Parcel.obtain()\n        return try {\n            data.writeStrongBinder(shizukuBinder)\n            data.writeString(context.applicationInfo.sourceDir)\n            binder.transact(1, data, null, IBinder.FLAG_ONEWAY)\n            true\n        } catch (e: Throwable) {\n            e.printStackTrace()\n            false\n        } finally {\n            data.recycle()\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/shell/ShellTutorialActivity.kt",
    "content": "package moe.shizuku.manager.shell\n\nimport android.net.Uri\nimport android.os.Bundle\nimport android.provider.DocumentsContract\nimport android.view.View\nimport androidx.activity.result.contract.ActivityResultContracts\nimport moe.shizuku.manager.Helps\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.app.AppBarActivity\nimport moe.shizuku.manager.databinding.TerminalTutorialActivityBinding\nimport moe.shizuku.manager.ktx.toHtml\nimport moe.shizuku.manager.utils.CustomTabsHelper\nimport rikka.html.text.HtmlCompat\nimport rikka.insets.*\nimport kotlin.math.roundToInt\n\nclass ShellTutorialActivity : AppBarActivity() {\n\n    companion object {\n\n        private val SH_NAME = \"rish\"\n        private val DEX_NAME = \"rish_shizuku.dex\"\n    }\n\n    private val openDocumentsTree =\n        registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { tree: Uri? ->\n            if (tree == null) return@registerForActivityResult\n\n            val cr = contentResolver\n            val doc = DocumentsContract.buildDocumentUriUsingTree(tree, DocumentsContract.getTreeDocumentId(tree))\n            val child =\n                DocumentsContract.buildChildDocumentsUriUsingTree(tree, DocumentsContract.getTreeDocumentId(tree))\n\n            cr.query(\n                child,\n                arrayOf(DocumentsContract.Document.COLUMN_DOCUMENT_ID, DocumentsContract.Document.COLUMN_DISPLAY_NAME),\n                null,\n                null,\n                null\n            )?.use {\n                while (it.moveToNext()) {\n                    val id = it.getString(0)\n                    val name = it.getString(1)\n                    if (name == SH_NAME || name == DEX_NAME) {\n                        DocumentsContract.deleteDocument(cr, DocumentsContract.buildDocumentUriUsingTree(tree, id))\n                    }\n                }\n            }\n\n            fun writeToDocument(name: String) {\n                DocumentsContract.createDocument(contentResolver, doc, \"application/octet-stream\", name)?.runCatching {\n                    cr.openOutputStream(this)?.let { assets.open(name).copyTo(it) }\n                }\n            }\n\n            writeToDocument(SH_NAME)\n            writeToDocument(DEX_NAME)\n        }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val binding = TerminalTutorialActivityBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        binding.content.apply {\n            setInitialPadding(\n                initialPaddingLeft,\n                initialPaddingTop + (resources.displayMetrics.density * 8).roundToInt(),\n                initialPaddingRight,\n                initialPaddingBottom\n            )\n        }\n\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        binding.apply {\n            val shName = \"<font face=\\\"monospace\\\">$SH_NAME</font>\"\n            val dexName = \"<font face=\\\"monospace\\\">$DEX_NAME</font>\"\n\n            summary.text =\n                getString(R.string.rish_description, shName).toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE)\n\n            text1.text = getString(R.string.terminal_tutorial_1, shName, dexName).toHtml()\n\n            text2.text = getString(R.string.terminal_tutorial_2, shName).toHtml()\n            summary2.text = getString(\n                R.string.terminal_tutorial_2_description,\n                \"Termux\",\n                \"<font face=\\\"monospace\\\">PKG</font>\",\n                \"<font face=\\\"monospace\\\">com.termux</font>\",\n                \"<font face=\\\"monospace\\\">com.termux</font>\",\n            ).toHtml()\n\n            text3.text = getString(\n                R.string.terminal_tutorial_3,\n                \"<font face=\\\"monospace\\\">sh $SH_NAME</font>\",\n            ).toHtml()\n            summary3.text = getString(\n                R.string.terminal_tutorial_3_description,\n                shName, \"<font face=\\\"monospace\\\">PATH</font>\"\n            ).toHtml()\n\n            button1.setOnClickListener { openDocumentsTree.launch(null) }\n            button2.setOnClickListener { v: View -> CustomTabsHelper.launchUrlOrCopy(v.context, Helps.RISH.get()) }\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/starter/Starter.kt",
    "content": "package moe.shizuku.manager.starter\n\nimport moe.shizuku.manager.application\nimport java.io.File\n\nobject Starter {\n\n    private val starterFile = File(application.applicationInfo.nativeLibraryDir, \"libshizuku.so\")\n\n    val userCommand: String = starterFile.absolutePath\n\n    val adbCommand = \"adb shell $userCommand\"\n\n    val internalCommand = \"$userCommand --apk=${application.applicationInfo.sourceDir}\"\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/starter/StarterActivity.kt",
    "content": "package moe.shizuku.manager.starter\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.topjohnwu.superuser.CallbackList\nimport com.topjohnwu.superuser.Shell\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.launch\nimport moe.shizuku.manager.AppConstants.EXTRA\nimport moe.shizuku.manager.R\nimport moe.shizuku.manager.ShizukuSettings\nimport moe.shizuku.manager.adb.AdbClient\nimport moe.shizuku.manager.adb.AdbKey\nimport moe.shizuku.manager.adb.AdbKeyException\nimport moe.shizuku.manager.adb.PreferenceAdbKeyStore\nimport moe.shizuku.manager.app.AppBarActivity\nimport moe.shizuku.manager.databinding.StarterActivityBinding\nimport rikka.lifecycle.Resource\nimport rikka.lifecycle.Status\nimport rikka.lifecycle.viewModels\nimport rikka.shizuku.Shizuku\nimport java.net.ConnectException\nimport javax.net.ssl.SSLProtocolException\n\nprivate class NotRootedException : Exception()\n\nclass StarterActivity : AppBarActivity() {\n\n    private val viewModel by viewModels {\n        ViewModel(\n            this,\n            intent.getBooleanExtra(EXTRA_IS_ROOT, true),\n            intent.getStringExtra(EXTRA_HOST),\n            intent.getIntExtra(EXTRA_PORT, 0)\n        )\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_close_24)\n\n        val binding = StarterActivityBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        viewModel.output.observe(this) {\n            val output = it.data!!.trim()\n            if (output.endsWith(\"info: shizuku_starter exit with 0\")) {\n                viewModel.appendOutput(\"\")\n                viewModel.appendOutput(\"Waiting for service...\")\n\n                Shizuku.addBinderReceivedListener(object : Shizuku.OnBinderReceivedListener {\n                    override fun onBinderReceived() {\n                        Shizuku.removeBinderReceivedListener(this)\n                        viewModel.appendOutput(\"Service started, this window will be automatically closed in 3 seconds\")\n\n                        window?.decorView?.postDelayed({\n                            if (!isFinishing) finish()\n                        }, 3000)\n                    }\n                })\n            } else if (it.status == Status.ERROR) {\n                var message = 0\n                when (it.error) {\n                    is AdbKeyException -> {\n                        message = R.string.adb_error_key_store\n                    }\n                    is NotRootedException -> {\n                        message = R.string.start_with_root_failed\n                    }\n                    is ConnectException -> {\n                        message = R.string.cannot_connect_port\n                    }\n                    is SSLProtocolException -> {\n                        message = R.string.adb_pair_required\n                    }\n                }\n\n                if (message != 0) {\n                    MaterialAlertDialogBuilder(this)\n                        .setMessage(message)\n                        .setPositiveButton(android.R.string.ok, null)\n                        .show()\n                }\n            }\n            binding.text1.text = output\n        }\n    }\n\n    companion object {\n\n        const val EXTRA_IS_ROOT = \"$EXTRA.IS_ROOT\"\n        const val EXTRA_HOST = \"$EXTRA.HOST\"\n        const val EXTRA_PORT = \"$EXTRA.PORT\"\n    }\n}\n\nprivate class ViewModel(context: Context, root: Boolean, host: String?, port: Int) : androidx.lifecycle.ViewModel() {\n\n    private val sb = StringBuilder()\n    private val _output = MutableLiveData<Resource<StringBuilder>>()\n\n    val output = _output as LiveData<Resource<StringBuilder>>\n\n    init {\n        try {\n            if (root) {\n                startRoot()\n            } else {\n                startAdb(host!!, port)\n            }\n        } catch (e: Throwable) {\n            postResult(e)\n        }\n    }\n\n    fun appendOutput(line: String) {\n        sb.appendLine(line)\n        postResult()\n    }\n\n    private fun postResult(throwable: Throwable? = null) {\n        if (throwable == null)\n            _output.postValue(Resource.success(sb))\n        else\n            _output.postValue(Resource.error(throwable, sb))\n    }\n\n    private fun startRoot() {\n        sb.append(\"Starting with root...\").append('\\n').append('\\n')\n        postResult()\n\n        GlobalScope.launch(Dispatchers.IO) {\n            if (!Shell.getShell().isRoot) {\n                Shell.getCachedShell()?.close()\n                sb.append('\\n').append(\"Can't open root shell, try again...\").append('\\n')\n\n                postResult()\n                if (!Shell.getShell().isRoot) {\n                    sb.append('\\n').append(\"Still not :(\").append('\\n')\n                    postResult(NotRootedException())\n                    return@launch\n                }\n            }\n\n            Shell.cmd(Starter.internalCommand).to(object : CallbackList<String?>() {\n                override fun onAddElement(s: String?) {\n                    sb.append(s).append('\\n')\n                    postResult()\n                }\n            }).submit {\n                if (it.code != 0) {\n                    sb.append('\\n').append(\"Send this to developer may help solve the problem.\")\n                    postResult()\n                }\n            }\n        }\n    }\n\n    private fun startAdb(host: String, port: Int) {\n        sb.append(\"Starting with wireless adb in port $port...\").append('\\n').append('\\n')\n        postResult()\n\n        GlobalScope.launch(Dispatchers.IO) {\n            val key = try {\n                AdbKey(PreferenceAdbKeyStore(ShizukuSettings.getPreferences()), \"shizuku\")\n            } catch (e: Throwable) {\n                e.printStackTrace()\n                sb.append('\\n').append(Log.getStackTraceString(e))\n\n                postResult(AdbKeyException(e))\n                return@launch\n            }\n\n            AdbClient(host, port, key).runCatching {\n                connect()\n                shellCommand(Starter.internalCommand) {\n                    sb.append(String(it))\n                    postResult()\n                }\n                close()\n            }.onFailure {\n                it.printStackTrace()\n\n                sb.append('\\n').append(Log.getStackTraceString(it))\n                postResult(it)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/AppIconCache.kt",
    "content": "package moe.shizuku.manager.utils\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.pm.ApplicationInfo\nimport android.graphics.Bitmap\nimport android.graphics.drawable.AdaptiveIconDrawable\nimport android.os.Build\nimport android.widget.ImageView\nimport androidx.collection.LruCache\nimport kotlinx.coroutines.*\nimport me.zhanghai.android.appiconloader.AppIconLoader\nimport moe.shizuku.manager.R\nimport rikka.core.util.BuildUtils\nimport java.util.concurrent.Executor\nimport java.util.concurrent.Executors\nimport kotlin.coroutines.CoroutineContext\n\nobject AppIconCache : CoroutineScope {\n\n    private class AppIconLruCache constructor(maxSize: Int) : LruCache<Triple<String, Int, Int>, Bitmap>(maxSize) {\n\n        override fun sizeOf(key: Triple<String, Int, Int>, bitmap: Bitmap): Int {\n            return bitmap.byteCount / 1024\n        }\n    }\n\n    override val coroutineContext: CoroutineContext get() = Dispatchers.Main\n\n    private val lruCache: LruCache<Triple<String, Int, Int>, Bitmap>\n\n    private val dispatcher: CoroutineDispatcher\n\n    private var appIconLoaders = mutableMapOf<Int, AppIconLoader>()\n\n    init {\n        // Initialize app icon lru cache\n        val maxMemory = Runtime.getRuntime().maxMemory() / 1024\n        val availableCacheSize = (maxMemory / 4).toInt()\n        lruCache = AppIconLruCache(availableCacheSize)\n\n        // Initialize load icon scheduler\n        val availableProcessorsCount = try {\n            Runtime.getRuntime().availableProcessors()\n        } catch (ignored: Exception) {\n            1\n        }\n        val threadCount = 1.coerceAtLeast(availableProcessorsCount / 2)\n        val loadIconExecutor: Executor = Executors.newFixedThreadPool(threadCount)\n        dispatcher = loadIconExecutor.asCoroutineDispatcher()\n    }\n\n    fun dispatcher(): CoroutineDispatcher {\n        return dispatcher\n    }\n\n    private fun get(packageName: String, userId: Int, size: Int): Bitmap? {\n        return lruCache[Triple(packageName, userId, size)]\n    }\n\n    private fun put(packageName: String, userId: Int, size: Int, bitmap: Bitmap) {\n        if (get(packageName, userId, size) == null) {\n            lruCache.put(Triple(packageName, userId, size), bitmap)\n        }\n    }\n\n    private fun remove(packageName: String, userId: Int, size: Int) {\n        lruCache.remove(Triple(packageName, userId, size))\n    }\n\n    @SuppressLint(\"NewApi\")\n    fun getOrLoadBitmap(context: Context, info: ApplicationInfo, userId: Int, size: Int): Bitmap? {\n        val cachedBitmap = get(info.packageName, userId, size)\n        if (cachedBitmap != null) {\n            return cachedBitmap\n        }\n        var loader = appIconLoaders[size]\n        if (loader == null) {\n            val shrinkNonAdaptiveIcons = BuildUtils.atLeast30 && context.applicationInfo.loadIcon(context.packageManager) is AdaptiveIconDrawable\n            loader = AppIconLoader(size, shrinkNonAdaptiveIcons, context)\n            appIconLoaders[size] = loader\n        }\n        val bitmap = loader.loadIcon(info, false)\n        put(info.packageName, userId, size, bitmap)\n        return bitmap\n    }\n\n    @JvmStatic\n    fun loadIconBitmapAsync(context: Context,\n                            info: ApplicationInfo, userId: Int,\n                            view: ImageView): Job {\n        return launch {\n            val size = view.measuredWidth.let { if (it > 0) it else context.resources.getDimensionPixelSize(R.dimen.default_app_icon_size) }\n            val cachedBitmap = get(info.packageName, userId, size)\n            if (cachedBitmap != null) {\n                view.setImageBitmap(cachedBitmap)\n                return@launch\n            }\n\n            val bitmap = try {\n                withContext(dispatcher) {\n                    getOrLoadBitmap(context, info, userId, size)\n                }\n            } catch (e: CancellationException) {\n                // do nothing if canceled\n                return@launch\n            } catch (e: Throwable) {\n                null\n            }\n\n            if (bitmap != null) {\n                view.setImageBitmap(bitmap)\n            } else {\n                if (Build.VERSION.SDK_INT >= 26) {\n                    view.setImageResource(R.drawable.ic_default_app_icon)\n                } else {\n                    view.setImageDrawable(null)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/CustomTabsHelper.java",
    "content": "package moe.shizuku.manager.utils;\n\nimport android.content.ActivityNotFoundException;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.res.Configuration;\nimport android.net.Uri;\n\nimport androidx.browser.customtabs.CustomTabsIntent;\n\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder;\n\nimport moe.shizuku.manager.R;\nimport rikka.core.util.ClipboardUtils;\nimport rikka.html.text.HtmlCompat;\n\n/**\n * Created by fytho on 2017/12/15.\n */\n\npublic class CustomTabsHelper {\n\n    public interface OnCreateIntentBuilderListener {\n        void onCreateHelpIntentBuilder(Context context, CustomTabsIntent.Builder builder);\n    }\n\n    private static OnCreateIntentBuilderListener sOnCreateIntentBuilderListener;\n\n    public static void setOnCreateIntentBuilderListener(OnCreateIntentBuilderListener onCreateIntentBuilderListener) {\n        sOnCreateIntentBuilderListener = onCreateIntentBuilderListener;\n    }\n\n    public static CustomTabsIntent.Builder createBuilder() {\n        CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();\n        builder.setShowTitle(true);\n        return builder;\n    }\n\n    public static boolean launchHelp(Context context, Uri uri) {\n        CustomTabsIntent.Builder builder = createBuilder();\n\n        if (sOnCreateIntentBuilderListener != null) {\n            sOnCreateIntentBuilderListener.onCreateHelpIntentBuilder(context, builder);\n        }\n\n        Uri.Builder uriBuilder = uri.buildUpon();\n        if ((context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_YES) > 0) {\n            uriBuilder.appendQueryParameter(\"night\", \"1\");\n        }\n\n        return launchUrl(context, builder.build(), uriBuilder.build());\n    }\n\n    public static boolean launchUrl(Context context, Uri uri) {\n        return launchUrl(context, createBuilder().build(), uri);\n    }\n\n    private static boolean launchUrl(Context context, CustomTabsIntent customTabsIntent, Uri uri) {\n        try {\n            customTabsIntent.launchUrl(context, uri);\n            return true;\n        } catch (ActivityNotFoundException e) {\n            return false;\n        }\n    }\n\n    public static void launchUrlOrCopy(Context context, String url) {\n        Uri uri = Uri.parse(url);\n        if (!launchHelp(context, uri)) {\n            Intent intent = new Intent(Intent.ACTION_VIEW);\n            intent.setData(uri);\n\n            try {\n                context.startActivity(intent);\n            } catch (Throwable tr) {\n                try {\n                    ClipboardUtils.put(context, url);\n\n                    new MaterialAlertDialogBuilder(context)\n                            .setTitle(R.string.dialog_cannot_open_browser_title)\n                            .setMessage(HtmlCompat.fromHtml(context.getString(R.string.toast_copied_to_clipboard_with_text, url)))\n                            .setPositiveButton(android.R.string.ok, null)\n                            .show();\n                } catch (Throwable ignored) {\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/EmptySharedPreferencesImpl.java",
    "content": "package moe.shizuku.manager.utils;\n\nimport android.content.SharedPreferences;\n\nimport androidx.annotation.Nullable;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Set;\n\npublic class EmptySharedPreferencesImpl implements SharedPreferences {\n\n    @Override\n    public Map<String, ?> getAll() {\n        return new HashMap<>();\n    }\n\n    @Nullable\n    @Override\n    public String getString(String key, @Nullable String defValue) {\n        return defValue;\n    }\n\n    @Nullable\n    @Override\n    public Set<String> getStringSet(String key, @Nullable Set<String> defValues) {\n        return defValues;\n    }\n\n    @Override\n    public int getInt(String key, int defValue) {\n        return defValue;\n    }\n\n    @Override\n    public long getLong(String key, long defValue) {\n        return defValue;\n    }\n\n    @Override\n    public float getFloat(String key, float defValue) {\n        return defValue;\n    }\n\n    @Override\n    public boolean getBoolean(String key, boolean defValue) {\n        return defValue;\n    }\n\n    @Override\n    public boolean contains(String key) {\n        return false;\n    }\n\n    @Override\n    public Editor edit() {\n        return new EditorImpl();\n    }\n\n    @Override\n    public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {\n\n    }\n\n    @Override\n    public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {\n\n    }\n\n    private static class EditorImpl implements Editor {\n\n        @Override\n        public Editor putString(String key, @Nullable String value) {\n            return this;\n        }\n\n        @Override\n        public Editor putStringSet(String key, @Nullable Set<String> values) {\n            return this;\n        }\n\n        @Override\n        public Editor putInt(String key, int value) {\n            return this;\n        }\n\n        @Override\n        public Editor putLong(String key, long value) {\n            return this;\n        }\n\n        @Override\n        public Editor putFloat(String key, float value) {\n            return this;\n        }\n\n        @Override\n        public Editor putBoolean(String key, boolean value) {\n            return this;\n        }\n\n        @Override\n        public Editor remove(String key) {\n            return this;\n        }\n\n        @Override\n        public Editor clear() {\n            return this;\n        }\n\n        @Override\n        public boolean commit() {\n            return true;\n        }\n\n        @Override\n        public void apply() {\n\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/EnvironmentUtils.kt",
    "content": "package moe.shizuku.manager.utils\n\nimport android.app.UiModeManager\nimport android.content.Context\nimport android.content.res.Configuration\nimport android.os.SystemProperties\nimport java.io.File\n\nobject EnvironmentUtils {\n\n    @JvmStatic\n    fun isWatch(context: Context): Boolean {\n        return (context.getSystemService(UiModeManager::class.java).currentModeType\n                == Configuration.UI_MODE_TYPE_WATCH)\n    }\n\n    fun isRooted(): Boolean {\n        return System.getenv(\"PATH\")?.split(File.pathSeparatorChar)?.find { File(\"$it/su\").exists() } != null\n    }\n\n    fun getAdbTcpPort(): Int {\n        var port = SystemProperties.getInt(\"service.adb.tcp.port\", -1)\n        if (port == -1) port = SystemProperties.getInt(\"persist.adb.tcp.port\", -1)\n        return port\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/Logger.java",
    "content": "package moe.shizuku.manager.utils;\n\nimport android.util.Log;\n\nimport java.util.Locale;\n\npublic class Logger {\n\n    public static final Logger LOGGER = new Logger(\"ShizukuManager\");\n\n    private String TAG;\n\n    public Logger(String TAG) {\n        this.TAG = TAG;\n    }\n\n    public boolean isLoggable(String tag, int level) {\n        return true;\n    }\n\n    public void v(String msg) {\n        if (isLoggable(TAG, Log.VERBOSE)) {\n            Log.v(TAG, msg);\n        }\n    }\n\n    public void v(String fmt, Object... args) {\n        if (isLoggable(TAG, Log.VERBOSE)) {\n            Log.v(TAG, String.format(Locale.ENGLISH, fmt, args));\n        }\n    }\n\n    public void v(String msg, Throwable tr) {\n        if (isLoggable(TAG, Log.VERBOSE)) {\n            Log.v(TAG, msg, tr);\n        }\n    }\n\n    public void d(String msg) {\n        if (isLoggable(TAG, Log.DEBUG)) {\n            Log.d(TAG, msg);\n        }\n    }\n\n    public void d(String fmt, Object... args) {\n        if (isLoggable(TAG, Log.DEBUG)) {\n            Log.d(TAG, String.format(Locale.ENGLISH, fmt, args));\n        }\n    }\n\n    public void d(String msg, Throwable tr) {\n        if (isLoggable(TAG, Log.DEBUG)) {\n            Log.d(TAG, msg, tr);\n        }\n    }\n\n    public void i(String msg) {\n        if (isLoggable(TAG, Log.INFO)) {\n            Log.i(TAG, msg);\n        }\n    }\n\n    public void i(String fmt, Object... args) {\n        if (isLoggable(TAG, Log.INFO)) {\n            Log.i(TAG, String.format(Locale.ENGLISH, fmt, args));\n        }\n    }\n\n    public void i(String msg, Throwable tr) {\n        if (isLoggable(TAG, Log.INFO)) {\n            Log.i(TAG, msg, tr);\n        }\n    }\n\n    public void w(String msg) {\n        if (isLoggable(TAG, Log.WARN)) {\n            Log.w(TAG, msg);\n        }\n    }\n\n    public void w(String fmt, Object... args) {\n        if (isLoggable(TAG, Log.WARN)) {\n            Log.w(TAG, String.format(Locale.ENGLISH, fmt, args));\n        }\n    }\n\n    public void w(Throwable tr, String fmt, Object... args) {\n        if (isLoggable(TAG, Log.WARN)) {\n            Log.w(TAG, String.format(Locale.ENGLISH, fmt, args), tr);\n        }\n    }\n\n    public void w(String msg, Throwable tr) {\n        if (isLoggable(TAG, Log.WARN)) {\n            Log.w(TAG, msg, tr);\n        }\n    }\n\n    public void e(String msg) {\n        if (isLoggable(TAG, Log.ERROR)) {\n            Log.e(TAG, msg);\n        }\n    }\n\n    public void e(String fmt, Object... args) {\n        if (isLoggable(TAG, Log.ERROR)) {\n            Log.e(TAG, String.format(Locale.ENGLISH, fmt, args));\n        }\n    }\n\n    public void e(String msg, Throwable tr) {\n        if (isLoggable(TAG, Log.ERROR)) {\n            Log.e(TAG, msg, tr);\n        }\n    }\n\n    public void e(Throwable tr, String fmt, Object... args) {\n        if (isLoggable(TAG, Log.ERROR)) {\n            Log.e(TAG, String.format(Locale.ENGLISH, fmt, args), tr);\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/MultiLocaleEntity.java",
    "content": "package moe.shizuku.manager.utils;\n\nimport androidx.annotation.NonNull;\n\nimport java.util.LinkedHashMap;\nimport java.util.Locale;\n\nimport moe.shizuku.manager.ShizukuSettings;\n\npublic class MultiLocaleEntity extends LinkedHashMap<String, String> {\n\n    public abstract static class LocaleProvider {\n        public abstract Locale get();\n    }\n\n    public static final LocaleProvider DEFAULT_LOCAL_PROVIDER = new LocaleProvider() {\n        @Override\n        public Locale get() {\n            return ShizukuSettings.getLocale();\n        }\n    };\n\n    private static LocaleProvider sLocaleProvider = DEFAULT_LOCAL_PROVIDER;\n\n    public static void setLocaleProvider(@NonNull LocaleProvider localeProvider) {\n        sLocaleProvider = localeProvider;\n    }\n\n    public String get() {\n        return get(sLocaleProvider.get());\n    }\n\n    public String get(@NonNull Locale locale) {\n        if (size() > 0) {\n            String language = locale.getLanguage();\n            String region = locale.getCountry();\n\n            // fully match\n            locale = new Locale(language, region);\n            for (String l : keySet()) {\n                if (locale.toString().equals(l.replace('-', '_'))) {\n                    return get(l);\n                }\n            }\n\n            // match language only keys\n            locale = new Locale(language);\n            for (String l : keySet()) {\n                if (locale.toString().equals(l)) {\n                    return get(l);\n                }\n            }\n\n            // match a language_region with only language\n            for (String l : keySet()) {\n                if (l.startsWith(locale.toString())) {\n                    return get(l);\n                }\n            }\n\n            if (containsKey(\"en\")) {\n                return get(\"en\");\n            }\n\n            if (containsKey(\"default\")) {\n                return get(\"default\");\n            }\n\n            for (String key : keySet()) {\n                if (!\"overwrite_default\".equals(key))\n                    return get(key);\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/ShizukuSystemApis.kt",
    "content": "package moe.shizuku.manager.utils\n\nimport android.content.pm.PackageInfo\nimport android.content.pm.PackageManager\nimport android.content.pm.ParceledListSlice\nimport android.os.RemoteException\nimport rikka.hidden.compat.PackageManagerApis\nimport rikka.hidden.compat.PermissionManagerApis\nimport rikka.hidden.compat.UserManagerApis\nimport rikka.hidden.compat.util.SystemServiceBinder\nimport rikka.shizuku.Shizuku\nimport rikka.shizuku.ShizukuBinderWrapper\n\nobject ShizukuSystemApis {\n\n    init {\n        SystemServiceBinder.setOnGetBinderListener {\n            return@setOnGetBinderListener ShizukuBinderWrapper(it)\n        }\n    }\n\n    private val users = arrayListOf<UserInfoCompat>()\n\n    private fun getUsers(): List<UserInfoCompat> {\n        return if (!Shizuku.pingBinder()) {\n            arrayListOf(UserInfoCompat(UserHandleCompat.myUserId(), \"Owner\"))\n        } else try {\n            val list = UserManagerApis.getUsers(true, true, true)\n            val users: MutableList<UserInfoCompat> = ArrayList<UserInfoCompat>()\n            for (ui in list) {\n                users.add(UserInfoCompat(ui.id, ui.name))\n            }\n            return users\n        } catch (tr: Throwable) {\n            arrayListOf(UserInfoCompat(UserHandleCompat.myUserId(), \"Owner\"))\n        }\n    }\n\n    fun getUsers(useCache: Boolean = true): List<UserInfoCompat> {\n        synchronized(users) {\n            if (!useCache || users.isEmpty()) {\n                users.clear()\n                users.addAll(getUsers())\n            }\n            return users\n        }\n    }\n\n    fun getUserInfo(userId: Int): UserInfoCompat {\n        return getUsers(useCache = true).firstOrNull { it.id == userId } ?: UserInfoCompat(\n            UserHandleCompat.myUserId(),\n            \"Unknown\"\n        )\n    }\n\n    fun getInstalledPackages(flags: Long, userId: Int): List<PackageInfo> {\n        return if (!Shizuku.pingBinder()) {\n            ArrayList()\n        } else try {\n            val listSlice: ParceledListSlice<PackageInfo>? =\n                PackageManagerApis.getInstalledPackages(\n                    flags,\n                    userId\n                )\n            return if (listSlice != null) {\n                listSlice.list\n            } else ArrayList()\n        } catch (tr: RemoteException) {\n            throw RuntimeException(tr.message, tr)\n        }\n    }\n\n    fun checkPermission(permName: String, pkgName: String, userId: Int): Int {\n        return if (!Shizuku.pingBinder()) {\n            PackageManager.PERMISSION_DENIED\n        } else try {\n            PermissionManagerApis.checkPermission(permName, pkgName, userId)\n        } catch (tr: RemoteException) {\n            throw RuntimeException(tr.message, tr)\n        }\n    }\n\n    fun grantRuntimePermission(packageName: String, permissionName: String, userId: Int) {\n        if (!Shizuku.pingBinder()) {\n            return\n        }\n        try {\n            PermissionManagerApis.grantRuntimePermission(packageName, permissionName, userId)\n        } catch (tr: RemoteException) {\n            throw RuntimeException(tr.message, tr)\n        }\n    }\n\n    fun revokeRuntimePermission(packageName: String, permissionName: String, userId: Int) {\n        if (!Shizuku.pingBinder()) {\n            return\n        }\n        try {\n            PermissionManagerApis.revokeRuntimePermission(packageName, permissionName, userId)\n        } catch (tr: RemoteException) {\n            throw RuntimeException(tr.message, tr)\n        }\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/UserHandleCompat.java",
    "content": "package moe.shizuku.manager.utils;\n\nimport android.system.Os;\n\npublic class UserHandleCompat {\n\n    private static final int MY_USER_ID = getUserId(Os.getuid());\n\n    public static final int PER_USER_RANGE = 100000;\n\n    public static int getUserId(int uid) {\n        return uid / PER_USER_RANGE;\n    }\n\n    public static int getAppId(int uid) {\n        return uid % PER_USER_RANGE;\n    }\n\n    public static int myUserId() {\n        return MY_USER_ID;\n    }\n}"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/utils/UserInfoCompat.java",
    "content": "package moe.shizuku.manager.utils;\n\npublic class UserInfoCompat {\n\n    public final int id;\n    public final String name;\n\n    public UserInfoCompat(int id, String name) {\n        this.id = id;\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/widget/CheckedImageView.java",
    "content": "package moe.shizuku.manager.widget;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.widget.Checkable;\nimport android.widget.ImageView;\n\nimport androidx.annotation.Nullable;\n\npublic class CheckedImageView extends ImageView implements Checkable {\n\n    private boolean mChecked;\n\n    private static final int[] CHECKED_STATE_SET = {\n            android.R.attr.state_checked\n    };\n\n    public CheckedImageView(Context context) {\n        super(context);\n    }\n\n    public CheckedImageView(Context context, @Nullable AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public CheckedImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    public CheckedImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n    }\n\n    @Override\n    public void setChecked(boolean checked) {\n        if (mChecked != checked) {\n            mChecked = checked;\n            refreshDrawableState();\n        }\n    }\n\n    @Override\n    public boolean isChecked() {\n        return mChecked;\n    }\n\n    @Override\n    public void toggle() {\n        setChecked(!mChecked);\n    }\n\n    @Override\n    public int[] onCreateDrawableState(int extraSpace) {\n        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);\n        if (isChecked()) {\n            mergeDrawableStates(drawableState, CHECKED_STATE_SET);\n        }\n        return drawableState;\n    }\n}\n"
  },
  {
    "path": "manager/src/main/java/moe/shizuku/manager/widget/VerticalPaddingDecoration.java",
    "content": "package moe.shizuku.manager.widget;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic class VerticalPaddingDecoration extends RecyclerView.ItemDecoration {\n\n    private boolean mAllowTop, mAllowBottom;\n    private int mPadding;\n\n    public VerticalPaddingDecoration(Context context) {\n        this(context, 8);\n    }\n\n    public VerticalPaddingDecoration(Context context, int paddingDp) {\n        this.mPadding = Math.round(paddingDp * context.getResources().getDisplayMetrics().density);\n        this.mAllowTop = true;\n        this.mAllowBottom = true;\n    }\n\n    public void setAllowTop(boolean allowTop) {\n        mAllowTop = allowTop;\n    }\n\n    public void setAllowBottom(boolean allowBottom) {\n        mAllowBottom = allowBottom;\n    }\n\n    @Override\n    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {\n        if (parent.getAdapter() == null) {\n            return;\n        }\n        int position = parent.getChildAdapterPosition(view);\n        int count = parent.getAdapter().getItemCount();\n        if (position == 0 && mAllowTop) {\n            outRect.top = mPadding;\n        } else if (position == count - 1 && mAllowBottom) {\n            outRect.bottom = mPadding;\n        }\n    }\n}\n\n"
  },
  {
    "path": "manager/src/main/jni/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.31)\n\nproject(\"shizuku\")\n\nset(CMAKE_CXX_STANDARD 17)\n\nadd_compile_options(-Werror=format -fdata-sections -ffunction-sections -fno-exceptions -fno-rtti -fno-threadsafe-statics)\n\nif (NOT CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n    message(\"Builing Release...\")\n\n    add_compile_options(-Os -flto -fvisibility=hidden -fvisibility-inlines-hidden)\n    add_link_options(-flto -Wl,--exclude-libs,ALL -Wl,--gc-sections -Wl,--strip-all)\nelse ()\n    message(\"Builing Debug...\")\n\n    add_definitions(-DDEBUG)\nendif ()\n\nfind_package(boringssl REQUIRED CONFIG)\nfind_package(cxx REQUIRED CONFIG)\n\nadd_executable(libshizuku.so\n        starter.cpp misc.cpp selinux.cpp cgroup.cpp)\n\ntarget_link_libraries(libshizuku.so log cxx::cxx)\n\nif (NOT CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n    add_custom_command(TARGET libshizuku.so POST_BUILD\n            COMMAND ${CMAKE_STRIP} --remove-section=.comment \"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libshizuku.so\")\nendif ()\n\nadd_library(adb SHARED\n        adb_pairing.cpp misc.cpp)\n\ntarget_link_libraries(adb log boringssl::crypto_static cxx::cxx)\n\nif (NOT CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n    add_custom_command(TARGET adb POST_BUILD\n            COMMAND ${CMAKE_STRIP} --remove-section=.comment \"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libadb.so\")\nendif ()\n"
  },
  {
    "path": "manager/src/main/jni/adb_pairing.cpp",
    "content": "#include <jni.h>\n#include <dirent.h>\n#include <cstring>\n#include <cstdlib>\n#include <cinttypes>\n#include <sys/system_properties.h>\n#include <openssl/curve25519.h>\n#include <openssl/hkdf.h>\n#include <openssl/evp.h>\n#include \"adb_pairing.h\"\n\n#define LOG_TAG \"AdbPairClient\"\n\n#include \"logging.h\"\n\n// ---------------------------------------------------------\n\nstatic constexpr spake2_role_t kClientRole = spake2_role_alice;\nstatic constexpr spake2_role_t kServerRole = spake2_role_bob;\n\nstatic const uint8_t kClientName[] = \"adb pair client\";\nstatic const uint8_t kServerName[] = \"adb pair server\";\n\nstatic constexpr size_t kHkdfKeyLength = 16;\n\nstruct PairingContextNative {\n    SPAKE2_CTX *spake2_ctx;\n    uint8_t key[SPAKE2_MAX_MSG_SIZE];\n    size_t key_size;\n\n    EVP_AEAD_CTX *aes_ctx;\n    uint64_t dec_sequence;\n    uint64_t enc_sequence;\n};\n\nstatic jlong PairingContext_Constructor(JNIEnv *env, jclass clazz, jboolean isClient, jbyteArray jPassword) {\n    spake2_role_t spake_role;\n    const uint8_t *my_name;\n    const uint8_t *their_name;\n    size_t my_len;\n    size_t their_len;\n\n    if (isClient) {\n        spake_role = kClientRole;\n        my_name = kClientName;\n        my_len = sizeof(kClientName);\n        their_name = kServerName;\n        their_len = sizeof(kServerName);\n    } else {\n        spake_role = kServerRole;\n        my_name = kServerName;\n        my_len = sizeof(kServerName);\n        their_name = kClientName;\n        their_len = sizeof(kClientName);\n    }\n\n    auto spake2_ctx = SPAKE2_CTX_new(spake_role, my_name, my_len, their_name, their_len);\n    if (spake2_ctx == nullptr) {\n        LOGE(\"Unable to create a SPAKE2 context.\");\n        return 0;\n    }\n\n    auto pswd_size = env->GetArrayLength(jPassword);\n    auto pswd = env->GetByteArrayElements(jPassword, nullptr);\n\n    size_t key_size = 0;\n    uint8_t key[SPAKE2_MAX_MSG_SIZE];\n    int status = SPAKE2_generate_msg(spake2_ctx, key, &key_size, SPAKE2_MAX_MSG_SIZE, (uint8_t *) pswd, pswd_size);\n    if (status != 1 || key_size == 0) {\n        LOGE(\"Unable to generate the SPAKE2 public key.\");\n\n        env->ReleaseByteArrayElements(jPassword, pswd, 0);\n        SPAKE2_CTX_free(spake2_ctx);\n        return 0;\n    }\n    env->ReleaseByteArrayElements(jPassword, pswd, 0);\n\n    auto ctx = (PairingContextNative *) malloc(sizeof(PairingContextNative));\n    memset(ctx, 0, sizeof(PairingContextNative));\n    ctx->spake2_ctx = spake2_ctx;\n    memcpy(ctx->key, key, SPAKE2_MAX_MSG_SIZE);\n    ctx->key_size = key_size;\n    return (jlong) ctx;\n}\n\nstatic jbyteArray PairingContext_Msg(JNIEnv *env, jobject obj, jlong ptr) {\n    auto ctx = (PairingContextNative *) ptr;\n    jbyteArray our_msg = env->NewByteArray(ctx->key_size);\n    env->SetByteArrayRegion(our_msg, 0, ctx->key_size, (jbyte *) ctx->key);\n    return our_msg;\n}\n\nstatic jboolean PairingContext_InitCipher(JNIEnv *env, jobject obj, jlong ptr, jbyteArray jTheirMsg) {\n    auto res = JNI_TRUE;\n\n    auto ctx = (PairingContextNative *) ptr;\n    auto spake2_ctx = ctx->spake2_ctx;\n    auto their_msg_size = env->GetArrayLength(jTheirMsg);\n\n    if (their_msg_size > SPAKE2_MAX_MSG_SIZE) {\n        LOGE(\"their_msg size [%d] greater then max size [%d].\", their_msg_size, SPAKE2_MAX_MSG_SIZE);\n        return JNI_FALSE;\n    }\n\n    auto their_msg = env->GetByteArrayElements(jTheirMsg, nullptr);\n\n    size_t key_material_len = 0;\n    uint8_t key_material[SPAKE2_MAX_KEY_SIZE];\n    int status = SPAKE2_process_msg(spake2_ctx, key_material, &key_material_len,\n                                    sizeof(key_material), (uint8_t *) their_msg, their_msg_size);\n\n    env->ReleaseByteArrayElements(jTheirMsg, their_msg, 0);\n\n    if (status != 1) {\n        LOGE(\"Unable to process their public key\");\n        return JNI_FALSE;\n    }\n\n    // --------\n    uint8_t key[kHkdfKeyLength];\n    uint8_t info[] = \"adb pairing_auth aes-128-gcm key\";\n\n    status = HKDF(key, sizeof(key), EVP_sha256(), key_material, key_material_len, nullptr, 0, info,\n                  sizeof(info) - 1);\n    if (status != 1) {\n        LOGE(\"HKDF\");\n        return JNI_FALSE;\n    }\n\n    ctx->aes_ctx = EVP_AEAD_CTX_new(EVP_aead_aes_128_gcm(), key, sizeof(key), EVP_AEAD_DEFAULT_TAG_LENGTH);\n\n    if (!ctx->aes_ctx) {\n        LOGE(\"EVP_AEAD_CTX_new\");\n        return JNI_FALSE;\n    }\n\n    return res;\n}\n\nstatic jbyteArray PairingContext_Encrypt(JNIEnv *env, jobject obj, jlong ptr, jbyteArray jIn) {\n    auto ctx = (PairingContextNative *) ptr;\n    auto aes_ctx = ctx->aes_ctx;\n\n    auto in = env->GetByteArrayElements(jIn, nullptr);\n    auto in_size = env->GetArrayLength(jIn);\n\n    auto out_size = (size_t) in_size + EVP_AEAD_max_overhead(EVP_AEAD_CTX_aead(ctx->aes_ctx));\n    uint8_t out[out_size];\n\n    auto nonce_size = EVP_AEAD_nonce_length(EVP_AEAD_CTX_aead(aes_ctx));\n    uint8_t nonce[nonce_size];\n    memset(nonce, 0, nonce_size);\n    memcpy(nonce, &ctx->enc_sequence, sizeof(ctx->enc_sequence));\n\n    size_t written_sz;\n    int status = EVP_AEAD_CTX_seal(aes_ctx, out, &written_sz, out_size, nonce, nonce_size, (uint8_t *) in, in_size, nullptr, 0);\n\n    env->ReleaseByteArrayElements(jIn, in, 0);\n\n    if (!status) {\n        LOGE(\"Failed to encrypt (in_len=%d, out_len=%\" PRIuPTR\", out_len_needed=%d)\", in_size, out_size, in_size);\n        return nullptr;\n    }\n    ++ctx->enc_sequence;\n\n    jbyteArray jOut = env->NewByteArray(written_sz);\n    env->SetByteArrayRegion(jOut, 0, written_sz, (jbyte *) out);\n    return jOut;\n}\n\nstatic jbyteArray PairingContext_Decrypt(JNIEnv *env, jobject obj, jlong ptr, jbyteArray jIn) {\n    auto ctx = (PairingContextNative *) ptr;\n    auto aes_ctx = ctx->aes_ctx;\n\n    auto in = env->GetByteArrayElements(jIn, nullptr);\n    auto in_size = env->GetArrayLength(jIn);\n\n    auto out_size = (size_t) in_size;\n    uint8_t out[out_size];\n\n    auto nonce_size = EVP_AEAD_nonce_length(EVP_AEAD_CTX_aead(aes_ctx));\n    uint8_t nonce[nonce_size];\n    memset(nonce, 0, nonce_size);\n    memcpy(nonce, &ctx->dec_sequence, sizeof(ctx->dec_sequence));\n\n    size_t written_sz;\n    int status = EVP_AEAD_CTX_open(aes_ctx, out, &written_sz, out_size, nonce, nonce_size, (uint8_t *) in, in_size, nullptr, 0);\n\n    env->ReleaseByteArrayElements(jIn, in, 0);\n\n    if (!status) {\n        LOGE(\"Failed to decrypt (in_len=%d, out_len=%\" PRIuPTR\", out_len_needed=%d)\", in_size, out_size, in_size);\n        return nullptr;\n    }\n    ++ctx->dec_sequence;\n\n    jbyteArray jOut = env->NewByteArray(written_sz);\n    env->SetByteArrayRegion(jOut, 0, written_sz, (jbyte *) out);\n    return jOut;\n}\n\nstatic void PairingContext_Destroy(JNIEnv *env, jobject obj, jlong ptr) {\n    auto ctx = (PairingContextNative *) ptr;\n    SPAKE2_CTX_free(ctx->spake2_ctx);\n    if (ctx->aes_ctx) EVP_AEAD_CTX_free(ctx->aes_ctx);\n    free(ctx);\n}\n\n// ---------------------------------------------------------\n\nJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {\n    JNIEnv *env = nullptr;\n\n    if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK)\n        return -1;\n\n    JNINativeMethod methods_PairingContext[] = {\n            {\"nativeConstructor\", \"(Z[B)J\",  (void *) PairingContext_Constructor},\n            {\"nativeMsg\",         \"(J)[B\",   (void *) PairingContext_Msg},\n            {\"nativeInitCipher\",  \"(J[B)Z\",  (void *) PairingContext_InitCipher},\n            {\"nativeEncrypt\",     \"(J[B)[B\", (void *) PairingContext_Encrypt},\n            {\"nativeDecrypt\",     \"(J[B)[B\", (void *) PairingContext_Decrypt},\n            {\"nativeDestroy\",     \"(J)V\",    (void *) PairingContext_Destroy},\n    };\n\n    env->RegisterNatives(env->FindClass(\"moe/shizuku/manager/adb/PairingContext\"), methods_PairingContext,\n                         sizeof(methods_PairingContext) / sizeof(JNINativeMethod));\n\n    return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "manager/src/main/jni/adb_pairing.h",
    "content": "#ifndef ADB_H\n#define ADB_H\n\n#endif // ADB_H\n"
  },
  {
    "path": "manager/src/main/jni/android.cpp",
    "content": "#include <sys/system_properties.h>\n#include <cstring>\n#include <climits>\n#include <fcntl.h>\n#include <unistd.h>\n\nnamespace android {\n\n    int GetApiLevel() {\n        static int apiLevel = 0;\n        if (apiLevel > 0) return apiLevel;\n\n        char buf[PROP_VALUE_MAX + 1];\n        if (__system_property_get(\"ro.build.version.sdk\", buf) > 0)\n            apiLevel = atoi(buf);\n\n        return apiLevel;\n    }\n\n    int GetPreviewApiLevel() {\n        static int previewApiLevel = 0;\n        if (previewApiLevel > 0) return previewApiLevel;\n\n        char buf[PROP_VALUE_MAX + 1];\n        if (__system_property_get(\"ro.build.version.preview_sdk\", buf) > 0)\n            previewApiLevel = atoi(buf);\n\n        return previewApiLevel;\n    }\n}"
  },
  {
    "path": "manager/src/main/jni/android.h",
    "content": "#pragma once\n\nnamespace android {\n\n    int GetApiLevel();\n\n    int GetPreviewApiLevel();\n}"
  },
  {
    "path": "manager/src/main/jni/cgroup.cpp",
    "content": "#include <cstring>\n#include <fcntl.h>\n#include <unistd.h>\n#include <cstdio>\n\nnamespace cgroup {\n    bool switch_cgroup(const char *cgroup, int pid) {\n        char buf[1024];\n        snprintf(buf, sizeof(buf), \"%s/cgroup.procs\", cgroup);\n        if (access(buf, F_OK) != 0)\n            return false;\n        int fd = open(buf, O_WRONLY | O_APPEND | O_CLOEXEC);\n        if (fd == -1)\n            return false;\n        snprintf(buf, sizeof(buf), \"%d\\n\", pid);\n        ssize_t c = write(fd, buf, strlen(buf));\n        close(fd);\n        return c == strlen(buf);\n    }\n}\n"
  },
  {
    "path": "manager/src/main/jni/cgroup.h",
    "content": "#ifndef CGROUP_H\n#define CGROUP_H\n\nnamespace cgroup {\n    bool switch_cgroup(const char *cgroup, int pid);\n}\n\n#endif // CGROUP_H\n"
  },
  {
    "path": "manager/src/main/jni/helper.cpp",
    "content": "#include <jni.h>\n#include <dirent.h>\n#include <unistd.h>\n#include <mntent.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <cassert>\n#include <cstring>\n#include \"selinux.h\"\n\n#define LOG_TAG \"ShizukuServer\"\n\n#include \"logging.h\"\n\nstatic jint setcontext(JNIEnv *env, jobject thiz, jstring jName) {\n    const char *name = env->GetStringUTFChars(jName, nullptr);\n\n    if (!se::setcon)\n        return -1;\n\n    int res = se::setcon(name);\n    if (res == -1) PLOGE(\"setcon %s\", name);\n\n    env->ReleaseStringUTFChars(jName, name);\n\n    return res;\n}\n\nstatic JNINativeMethod gMethods[] = {\n        {\"setSELinuxContext\", \"(Ljava/lang/String;)I\", (void *) setcontext},\n};\n\nstatic int registerNativeMethods(JNIEnv *env, const char *className,\n                                 JNINativeMethod *gMethods, int numMethods) {\n    jclass clazz;\n    clazz = env->FindClass(className);\n    if (clazz == nullptr)\n        return JNI_FALSE;\n\n    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0)\n        return JNI_FALSE;\n\n    return JNI_TRUE;\n}\n\nstatic int registerNatives(JNIEnv *env) {\n    if (!registerNativeMethods(env, \"moe/shizuku/server/utils/NativeHelper\", gMethods,\n                               sizeof(gMethods) / sizeof(gMethods[0])))\n        return JNI_FALSE;\n\n    return JNI_TRUE;\n}\n\nJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {\n    JNIEnv *env = nullptr;\n    jint result;\n\n    if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK)\n        return -1;\n\n    assert(env != nullptr);\n\n    se::init();\n\n    if (!registerNatives(env)) {\n        LOGE(\"registerNatives NativeHelper\");\n        return -1;\n    }\n\n    result = JNI_VERSION_1_6;\n\n    return result;\n}\n"
  },
  {
    "path": "manager/src/main/jni/logging.h",
    "content": "#ifndef _LOGGING_H\n#define _LOGGING_H\n\n#include <errno.h>\n#include \"android/log.h\"\n\n#ifndef LOG_TAG\n#define LOG_TAG    \"Shizuku\"\n#endif\n\n#ifndef NO_LOG\n#ifndef NO_DEBUG_LOG\n#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)\n#else\n#define LOGD(...)\n#endif\n#define LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)\n#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\n#define LOGW(...)  __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)\n#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)\n#define PLOGE(fmt, args...) LOGE(fmt \" failed with %d: %s\", ##args, errno, strerror(errno))\n#else\n#define LOGD(...)\n#define LOGV(...)\n#define LOGI(...)\n#define LOGW(...)\n#define LOGE(...)\n#define PLOGE(fmt, args...)\n#endif\n#endif // _LOGGING_H\n"
  },
  {
    "path": "manager/src/main/jni/misc.cpp",
    "content": "#include <sys/types.h>\n#include <sys/sendfile.h>\n#include <sys/stat.h>\n#include <zconf.h>\n#include <dirent.h>\n#include <fcntl.h>\n#include <cstdio>\n#include <cstring>\n#include <cstdlib>\n#include <sched.h>\n#include <cctype>\n#include <cerrno>\n#include \"misc.h\"\n\nssize_t fdgets(char *buf, const size_t size, int fd) {\n    buf[0] = '\\0';\n    ssize_t ret;\n    do {\n        ret = read(fd, buf, size - 1);\n    } while (ret < 0 && errno == EINTR);\n    if (ret < 0)\n        return -1;\n    buf[ret] = '\\0';\n    return ret;\n}\n\nint get_proc_name(int pid, char *name, size_t size) {\n    int fd;\n    char buf[PATH_MAX];\n    snprintf(buf, sizeof(buf), \"/proc/%d/cmdline\", pid);\n    if ((fd = open(buf, O_RDONLY)) == -1)\n        return 1;\n    fdgets(name, size, fd);\n    close(fd);\n    return 0;\n}\n\nint is_num(const char *s) {\n    size_t len = strlen(s);\n    for (size_t i = 0; i < len; ++i)\n        if (s[i] < '0' || s[i] > '9')\n            return 0;\n    return 1;\n}\n\nint copyfileat(int src_path_fd, const char *src_path, int dst_path_fd, const char *dst_path) {\n    int src_fd;\n    int dst_fd;\n    struct stat stat_buf{};\n    int64_t size_remaining;\n    size_t count;\n    ssize_t result;\n\n    if ((src_fd = openat(src_path_fd, src_path, O_RDONLY)) == -1)\n        return -1;\n\n    if (fstat(src_fd, &stat_buf) == -1)\n        return -1;\n\n    dst_fd = openat(dst_path_fd, dst_path, O_WRONLY | O_CREAT | O_TRUNC, stat_buf.st_mode);\n    if (dst_fd == -1) {\n        close(src_fd);\n        return -1;\n    }\n\n    size_remaining = stat_buf.st_size;\n    for (;;) {\n        if (size_remaining > 0x7ffff000)\n            count = 0x7ffff000;\n        else\n            count = static_cast<size_t>(size_remaining);\n\n        result = sendfile(dst_fd, src_fd, nullptr, count);\n        if (result == -1) {\n            close(src_fd);\n            close(dst_fd);\n            unlink(dst_path);\n            return -1;\n        }\n\n        size_remaining -= result;\n        if (size_remaining == 0) {\n            close(src_fd);\n            close(dst_fd);\n            return 0;\n        }\n    }\n}\n\nint copyfile(const char *src_path, const char *dst_path) {\n    return copyfileat(0, src_path, 0, dst_path);\n}\n\nuintptr_t memsearch(const uintptr_t start, const uintptr_t end, const void *value, size_t size) {\n    uintptr_t _start = start;\n    while (true) {\n        if (_start + size >= end)\n            return 0;\n\n        if (memcmp((const void *) _start, value, size) == 0)\n            return _start;\n\n        _start += 1;\n    }\n}\n\nint switch_mnt_ns(int pid) {\n    char mnt[32];\n    snprintf(mnt, sizeof(mnt), \"/proc/%d/ns/mnt\", pid);\n    if (access(mnt, R_OK) == -1) return -1;\n\n    int fd = open(mnt, O_RDONLY);\n    if (fd < 0) return -1;\n\n    int res = setns(fd, 0);\n    close(fd);\n    return res;\n}\n\nvoid foreach_proc(foreach_proc_function *func) {\n    DIR *dir;\n    struct dirent *entry;\n\n    if (!(dir = opendir(\"/proc\")))\n        return;\n\n    while ((entry = readdir(dir))) {\n        if (entry->d_type != DT_DIR) continue;\n        if (!is_num(entry->d_name)) continue;\n        pid_t pid = atoi(entry->d_name);\n        func(pid);\n    }\n\n    closedir(dir);\n}\n\nchar *trim(char *str) {\n    size_t len = 0;\n    char *frontp = str;\n    char *endp = nullptr;\n\n    if (str == nullptr) { return nullptr; }\n    if (str[0] == '\\0') { return str; }\n\n    len = strlen(str);\n    endp = str + len;\n\n    /* Move the front and back pointers to address the first non-whitespace\n     * characters from each end.\n     */\n    while (isspace((unsigned char) *frontp)) { ++frontp; }\n    if (endp != frontp) {\n        while (isspace((unsigned char) *(--endp)) && endp != frontp) {}\n    }\n\n    if (str + len - 1 != endp)\n        *(endp + 1) = '\\0';\n    else if (frontp != str && endp == frontp)\n        *str = '\\0';\n\n    /* Shift the string so that it starts at str so that if it's dynamically\n     * allocated, we can still free it on the returned pointer.  Note the reuse\n     * of endp to mean the front of the string buffer now.\n     */\n    endp = str;\n    if (frontp != str) {\n        while (*frontp) { *endp++ = *frontp++; }\n        *endp = '\\0';\n    }\n\n    return str;\n}\n"
  },
  {
    "path": "manager/src/main/jni/misc.h",
    "content": "#ifndef MISC_H\n#define MISC_H\n\nint copyfile(const char *src_path, const char *dst_path);\nuintptr_t memsearch(const uintptr_t start, const uintptr_t end, const void *value, size_t size);\nint switch_mnt_ns(int pid);\nint get_proc_name(int pid, char *name, size_t _size);\n\nusing foreach_proc_function = void(pid_t);\nvoid foreach_proc(foreach_proc_function *func);\n\nchar *trim(char *str);\n\n#endif // MISC_H\n"
  },
  {
    "path": "manager/src/main/jni/selinux.cpp",
    "content": "#include <fcntl.h>\n#include <cstring>\n#include <unistd.h>\n#include <dlfcn.h>\n#include <cerrno>\n#include <syscall.h>\n#include <cstdlib>\n#include \"selinux.h\"\n\nnamespace se {\n\n    static int __getcon(char **context) {\n        int fd = open(\"/proc/self/attr/current\", O_RDONLY | O_CLOEXEC);\n        if (fd < 0)\n            return fd;\n\n        char *buf;\n        size_t size;\n        int errno_hold;\n        ssize_t ret;\n\n        size = sysconf(_SC_PAGE_SIZE);\n        buf = (char *) malloc(size);\n        if (!buf) {\n            ret = -1;\n            goto out;\n        }\n        memset(buf, 0, size);\n\n        do {\n            ret = read(fd, buf, size - 1);\n        } while (ret < 0 && errno == EINTR);\n        if (ret < 0)\n            goto out2;\n\n        if (ret == 0) {\n            *context = nullptr;\n            goto out2;\n        }\n\n        *context = strdup(buf);\n        if (!(*context)) {\n            ret = -1;\n            goto out2;\n        }\n        ret = 0;\n        out2:\n        free(buf);\n        out:\n        errno_hold = errno;\n        close(fd);\n        errno = errno_hold;\n        return 0;\n    }\n\n    static int __setcon(const char *ctx) {\n        int fd = open(\"/proc/self/attr/current\", O_WRONLY | O_CLOEXEC);\n        if (fd < 0)\n            return fd;\n        size_t len = strlen(ctx) + 1;\n        ssize_t rc = write(fd, ctx, len);\n        close(fd);\n        return rc != len;\n    }\n\n    static int __setfilecon(const char *path, const char *ctx) {\n        int rc = syscall(__NR_setxattr, path, \"security.selinux\"/*XATTR_NAME_SELINUX*/, ctx,\n                         strlen(ctx) + 1, 0);\n        if (rc) {\n            errno = -rc;\n            return -1;\n        }\n        return 0;\n    }\n\n    static int __selinux_check_access(const char *scon, const char *tcon,\n                                      const char *tclass, const char *perm, void *auditdata) {\n        return 0;\n    }\n\n    static void __freecon(char *con) {\n        free(con);\n    }\n\n    getcon_t *getcon = __getcon;\n    setcon_t *setcon = __setcon;\n    setfilecon_t *setfilecon = __setfilecon;\n    selinux_check_access_t *selinux_check_access = __selinux_check_access;\n    freecon_t *freecon = __freecon;\n\n    void init() {\n        if (access(\"/system/lib/libselinux.so\", F_OK) != 0 && access(\"/system/lib64/libselinux.so\", F_OK) != 0)\n            return;\n\n        void *handle = dlopen(\"libselinux.so\", RTLD_LAZY | RTLD_LOCAL);\n        if (handle == nullptr)\n            return;\n\n        getcon = (getcon_t *) dlsym(handle, \"getcon\");\n        setcon = (setcon_t *) dlsym(handle, \"setcon\");\n        setfilecon = (setfilecon_t *) dlsym(handle, \"setfilecon\");\n        selinux_check_access = (selinux_check_access_t *) dlsym(handle, \"selinux_check_access\");\n        freecon = (freecon_t *) (dlsym(handle, \"freecon\"));\n    }\n}\n"
  },
  {
    "path": "manager/src/main/jni/selinux.h",
    "content": "#ifndef SELINUX_H\n#define SELINUX_H\n\nnamespace se {\n    void init();\n\n    using getcon_t = int(char **);\n    using setcon_t = int(const char *);\n    using setfilecon_t = int(const char *, const char *);\n    using selinux_check_access_t = int(const char *, const char *, const char *, const char *,\n                                       void *);\n    using freecon_t = void(char *);\n\n    extern getcon_t *getcon;\n    extern setcon_t *setcon;\n    extern setfilecon_t *setfilecon;\n    extern selinux_check_access_t *selinux_check_access;\n    extern freecon_t *freecon;\n}\n\n#endif // SELINUX_H\n"
  },
  {
    "path": "manager/src/main/jni/starter.cpp",
    "content": "#include <cstdio>\n#include <cstdlib>\n#include <fcntl.h>\n#include <unistd.h>\n#include <dirent.h>\n#include <ctime>\n#include <cstring>\n#include <libgen.h>\n#include <sys/stat.h>\n#include <sys/system_properties.h>\n#include <cerrno>\n#include <string>\n#include <termios.h>\n#include \"android.h\"\n#include \"misc.h\"\n#include \"selinux.h\"\n#include \"cgroup.h\"\n#include \"logging.h\"\n\n#ifdef DEBUG\n#define JAVA_DEBUGGABLE\n#endif\n\n#define perrorf(...) fprintf(stderr, __VA_ARGS__)\n\n#define EXIT_FATAL_SET_CLASSPATH 3\n#define EXIT_FATAL_FORK 4\n#define EXIT_FATAL_APP_PROCESS 5\n#define EXIT_FATAL_UID 6\n#define EXIT_FATAL_PM_PATH 7\n#define EXIT_FATAL_KILL 9\n#define EXIT_FATAL_BINDER_BLOCKED_BY_SELINUX 10\n\n#define PACKAGE_NAME \"moe.shizuku.privileged.api\"\n#define SERVER_NAME \"shizuku_server\"\n#define SERVER_CLASS_PATH \"rikka.shizuku.server.ShizukuService\"\n\n#if defined(__arm__)\n#define ABI \"arm\"\n#elif defined(__i386__)\n#define ABI \"x86\"\n#elif defined(__x86_64__)\n#define ABI \"x86_64\"\n#elif defined(__aarch64__)\n#define ABI \"arm64\"\n#endif\n\nstatic void run_server(const char *dex_path, const char *main_class, const char *process_name) {\n    if (setenv(\"CLASSPATH\", dex_path, true)) {\n        LOGE(\"can't set CLASSPATH\\n\");\n        exit(EXIT_FATAL_SET_CLASSPATH);\n    }\n\n#define ARG(v) char **v = nullptr; \\\n    char buf_##v[PATH_MAX]; \\\n    size_t v_size = 0; \\\n    uintptr_t v_current = 0;\n#define ARG_PUSH(v, arg) v_size += sizeof(char *); \\\nif (v == nullptr) { \\\n    v = (char **) malloc(v_size); \\\n} else { \\\n    v = (char **) realloc(v, v_size);\\\n} \\\nv_current = (uintptr_t) v + v_size - sizeof(char *); \\\n*((char **) v_current) = arg ? strdup(arg) : nullptr;\n\n#define ARG_END(v) ARG_PUSH(v, nullptr)\n\n#define ARG_PUSH_FMT(v, fmt, ...) snprintf(buf_##v, PATH_MAX, fmt, __VA_ARGS__); \\\n    ARG_PUSH(v, buf_##v)\n\n#ifdef JAVA_DEBUGGABLE\n#define ARG_PUSH_DEBUG_ONLY(v, arg) ARG_PUSH(v, arg)\n#define ARG_PUSH_DEBUG_VM_PARAMS(v) \\\n    if (android_get_device_api_level() >= 30) { \\\n        ARG_PUSH(v, \"-Xcompiler-option\"); \\\n        ARG_PUSH(v, \"--debuggable\"); \\\n        ARG_PUSH(v, \"-XjdwpProvider:adbconnection\"); \\\n        ARG_PUSH(v, \"-XjdwpOptions:suspend=n,server=y\"); \\\n    } else if (android_get_device_api_level() >= 28) { \\\n        ARG_PUSH(v, \"-Xcompiler-option\"); \\\n        ARG_PUSH(v, \"--debuggable\"); \\\n        ARG_PUSH(v, \"-XjdwpProvider:internal\"); \\\n        ARG_PUSH(v, \"-XjdwpOptions:transport=dt_android_adb,suspend=n,server=y\"); \\\n    } else { \\\n        ARG_PUSH(v, \"-Xcompiler-option\"); \\\n        ARG_PUSH(v, \"--debuggable\"); \\\n        ARG_PUSH(v, \"-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y\"); \\\n    }\n#else\n#define ARG_PUSH_DEBUG_VM_PARAMS(v)\n#define ARG_PUSH_DEBUG_ONLY(v, arg)\n#endif\n\n    char lib_path[PATH_MAX]{0};\n    snprintf(lib_path, PATH_MAX, \"%s/lib/%s\", dirname(dex_path), ABI);\n\n    ARG(argv)\n    ARG_PUSH(argv, \"/system/bin/app_process\")\n    ARG_PUSH_FMT(argv, \"-Djava.class.path=%s\", dex_path)\n    ARG_PUSH_FMT(argv, \"-Dshizuku.library.path=%s\", lib_path)\n    ARG_PUSH_DEBUG_VM_PARAMS(argv)\n    ARG_PUSH(argv, \"/system/bin\")\n    ARG_PUSH_FMT(argv, \"--nice-name=%s\", process_name)\n    ARG_PUSH(argv, main_class)\n    ARG_PUSH_DEBUG_ONLY(argv, \"--debug\")\n    ARG_END(argv)\n\n    LOGD(\"exec app_process\");\n\n    if (execvp((const char *) argv[0], argv)) {\n        exit(EXIT_FATAL_APP_PROCESS);\n    }\n}\n\nstatic void start_server(const char *path, const char *main_class, const char *process_name) {\n    pid_t pid = fork();\n    switch (pid) {\n        case -1: {\n            perrorf(\"fatal: can't fork\\n\");\n            exit(EXIT_FATAL_FORK);\n        }\n        case 0: {\n            LOGD(\"child\");\n            setsid();\n            chdir(\"/\");\n            int fd = open(\"/dev/null\", O_RDWR);\n            if (fd != -1) {\n                dup2(fd, STDIN_FILENO);\n                dup2(fd, STDOUT_FILENO);\n                dup2(fd, STDERR_FILENO);\n                if (fd > 2) close(fd);\n            }\n            run_server(path, main_class, process_name);\n        }\n        default: {\n            printf(\"info: shizuku_server pid is %d\\n\", pid);\n            printf(\"info: shizuku_starter exit with 0\\n\");\n            exit(EXIT_SUCCESS);\n        }\n    }\n}\n\nstatic int check_selinux(const char *s, const char *t, const char *c, const char *p) {\n    int res = se::selinux_check_access(s, t, c, p, nullptr);\n#ifndef DEBUG\n    if (res != 0) {\n#endif\n    printf(\"info: selinux_check_access %s %s %s %s: %d\\n\", s, t, c, p, res);\n    fflush(stdout);\n#ifndef DEBUG\n    }\n#endif\n    return res;\n}\n\nstatic int switch_cgroup() {\n    int pid = getpid();\n    if (cgroup::switch_cgroup(\"/acct\", pid)) {\n        printf(\"info: switch cgroup succeeded, cgroup in /acct\\n\");\n        return 0;\n    }\n    if (cgroup::switch_cgroup(\"/dev/cg2_bpf\", pid)) {\n        printf(\"info: switch cgroup succeeded, cgroup in /dev/cg2_bpf\\n\");\n        return 0;\n    }\n    if (cgroup::switch_cgroup(\"/sys/fs/cgroup\", pid)) {\n        printf(\"info: switch cgroup succeeded, cgroup in /sys/fs/cgroup\\n\");\n        return 0;\n    }\n    char buf[PROP_VALUE_MAX + 1];\n    if (__system_property_get(\"ro.config.per_app_memcg\", buf) > 0 &&\n        strncmp(buf, \"false\", 5) != 0) {\n        if (cgroup::switch_cgroup(\"/dev/memcg/apps\", pid)) {\n            printf(\"info: switch cgroup succeeded, cgroup in /dev/memcg/apps\\n\");\n            return 0;\n        }\n    }\n    printf(\"warn: can't switch cgroup\\n\");\n    fflush(stdout);\n    return -1;\n}\n\nint main(int argc, char *argv[]) {\n    std::string apk_path;\n    for (int i = 0; i < argc; ++i) {\n        if (strncmp(argv[i], \"--apk=\", 6) == 0) {\n            apk_path = argv[i] + 6;\n        }\n    }\n\n    uid_t uid = getuid();\n    if (uid != 0 && uid != 2000) {\n        perrorf(\"fatal: run Shizuku from non root nor adb user (uid=%d).\\n\", uid);\n        exit(EXIT_FATAL_UID);\n    }\n\n    se::init();\n\n    if (uid == 0) {\n        switch_cgroup();\n\n        if (android_get_device_api_level() >= 29) {\n            printf(\"info: switching mount namespace to init...\\n\");\n            switch_mnt_ns(1);\n        }\n    }\n\n    if (uid == 0) {\n        char *context = nullptr;\n        if (se::getcon(&context) == 0) {\n            int res = 0;\n\n            res |= check_selinux(\"u:r:untrusted_app:s0\", context, \"binder\", \"call\");\n            res |= check_selinux(\"u:r:untrusted_app:s0\", context, \"binder\", \"transfer\");\n\n            if (res != 0) {\n                perrorf(\"fatal: the su you are using does not allow app (u:r:untrusted_app:s0) to connect to su (%s) with binder.\\n\",\n                        context);\n                exit(EXIT_FATAL_BINDER_BLOCKED_BY_SELINUX);\n            }\n            se::freecon(context);\n        }\n    }\n\n    printf(\"info: starter begin\\n\");\n    fflush(stdout);\n\n    // kill old server\n    printf(\"info: killing old process...\\n\");\n    fflush(stdout);\n\n    foreach_proc([](pid_t pid) {\n        if (pid == getpid()) return;\n\n        char name[1024];\n        if (get_proc_name(pid, name, 1024) != 0) return;\n\n        if (strcmp(SERVER_NAME, name) != 0)\n            return;\n\n        if (kill(pid, SIGKILL) == 0)\n            printf(\"info: killed %d (%s)\\n\", pid, name);\n        else if (errno == EPERM) {\n            perrorf(\"fatal: can't kill %d, please try to stop existing Shizuku from app first.\\n\", pid);\n            exit(EXIT_FATAL_KILL);\n        } else {\n            printf(\"warn: failed to kill %d (%s)\\n\", pid, name);\n        }\n    });\n\n    if (access(apk_path.c_str(), R_OK) == 0) {\n        printf(\"info: use apk path from argv\\n\");\n        fflush(stdout);\n    }\n\n    if (apk_path.empty()) {\n        auto f = popen(\"pm path \" PACKAGE_NAME, \"r\");\n        if (f) {\n            char line[PATH_MAX]{0};\n            fgets(line, PATH_MAX, f);\n            trim(line);\n            if (strstr(line, \"package:\") == line) {\n                apk_path = line + strlen(\"package:\");\n            }\n            pclose(f);\n        }\n    }\n\n    if (apk_path.empty()) {\n        perrorf(\"fatal: can't get path of manager\\n\");\n        exit(EXIT_FATAL_PM_PATH);\n    }\n\n    printf(\"info: apk path is %s\\n\", apk_path.c_str());\n    if (access(apk_path.c_str(), R_OK) != 0) {\n        perrorf(\"fatal: can't access manager %s\\n\", apk_path.c_str());\n        exit(EXIT_FATAL_PM_PATH);\n    }\n\n    printf(\"info: starting server...\\n\");\n    fflush(stdout);\n    LOGD(\"start_server\");\n    start_server(apk_path.c_str(), SERVER_CLASS_PATH, SERVER_NAME);\n}\n"
  },
  {
    "path": "manager/src/main/res/animator/alpha_animator.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item app:state_raised=\"true\">\n        <set>\n            <objectAnimator\n                android:duration=\"@android:integer/config_mediumAnimTime\"\n                android:propertyName=\"alpha\"\n                android:valueTo=\"0.9\"\n                android:valueType=\"floatType\" />\n        </set>\n    </item>\n    <item>\n        <set>\n            <objectAnimator\n                android:duration=\"@android:integer/config_mediumAnimTime\"\n                android:propertyName=\"alpha\"\n                android:valueTo=\"1\"\n                android:valueType=\"floatType\" />\n        </set>\n    </item>\n</selector>"
  },
  {
    "path": "manager/src/main/res/color/grant_permissions_button_ripple_color_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"PrivateResource\">\n    <item android:alpha=\"@dimen/m3_ripple_pressed_alpha\" android:color=\"?attr/colorOnPrimaryContainer\" android:state_checkable=\"false\" android:state_pressed=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_focused_alpha\" android:color=\"?attr/colorOnPrimaryContainer\" android:state_checkable=\"false\" android:state_focused=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_hovered_alpha\" android:color=\"?attr/colorOnPrimaryContainer\" android:state_checkable=\"false\" android:state_hovered=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_default_alpha\" android:color=\"?attr/colorOnPrimaryContainer\" android:state_checkable=\"false\" />\n\n    <item android:alpha=\"@dimen/m3_ripple_selectable_pressed_alpha\" android:color=\"?attr/colorOnSurface\" android:state_checked=\"true\" android:state_pressed=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_focused_alpha\" android:color=\"?attr/colorOnSecondaryContainer\" android:state_checked=\"true\" android:state_focused=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_hovered_alpha\" android:color=\"?attr/colorOnSecondaryContainer\" android:state_checked=\"true\" android:state_hovered=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_default_alpha\" android:color=\"?attr/colorOnSecondaryContainer\" android:state_checked=\"true\" />\n\n    <item android:alpha=\"@dimen/m3_ripple_selectable_pressed_alpha\" android:color=\"?attr/colorPrimaryContainer\" android:state_pressed=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_focused_alpha\" android:color=\"?attr/colorOnSurface\" android:state_focused=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_hovered_alpha\" android:color=\"?attr/colorOnSurface\" android:state_hovered=\"true\" />\n    <item android:alpha=\"@dimen/m3_ripple_default_alpha\" android:color=\"?attr/colorOnSurface\" />\n</selector>\n"
  },
  {
    "path": "manager/src/main/res/color/home_card_background_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:alpha=\"0.05\" android:color=\"?attr/elevationOverlayColor\" />\n</selector>\n"
  },
  {
    "path": "manager/src/main/res/color/home_card_foreground_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"?attr/paletteNeutral95\" />\n</selector>\n"
  },
  {
    "path": "manager/src/main/res/color-night/home_card_background_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:alpha=\"0.04\" android:color=\"?attr/elevationOverlayColor\" />\n</selector>\n"
  },
  {
    "path": "manager/src/main/res/color-night/home_card_foreground_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"?attr/paletteNeutral20\" />\n</selector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/card_btn_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:aapt=\"http://schemas.android.com/aapt\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:left=\"4dp\"\n        android:right=\"4dp\"\n        android:top=\"2dp\"\n        android:bottom=\"2dp\">\n\n        <aapt:attr name=\"android:drawable\">\n            <ripple android:color=\"?android:colorControlHighlight\">\n                <item android:id=\"@android:id/mask\">\n                    <shape android:shape=\"rectangle\">\n                        <solid android:color=\"?android:attr/windowBackground\" />\n                        <corners android:radius=\"4dp\" />\n                    </shape>\n                </item>\n            </ripple>\n        </aapt:attr>\n\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "manager/src/main/res/drawable/grant_permissions_buttons_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"@color/grant_permissions_button_ripple_color_selector\">\n\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"?colorPrimaryContainer\" />\n            <corners\n                android:bottomLeftRadius=\"12dp\"\n                android:bottomRightRadius=\"12dp\"\n                android:topLeftRadius=\"4dp\"\n                android:topRightRadius=\"4dp\" />\n        </shape>\n    </item>\n\n</ripple>\n"
  },
  {
    "path": "manager/src/main/res/drawable/grant_permissions_buttons_top.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"@color/grant_permissions_button_ripple_color_selector\">\n\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"?colorPrimaryContainer\" />\n            <corners\n                android:bottomLeftRadius=\"4dp\"\n                android:bottomRightRadius=\"4dp\"\n                android:topLeftRadius=\"12dp\"\n                android:topRightRadius=\"12dp\" />\n        </shape>\n    </item>\n\n</ripple>\n"
  },
  {
    "path": "manager/src/main/res/drawable/home_card_foreground.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  Copyright (C) 2019 The Android Open Source Project\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<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"?android:attr/colorControlHighlight\">\n    <item android:id=\"@+id/mask\">\n        <color android:color=\"@color/home_card_foreground_color\"/>\n    </item>\n</ripple>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_action_about_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"?android:attr/colorControlNormal\"\n        android:pathData=\"M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_action_settings_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"?android:attr/colorControlNormal\"\n        android:pathData=\"M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98 0,-0.34 -0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.09,-0.16 -0.26,-0.25 -0.44,-0.25 -0.06,0 -0.12,0.01 -0.17,0.03l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.06,-0.02 -0.12,-0.03 -0.18,-0.03 -0.17,0 -0.34,0.09 -0.43,0.25l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98 0,0.33 0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.09,0.16 0.26,0.25 0.44,0.25 0.06,0 0.12,-0.01 0.17,-0.03l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.06,0.02 0.12,0.03 0.18,0.03 0.17,0 0.34,-0.09 0.43,-0.25l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM17.45,11.27c0.04,0.31 0.05,0.52 0.05,0.73 0,0.21 -0.02,0.43 -0.05,0.73l-0.14,1.13 0.89,0.7 1.08,0.84 -0.7,1.21 -1.27,-0.51 -1.04,-0.42 -0.9,0.68c-0.43,0.32 -0.84,0.56 -1.25,0.73l-1.06,0.43 -0.16,1.13 -0.2,1.35h-1.4l-0.19,-1.35 -0.16,-1.13 -1.06,-0.43c-0.43,-0.18 -0.83,-0.41 -1.23,-0.71l-0.91,-0.7 -1.06,0.43 -1.27,0.51 -0.7,-1.21 1.08,-0.84 0.89,-0.7 -0.14,-1.13c-0.03,-0.31 -0.05,-0.54 -0.05,-0.74s0.02,-0.43 0.05,-0.73l0.14,-1.13 -0.89,-0.7 -1.08,-0.84 0.7,-1.21 1.27,0.51 1.04,0.42 0.9,-0.68c0.43,-0.32 0.84,-0.56 1.25,-0.73l1.06,-0.43 0.16,-1.13 0.2,-1.35h1.39l0.19,1.35 0.16,1.13 1.06,0.43c0.43,0.18 0.83,0.41 1.23,0.71l0.91,0.7 1.06,-0.43 1.27,-0.51 0.7,1.21 -1.07,0.85 -0.89,0.7 0.14,1.13zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_adb_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M5,16c0,3.87 3.13,7 7,7s7,-3.13 7,-7v-4L5,12v4zM16.12,4.37l2.1,-2.1 -0.82,-0.83 -2.3,2.31C14.16,3.28 13.12,3 12,3s-2.16,0.28 -3.09,0.75L6.6,1.44l-0.82,0.83 2.1,2.1C6.14,5.64 5,7.68 5,10v1h14v-1c0,-2.32 -1.14,-4.36 -2.88,-5.63zM9,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM15,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_baseline_link_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"@android:color/black\"\n        android:pathData=\"M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z\" />\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_close_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_code_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"?appColorPrimary\"\n        android:pathData=\"M9.4,16.6L4.8,12l4.6,-4.6L8,6l-6,6 6,6 1.4,-1.4zM14.6,16.6l4.6,-4.6 -4.6,-4.6L16,6l6,6 -6,6 -1.4,-1.4z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_default_app_icon_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n    android:height=\"108dp\"\n    android:width=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"?android:colorAccent\"\n          android:pathData=\"M0,0h108v108h-108z\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M9,0L9,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,0L19,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,0L29,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,0L39,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,0L49,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,0L59,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,0L69,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,0L79,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M89,0L89,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M99,0L99,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,9L108,9\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,19L108,19\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,29L108,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,39L108,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,49L108,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,59L108,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,69L108,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,79L108,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,89L108,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,99L108,99\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,29L89,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,39L89,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,49L89,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,59L89,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,69L89,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,79L89,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,19L29,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,19L39,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,19L49,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,19L59,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,19L69,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,19L79,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_help_outline_24dp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n\n    <path\n        android:pathData=\"M0 0h24v24H0V0z\" />\n    <path\n        android:fillColor=\"?appColorPrimary\"\n        android:pathData=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-4h2v2h-2zm1.61-9.96c-2.06-0.3-3.88 0.97 -4.43 2.79-0.18 0.58 0.26 1.17 0.87 1.17h0.2c0.41 0 0.74-0.29 0.88 -0.67 0.32 -0.89 1.27-1.5 2.3-1.28 0.95 0.2 1.65 1.13 1.57 2.1-0.1 1.34-1.62 1.63-2.45 2.88 0 0.01-0.01 0.01 -0.01 0.02 -0.01 0.02 -0.02 0.03 -0.03 0.05 -0.09 0.15 -0.18 0.32 -0.25 0.5 -0.01 0.03 -0.03 0.05 -0.04 0.08 -0.01 0.02 -0.01 0.04 -0.02 0.07 -0.12 0.34 -0.2 0.75 -0.2 1.25h2c0-0.42 0.11 -0.77 0.28 -1.07 0.02 -0.03 0.03 -0.06 0.05 -0.09 0.08 -0.14 0.18 -0.27 0.28 -0.39 0.01 -0.01 0.02 -0.03 0.03 -0.04 0.1 -0.12 0.21 -0.23 0.33 -0.34 0.96 -0.91 2.26-1.65 1.99-3.56-0.24-1.74-1.61-3.21-3.35-3.47z\" />\n</vector>"
  },
  {
    "path": "manager/src/main/res/drawable/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<bitmap android:src=\"@mipmap/ic_launcher\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\" />"
  },
  {
    "path": "manager/src/main/res/drawable/ic_learn_more_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11,18h2v-2h-2v2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12,6c-2.21,0 -4,1.79 -4,4h2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,2 -3,1.75 -3,5h2c0,-2.25 3,-2.5 3,-5 0,-2.21 -1.79,-4 -4,-4z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_monochrome.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M64.22,36.3H43.78L33.56,54 43.78,71.7h2.08a1.5,1.5 0,1 1,1.78 0H64.22L74.44,54Z\"\n      android:strokeAlpha=\"0.45\"\n      android:fillAlpha=\"0.45\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M64,57.5a26.52,26.52 0,0 0,-4 -1,25.47 25.47,0 0,0 -9,0.5 25.48,25.48 0,0 0,-9 -5,24.92 24.92,0 0,0 -5,-1 24.8,24.8 0,0 0,-9.5 -10.5A20.55,20.55 0,0 0,21 51a26,26 0,0 0,-11 8c-1.79,2.24 -4.92,6.15 -5,11C4.83,80 17.8,87.15 23,90a51.88,51.88 0,0 0,19 6,15.21 15.21,0 0,0 9,-2c4.38,-2.64 5.92,-6.92 7,-10a27.67,27.67 0,0 0,1 -14,30.15 30.15,0 0,0 4,-8A37.08,37.08 0,0 0,64 57.5ZM28.25,63.25a1.5,1.5 0,1 1,1.5 -1.5A1.5,1.5 0,0 1,28.25 63.25ZM46.75,72a1.5,1.5 0,1 1,1.5 -1.5A1.5,1.5 0,0 1,46.75 72Z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_numeric_1_circle_outline_24.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path android:fillColor=\"#000\" android:pathData=\"M10,7H14V17H12V9H10V7M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4Z\" />\n</vector>"
  },
  {
    "path": "manager/src/main/res/drawable/ic_numeric_2_circle_outline_24.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path android:fillColor=\"#000\" android:pathData=\"M9,7H13A2,2 0 0,1 15,9V11A2,2 0 0,1 13,13H11V15H15V17H11L9,17V13A2,2 0 0,1 11,11H13V9H9V7M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4Z\" />\n</vector>"
  },
  {
    "path": "manager/src/main/res/drawable/ic_numeric_3_circle_outline_24.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path android:fillColor=\"#000\" android:pathData=\"M15,15A2,2 0 0,1 13,17H9V15H13V13H11V11H13V9H9V7H13A2,2 0 0,1 15,9V10.5A1.5,1.5 0 0,1 13.5,12A1.5,1.5 0 0,1 15,13.5V15M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4Z\" />\n</vector>"
  },
  {
    "path": "manager/src/main/res/drawable/ic_outline_arrow_upward_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M4,12l1.41,1.41L11,7.83V20h2V7.83l5.58,5.59L20,12l-8,-8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_outline_dark_mode_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M9.37,5.51C9.19,6.15 9.1,6.82 9.1,7.5c0,4.08 3.32,7.4 7.4,7.4c0.68,0 1.35,-0.09 1.99,-0.27C17.45,17.19 14.93,19 12,19c-3.86,0 -7,-3.14 -7,-7C5,9.07 6.81,6.55 9.37,5.51zM12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9s9,-4.03 9,-9c0,-0.46 -0.04,-0.92 -0.1,-1.36c-0.98,1.37 -2.58,2.26 -4.4,2.26c-2.98,0 -5.4,-2.42 -5.4,-5.4c0,-1.81 0.89,-3.42 2.26,-4.4C12.92,3.04 12.46,3 12,3L12,3z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_outline_info_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M11,7h2v2h-2zM11,11h2v6h-2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_outline_notifications_active_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zM18,16v-5c0,-3.07 -1.63,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.64,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2zM16,17L8,17v-6c0,-2.48 1.51,-4.5 4,-4.5s4,2.02 4,4.5v6zM7.58,4.08L6.15,2.65C3.75,4.48 2.17,7.3 2.03,10.5h2c0.15,-2.65 1.51,-4.97 3.55,-6.42zM19.97,10.5h2c-0.15,-3.2 -1.73,-6.02 -4.12,-7.85l-1.42,1.43c2.02,1.45 3.39,3.77 3.54,6.42z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_outline_open_in_new_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:autoMirrored=\"true\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_outline_play_arrow_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M10,8.64L15.27,12 10,15.36V8.64M8,5v14l11,-7L8,5z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_outline_translate_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_root_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path android:fillColor=\"#000\" android:pathData=\"M3,5A2,2 0 0,1 5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5M7,18H9L9.35,16H13.35L13,18H15L15.35,16H17.35L17.71,14H15.71L16.41,10H18.41L18.76,8H16.76L17.12,6H15.12L14.76,8H10.76L11.12,6H9.12L8.76,8H6.76L6.41,10H8.41L7.71,14H5.71L5.35,16H7.35L7,18M10.41,10H14.41L13.71,14H9.71L10.41,10Z\" />\n</vector>"
  },
  {
    "path": "manager/src/main/res/drawable/ic_server_error_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?android:attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M11,15h2v2h-2v-2zM11,7h2v6h-2L11,7zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_server_ok_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?android:attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM16.59,7.58L10,14.17l-2.59,-2.58L6,13l4,4 8,-8z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_server_restart.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"?appColorPrimary\"\n        android:pathData=\"M11,4C13.05,4 15.09,4.77 16.65,6.33C19.78,9.46 19.77,14.5 16.64,17.64C14.81,19.5 12.3,20.24 9.91,19.92L10.44,17.96C12.15,18.12 13.93,17.54 15.24,16.23C17.58,13.89 17.58,10.09 15.24,7.75C14.06,6.57 12.53,6 11,6V10.58L6.04,5.63L11,0.68V4M5.34,17.65C2.7,15 2.3,11 4.11,7.94L5.59,9.41C4.5,11.64 4.91,14.39 6.75,16.23C7.27,16.75 7.87,17.16 8.5,17.45L8,19.4C7,19 6.12,18.43 5.34,17.65Z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_server_start_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"?appColorPrimary\"\n        android:pathData=\"M8,5v14l11,-7z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_settings_outline_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?android:attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98 0,-0.34 -0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.09,-0.16 -0.26,-0.25 -0.44,-0.25 -0.06,0 -0.12,0.01 -0.17,0.03l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.06,-0.02 -0.12,-0.03 -0.18,-0.03 -0.17,0 -0.34,0.09 -0.43,0.25l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98 0,0.33 0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.09,0.16 0.26,0.25 0.44,0.25 0.06,0 0.12,-0.01 0.17,-0.03l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.06,0.02 0.12,0.03 0.18,0.03 0.17,0 0.34,-0.09 0.43,-0.25l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM17.45,11.27c0.04,0.31 0.05,0.52 0.05,0.73 0,0.21 -0.02,0.43 -0.05,0.73l-0.14,1.13 0.89,0.7 1.08,0.84 -0.7,1.21 -1.27,-0.51 -1.04,-0.42 -0.9,0.68c-0.43,0.32 -0.84,0.56 -1.25,0.73l-1.06,0.43 -0.16,1.13 -0.2,1.35h-1.4l-0.19,-1.35 -0.16,-1.13 -1.06,-0.43c-0.43,-0.18 -0.83,-0.41 -1.23,-0.71l-0.91,-0.7 -1.06,0.43 -1.27,0.51 -0.7,-1.21 1.08,-0.84 0.89,-0.7 -0.14,-1.13c-0.03,-0.31 -0.05,-0.54 -0.05,-0.74s0.02,-0.43 0.05,-0.73l0.14,-1.13 -0.89,-0.7 -1.08,-0.84 0.7,-1.21 1.27,0.51 1.04,0.42 0.9,-0.68c0.43,-0.32 0.84,-0.56 1.25,-0.73l1.06,-0.43 0.16,-1.13 0.2,-1.35h1.39l0.19,1.35 0.16,1.13 1.06,0.43c0.43,0.18 0.83,0.41 1.23,0.71l0.91,0.7 1.06,-0.43 1.27,-0.51 0.7,1.21 -1.07,0.85 -0.89,0.7 0.14,1.13zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_system_icon.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M17,3.34l-10,0l-5,8.66l5,8.66l10,0l5,-8.66l-5,-8.66z\"\n      android:strokeAlpha=\"0.65\"\n      android:fillColor=\"#fff\"\n      android:fillAlpha=\"0.65\"/>\n  <path\n      android:pathData=\"M16.67,12.53a8.88,8.88 0,0 0,-3.38 0S11,10.93 9.91,11.13A5.75,5.75 0,0 0,7.4 8.44a4.85,4.85 0,0 0,-1.89 2.9,5.62 5.62,0 0,0 -2.76,1.93L7,20.66h7.87a7.85,7.85 0,0 0,0.81 -4.81A3.86,3.86 0,0 0,16.67 12.53Z\"\n      android:fillColor=\"#fff\"/>\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/ic_terminal_24.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path android:fillColor=\"#000\" android:pathData=\"M20,19V7H4V19H20M20,3A2,2 0 0,1 22,5V19A2,2 0 0,1 20,21H4A2,2 0 0,1 2,19V5C2,3.89 2.9,3 4,3H20M13,17V15H18V17H13M9.58,13L5.57,9H8.4L11.7,12.3C12.09,12.69 12.09,13.33 11.7,13.72L8.42,17H5.59L9.58,13Z\" />\n</vector>"
  },
  {
    "path": "manager/src/main/res/drawable/ic_wadb_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"48\"\n    android:viewportHeight=\"48\">\n\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M24,43.5l23.3-29c-0.9-0.7-9.9-8-23.3-8c-13.4,0-22.4,7.3-23.3,8L24,43.5L24,43.5\nC24,43.5,24,43.5,24,43.5Z\nM31.7,16.2c1.4,1.7,2.3,3.9,2.3,6.3v2H14v-2c0-2.4,0.9-4.6,2.3-6.3L14,13.9l1.4-1.4l2.3,2.3\nc1.7-1.4,3.9-2.3,6.3-2.3c2.4,0,4.6,0.9,6.3,2.3l2.3-2.3l1.4,1.4L31.7,16.2z\nM22,20.5c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2\nc0-1.1,0.9-2,2-2C21.1,18.5,22,19.4,22,20.5z\nM30,20.5c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2c0-1.1,0.9-2,2-2C29.1,18.5,30,19.4,30,20.5\nz\" />\n</vector>"
  },
  {
    "path": "manager/src/main/res/drawable/ic_warning_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z\" />\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable/shape_circle_icon_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"@android:color/white\" />\n    <padding\n        android:bottom=\"8dp\"\n        android:left=\"8dp\"\n        android:right=\"8dp\"\n        android:top=\"8dp\" />\n</shape>\n"
  },
  {
    "path": "manager/src/main/res/drawable-v24/ic_default_app_icon_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\" />\n</vector>\n"
  },
  {
    "path": "manager/src/main/res/drawable-v26/ic_default_app_icon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_default_app_icon_background\"/>\n    <foreground android:drawable=\"@drawable/ic_default_app_icon_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "manager/src/main/res/drawable-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@mipmap/ic_launcher_background\" />\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\" />\n    <monochrome android:drawable=\"@drawable/ic_monochrome\" />\n</adaptive-icon>\n"
  },
  {
    "path": "manager/src/main/res/layout/about_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"horizontal\"\n    android:padding=\"?android:dialogPreferredPadding\">\n\n    <ImageView\n        android:id=\"@android:id/icon\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:importantForAccessibility=\"no\"\n        tools:src=\"@drawable/ic_launcher\" />\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"24dp\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/app_name\"\n            android:textAppearance=\"@android:style/TextAppearance.Material.Body1\"\n            android:textSize=\"18sp\" />\n\n        <TextView\n            android:id=\"@+id/version_name\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/source_code\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:textColor=\"?android:textColorSecondary\"\n            android:textSize=\"14sp\"\n            tools:text=\"@string/about_view_source_code\" />\n\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/adb_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginTop=\"48dp\"\n    android:layout_marginBottom=\"48dp\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:overScrollMode=\"ifContentScrolls\"\n    android:paddingStart=\"?android:dialogPreferredPadding\"\n    android:paddingEnd=\"?android:dialogPreferredPadding\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textAppearance=\"?textAppearanceBodyMedium\"\n            android:text=\"@string/dialog_adb_discovery_message\" />\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textAppearance=\"?textAppearanceBodyMedium\"\n            android:layout_marginTop=\"16sp\"\n            android:textStyle=\"bold\"\n            android:text=\"@string/dialog_adb_discovery_message_toggle_wireless_debugging\" />\n\n    </LinearLayout>\n\n</ScrollView>\n"
  },
  {
    "path": "manager/src/main/res/layout/adb_pair_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginTop=\"48dp\"\n    android:layout_marginBottom=\"48dp\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:overScrollMode=\"ifContentScrolls\"\n    android:paddingStart=\"?android:dialogPreferredPadding\"\n    android:paddingEnd=\"?android:dialogPreferredPadding\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@android:id/text1\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:lineSpacingExtra=\"2sp\"\n            android:text=\"@string/dialog_adb_pairing_message\" />\n\n        <LinearLayout\n            android:id=\"@android:id/text2\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:drawableTint=\"?colorSafe\"\n                android:drawableTintMode=\"src_in\"\n                android:text=\"@string/adb_pairing_requires_multi_window\"\n                android:textColor=\"?colorSafe\" />\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:lineSpacingExtra=\"2sp\"\n                android:text=\"@string/adb_pairing_requires_multi_window_reason\" />\n\n        </LinearLayout>\n\n        <com.google.android.material.textfield.TextInputLayout\n            android:id=\"@+id/pairing_code\"\n            style=\"@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:hint=\"@string/dialog_adb_pairing_paring_code\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\">\n\n            <com.google.android.material.textfield.TextInputEditText\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"number\"\n                android:maxLines=\"1\"\n                android:textSize=\"20sp\"\n                tools:text=\"123456\" />\n\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <com.google.android.material.textfield.TextInputLayout\n            android:id=\"@+id/port\"\n            style=\"@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:hint=\"@string/dialog_adb_port\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\">\n\n            <com.google.android.material.textfield.TextInputEditText\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"number\"\n                android:maxLength=\"5\"\n                android:maxLines=\"1\"\n                tools:text=\"12345\" />\n\n        </com.google.android.material.textfield.TextInputLayout>\n\n    </LinearLayout>\n\n</ScrollView>"
  },
  {
    "path": "manager/src/main/res/layout/adb_pairing_tutorial_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rikka.widget.borderview.BorderNestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/scrollView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:scrollbars=\"vertical\"\n    app:borderBottomVisibility=\"never\"\n    app:borderTopDrawable=\"@null\"\n    app:borderTopVisibility=\"whenTop\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:clipChildren=\"false\"\n        android:clipToPadding=\"false\"\n        android:orientation=\"vertical\"\n        android:paddingStart=\"?android:listPreferredItemPaddingStart\"\n        android:paddingTop=\"?actionBarSize\"\n        android:paddingEnd=\"?android:listPreferredItemPaddingEnd\"\n        android:paddingBottom=\"16dp\"\n        app:fitsSystemWindowsInsets=\"bottom|top\">\n\n        <com.google.android.material.card.MaterialCardView\n            android:id=\"@+id/notification\"\n            style=\"@style/FilledCard\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\">\n\n            <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"-8dp\"\n                android:layout_marginTop=\"4dp\"\n                android:importantForAccessibility=\"no\"\n                android:src=\"@drawable/ic_outline_notifications_active_24\"\n                android:tint=\"?colorOnSecondaryContainer\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginStart=\"36dp\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/adb_pairing_tutorial_content_notification\"\n                    android:textAppearance=\"?textAppearanceBodyMedium\"\n                    android:textColor=\"?colorOnSecondaryContainer\" />\n\n            </LinearLayout>\n\n        </com.google.android.material.card.MaterialCardView>\n\n        <com.google.android.material.card.MaterialCardView\n            android:id=\"@+id/notification_disabled\"\n            style=\"@style/FilledCard\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            app:cardBackgroundColor=\"?colorErrorContainer\">\n\n            <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"-8dp\"\n                android:layout_marginTop=\"4dp\"\n                android:importantForAccessibility=\"no\"\n                android:src=\"@drawable/ic_outline_info_24\"\n                android:tint=\"?colorOnErrorContainer\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginStart=\"36dp\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:lineSpacingExtra=\"2sp\"\n                    android:text=\"@string/adb_pairing_tutorial_content_notification_blocked\"\n                    android:textAppearance=\"?textAppearanceBodyMedium\"\n                    android:textColor=\"?colorOnErrorContainer\" />\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/notification_options\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:layout_marginBottom=\"-8dp\"\n                    android:text=\"@string/notification_settings\"\n                    android:textColor=\"?colorOnError\"\n                    app:backgroundTint=\"?colorError\"\n                    app:iconTint=\"?colorOnError\"\n                    app:iconTintMode=\"src_in\"\n                    app:icon=\"@drawable/ic_outline_open_in_new_24\"\n                    app:iconPadding=\"16dp\" />\n\n            </LinearLayout>\n\n        </com.google.android.material.card.MaterialCardView>\n\n        <com.google.android.material.card.MaterialCardView\n            android:id=\"@+id/network\"\n            style=\"@style/FilledCard\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:background=\"?outlineButtonBackground\"\n            android:clipChildren=\"false\"\n            android:clipToPadding=\"false\"\n            android:foreground=\"?outlineButtonForeground\"\n            android:orientation=\"horizontal\"\n            android:paddingStart=\"16dp\"\n            android:paddingTop=\"16dp\"\n            android:paddingEnd=\"16dp\"\n            android:paddingBottom=\"16dp\">\n\n            <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"-8dp\"\n                android:layout_marginTop=\"4dp\"\n                android:importantForAccessibility=\"no\"\n                android:src=\"@drawable/ic_help_outline_24dp\"\n                android:tint=\"?colorOnSecondaryContainer\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginStart=\"36dp\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:duplicateParentState=\"true\"\n                    android:text=\"@string/adb_pairing_tutorial_content_network\"\n                    android:textAppearance=\"?textAppearanceBodyMedium\"\n                    android:textColor=\"?colorOnSecondaryContainer\" />\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:duplicateParentState=\"true\"\n                    android:fontFamily=\"sans-serif-medium\"\n                    android:text=\"@string/adb_pairing_tutorial_content_network_limation_not_foreground\"\n                    android:textAppearance=\"?textAppearanceBodyMedium\"\n                    android:textColor=\"?colorOnSecondaryContainer\" />\n\n            </LinearLayout>\n\n        </com.google.android.material.card.MaterialCardView>\n\n        <com.google.android.material.card.MaterialCardView\n            android:id=\"@+id/miui\"\n            style=\"@style/FilledCard\"\n            android:layout_marginTop=\"8dp\"\n            android:visibility=\"gone\"\n            app:cardBackgroundColor=\"?colorErrorContainer\"\n            tools:visibility=\"visible\">\n\n            <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"-8dp\"\n                android:layout_marginTop=\"4dp\"\n                android:importantForAccessibility=\"no\"\n                android:src=\"@drawable/ic_warning_24\"\n                android:tint=\"?colorOnErrorContainer\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginStart=\"36dp\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:duplicateParentState=\"true\"\n                    android:text=\"@string/adb_pairing_tutorial_content_miui\"\n                    android:textAppearance=\"?textAppearanceBodyMedium\"\n                    android:textColor=\"?colorOnErrorContainer\" />\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:duplicateParentState=\"true\"\n                    android:fontFamily=\"sans-serif-medium\"\n                    android:text=\"@string/adb_pairing_tutorial_content_miui_2\"\n                    android:textAppearance=\"?textAppearanceBodyMedium\"\n                    android:textColor=\"?colorOnErrorContainer\" />\n\n            </LinearLayout>\n\n        </com.google.android.material.card.MaterialCardView>\n\n        <LinearLayout\n            android:id=\"@+id/step1\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"24dp\"\n            android:clipChildren=\"false\"\n            android:clipToPadding=\"false\"\n            android:orientation=\"horizontal\">\n\n            <ImageView\n                android:layout_width=\"32dp\"\n                android:layout_height=\"32dp\"\n                android:layout_marginStart=\"8dp\"\n                android:importantForAccessibility=\"no\"\n                android:padding=\"4dp\"\n                android:src=\"@drawable/ic_numeric_1_circle_outline_24\"\n                android:tint=\"?android:textColorSecondary\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_weight=\"1\"\n                android:clipChildren=\"false\"\n                android:clipToPadding=\"false\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/adb_pairing_tutorial_content_steps\" />\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8sp\"\n                    android:text=\"@string/adb_pairing_tutorial_content_left_is_clickable\"\n                    android:textColor=\"?colorError\" />\n\n                <Button\n                    android:id=\"@+id/developer_options\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:layout_marginBottom=\"-8dp\"\n                    android:text=\"@string/development_settings\"\n                    app:icon=\"@drawable/ic_outline_open_in_new_24\"\n                    app:iconPadding=\"16dp\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/step2\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"32dp\"\n            android:orientation=\"horizontal\">\n\n            <ImageView\n                android:layout_width=\"32dp\"\n                android:layout_height=\"32dp\"\n                android:layout_marginStart=\"8dp\"\n                android:importantForAccessibility=\"no\"\n                android:padding=\"4dp\"\n                android:src=\"@drawable/ic_numeric_2_circle_outline_24\"\n                android:tint=\"?android:textColorSecondary\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_weight=\"1\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/adb_pairing_tutorial_content_enter_pairing_code\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/step3\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"24dp\"\n            android:orientation=\"horizontal\">\n\n            <ImageView\n                android:layout_width=\"32dp\"\n                android:layout_height=\"32dp\"\n                android:layout_marginStart=\"8dp\"\n                android:importantForAccessibility=\"no\"\n                android:padding=\"4dp\"\n                android:src=\"@drawable/ic_numeric_3_circle_outline_24\"\n                android:tint=\"?android:textColorSecondary\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_weight=\"1\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/adb_pairing_tutorial_content_finish\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n    </LinearLayout>\n\n</rikka.widget.borderview.BorderNestedScrollView>\n"
  },
  {
    "path": "manager/src/main/res/layout/app_list_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\"\n    android:padding=\"24dp\"\n    tools:ignore=\"UseCompoundDrawables\">\n\n    <ImageView\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_help_outline_24dp\"\n        android:tint=\"?colorOnSurface\"\n        android:tintMode=\"src_in\" />\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:text=\"@string/home_app_management_empty\"\n        android:gravity=\"center\"\n        android:textAppearance=\"?textAppearanceBodyLarge\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/app_list_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?android:attr/selectableItemBackground\"\n    android:gravity=\"center_vertical\"\n    android:minHeight=\"64dp\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"@dimen/list_padding\"\n    android:paddingTop=\"16dp\"\n    android:paddingEnd=\"@dimen/list_padding\"\n    android:paddingBottom=\"16dp\"\n    tools:ignore=\"UseCompoundDrawables\">\n\n    <ImageView\n        android:id=\"@android:id/icon\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:contentDescription=\"@null\"\n        tools:src=\"@drawable/ic_launcher\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"24dp\"\n        android:layout_weight=\"1\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@android:id/title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textAppearance=\"?textAppearanceBodyLarge\"\n            tools:text=\"Shizuku\" />\n\n        <TextView\n            android:id=\"@android:id/summary\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textAppearance=\"?textAppearanceBodyMedium\"\n            android:layout_marginTop=\"2sp\"\n            android:textColor=\"?textColorOnSurfaceHighEmphasis\"\n            android:textSize=\"14sp\"\n            tools:text=\"moe.shizuku.manager\" />\n\n        <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4sp\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/requires_root\"\n                android:layout_width=\"wrap_content\"\n                android:textAppearance=\"?textAppearanceBodyMedium\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/app_management_item_summary_requires_root\" />\n\n        </LinearLayout>\n\n    </LinearLayout>\n\n    <com.google.android.material.materialswitch.MaterialSwitch\n        android:id=\"@+id/switch_widget\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:clickable=\"false\"\n        android:focusable=\"false\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/appbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.appbar.AppBarLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/toolbar_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:fitsSystemWindows=\"true\"\n    app:liftOnScroll=\"true\"\n    tools:viewBindingIgnore=\"true\">\n\n    <com.google.android.material.appbar.MaterialToolbar\n        android:id=\"@+id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom\"\n        android:background=\"@null\"\n        android:elevation=\"0dp\"\n        android:theme=\"@style/ThemeOverlay.MaterialComponents.ActionBar\"\n        app:layout_collapseMode=\"pin\"\n        tools:title=\"Title\" />\n\n</com.google.android.material.appbar.AppBarLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/appbar_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/root\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"false\"\n    app:consumeSystemWindowsInsets=\"start|end\"\n    app:edgeToEdge=\"true\"\n    app:fitsSystemWindowsInsets=\"start|end\"\n    tools:viewBindingIgnore=\"true\">\n\n    <include layout=\"@layout/appbar\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n"
  },
  {
    "path": "manager/src/main/res/layout/appbar_fragment_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/root\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"false\"\n    app:consumeSystemWindowsInsets=\"start|end\"\n    app:edgeToEdge=\"true\"\n    app:fitsSystemWindowsInsets=\"start|end\"\n    tools:viewBindingIgnore=\"true\">\n\n    <FrameLayout\n        android:id=\"@+id/fragment_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <include layout=\"@layout/appbar\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n"
  },
  {
    "path": "manager/src/main/res/layout/apps_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rikka.widget.borderview.BorderRecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@android:id/list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    android:paddingStart=\"@dimen/rd_activity_horizontal_margin\"\n    android:paddingTop=\"?actionBarSize\"\n    android:paddingEnd=\"@dimen/rd_activity_horizontal_margin\"\n    android:scrollbarStyle=\"outsideOverlay\"\n    android:scrollbars=\"vertical\"\n    app:borderBottomVisibility=\"never\"\n    app:borderTopDrawable=\"@null\"\n    app:borderTopVisibility=\"whenTop\"\n    app:fitsSystemWindowsInsets=\"bottom|top\"\n    app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\" />\n"
  },
  {
    "path": "manager/src/main/res/layout/confirmation_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingTop=\"24dp\"\n    android:paddingBottom=\"24dp\">\n\n    <ImageView\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_gravity=\"center\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_system_icon\"\n        android:tint=\"?android:colorAccent\"\n        android:tintMode=\"src_in\" />\n\n    <TextView\n        android:id=\"@android:id/title\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:paddingStart=\"24dp\"\n        android:paddingTop=\"16dp\"\n        android:paddingEnd=\"24dp\"\n        android:paddingBottom=\"24dp\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"20sp\"\n        tools:text=\"@string/permission_warning_template\" />\n\n    <TextView\n        android:id=\"@android:id/button1\"\n        style=\"@style/GrantPermissionsButtons.Top\"\n        android:text=\"@string/grant_dialog_button_allow_always\" />\n\n    <TextView\n        android:id=\"@android:id/button3\"\n        style=\"@style/GrantPermissionsButtons.Buttom\"\n        android:text=\"@string/grant_dialog_button_deny\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/home_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rikka.widget.borderview.BorderRecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@android:id/list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginStart=\"@dimen/rd_activity_horizontal_margin\"\n    android:layout_marginEnd=\"@dimen/rd_activity_horizontal_margin\"\n    android:clipToPadding=\"false\"\n    android:paddingStart=\"@dimen/home_padding\"\n    android:paddingTop=\"?actionBarSize\"\n    android:paddingEnd=\"@dimen/home_padding\"\n    android:scrollbarStyle=\"insideOverlay\"\n    android:scrollbars=\"vertical\"\n    app:borderBottomVisibility=\"never\"\n    app:borderTopDrawable=\"@null\"\n    app:borderTopVisibility=\"whenTop\"\n    app:fitsSystemWindowsInsets=\"bottom|top\"\n    app:layoutManager=\"@string/main_layout_manager\"\n    app:spanCount=\"2\" />\n"
  },
  {
    "path": "manager/src/main/res/layout/home_extra_step_required.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    style=\"?homeCardStyle\"\n    android:background=\"?colorErrorContainer\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\">\n\n        <ImageView\n            android:id=\"@android:id/icon\"\n            style=\"@style/CardIcon\"\n            android:backgroundTint=\"?colorOnErrorContainer\"\n            android:duplicateParentState=\"true\"\n            android:importantForAccessibility=\"no\"\n            android:src=\"@drawable/ic_warning_24\"\n            android:tint=\"?colorErrorContainer\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/home_icon_padding\"\n            android:duplicateParentState=\"true\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@android:id/title\"\n                style=\"@style/CardTitle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:duplicateParentState=\"true\"\n                android:text=\"@string/home_adb_is_limited_title\"\n                android:textColor=\"?colorOnErrorContainer\" />\n\n        </LinearLayout>\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@android:id/text1\"\n        style=\"@style/CardContent\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:layout_marginBottom=\"24dp\"\n        android:text=\"@string/home_adb_is_limited_description\"\n        android:textColor=\"?colorOnErrorContainer\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@android:id/button1\"\n        style=\"@style/CardButton\"\n        android:text=\"@string/home_adb_button_view_help\"\n        android:textColor=\"?colorOnError\"\n        app:backgroundTint=\"?colorError\"\n        app:icon=\"@drawable/ic_outline_open_in_new_24\"\n        app:iconTint=\"?colorOnError\" />\n\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/home_item_container.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    style=\"?attr/materialCardViewFilledStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:checkable=\"true\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    app:cardBackgroundColor=\"@color/home_card_background_color\"\n    app:cardCornerRadius=\"28dp\"\n    app:cardElevation=\"0dp\"\n    tools:layout_height=\"100dp\"\n    tools:layout_margin=\"24dp\" />\n"
  },
  {
    "path": "manager/src/main/res/layout/home_learn_more.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"?homeCardStyle\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <ImageView\n        android:id=\"@android:id/icon\"\n        style=\"@style/CardIcon\"\n        android:duplicateParentState=\"true\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_learn_more_24dp\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/home_icon_padding\"\n        android:duplicateParentState=\"true\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@android:id/text1\"\n            style=\"@style/CardTitle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:text=\"@string/home_learn_more_title\" />\n\n        <TextView\n            android:id=\"@android:id/text2\"\n            style=\"@style/CardSummary\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:text=\"@string/home_learn_more_description\" />\n\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/home_manage_apps_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"?homeCardStyle\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <ImageView\n        android:id=\"@android:id/icon\"\n        style=\"@style/CardIcon\"\n        android:duplicateParentState=\"true\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_settings_outline_24dp\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/home_icon_padding\"\n        android:duplicateParentState=\"true\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@android:id/text1\"\n            style=\"@style/CardTitle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:text=\"@string/home_app_management_view_authorized_apps\" />\n\n        <TextView\n            android:id=\"@android:id/text2\"\n            style=\"@style/CardSummary\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:text=\"@string/home_app_management_view_authorized_apps\" />\n\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/home_server_status.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    style=\"?homeCardStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <ImageView\n        android:id=\"@android:id/icon\"\n        style=\"@style/CardIcon\"\n        android:duplicateParentState=\"true\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_server_error_24dp\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/home_icon_padding\"\n        android:duplicateParentState=\"true\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@android:id/text1\"\n            style=\"@style/CardTitle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:lineSpacingExtra=\"2dp\"\n            tools:text=\"Running (version 10)\" />\n\n        <TextView\n            android:id=\"@android:id/text2\"\n            style=\"@style/CardSummary\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\" />\n\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/home_start_adb.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    style=\"?homeCardStyle\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\">\n\n        <ImageView\n            android:id=\"@android:id/icon\"\n            style=\"@style/CardIcon\"\n            android:duplicateParentState=\"true\"\n            android:importantForAccessibility=\"no\"\n            android:src=\"@drawable/ic_adb_24dp\" />\n\n        <TextView\n            style=\"@style/CardTitle\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/home_icon_padding\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/home_adb_title\" />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@android:id/text1\"\n        style=\"@style/CardContent\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"24dp\"\n        tools:text=\"@string/home_adb_description\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@android:id/button1\"\n        style=\"@style/CardButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/home_adb_button_view_command\"\n        app:icon=\"@drawable/ic_code_24dp\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/home_start_root.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    style=\"?homeCardStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\">\n\n        <ImageView\n            android:id=\"@android:id/icon\"\n            style=\"@style/CardIcon\"\n            android:duplicateParentState=\"true\"\n            android:importantForAccessibility=\"no\"\n            android:src=\"@drawable/ic_root_24dp\" />\n\n        <TextView\n            android:id=\"@android:id/title\"\n            style=\"@style/CardTitle\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/home_icon_padding\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/home_root_title\" />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@android:id/text1\"\n        style=\"@style/CardContent\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:layout_marginBottom=\"24dp\"\n        tools:text=\"@string/home_root_description\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@android:id/button1\"\n        style=\"@style/CardButton\"\n        android:enabled=\"false\"\n        android:text=\"@string/home_root_button_start\"\n        app:icon=\"@drawable/ic_server_start_24dp\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@android:id/button2\"\n        style=\"@style/CardButton\"\n        android:enabled=\"false\"\n        android:text=\"@string/home_root_button_restart\"\n        android:visibility=\"gone\"\n        app:icon=\"@drawable/ic_server_restart\"\n        tools:visibility=\"visible\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/home_start_wireless_adb.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    style=\"?homeCardStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\">\n\n        <ImageView\n            android:id=\"@android:id/icon\"\n            style=\"@style/CardIcon\"\n            android:duplicateParentState=\"true\"\n            android:importantForAccessibility=\"no\"\n            android:src=\"@drawable/ic_wadb_24\" />\n\n        <TextView\n            style=\"@style/CardTitle\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/home_icon_padding\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/home_wireless_adb_title\" />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@android:id/text1\"\n        style=\"@style/CardContent\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:layout_marginBottom=\"24dp\"\n        tools:text=\"@string/home_adb_description\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@android:id/button3\"\n        style=\"@style/CardButton\"\n        android:text=\"@string/home_wireless_adb_view_guide_button\"\n        app:icon=\"@drawable/ic_outline_open_in_new_24\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@android:id/button2\"\n        style=\"@style/CardButton\"\n        android:text=\"@string/adb_pairing\"\n        app:icon=\"@drawable/ic_baseline_link_24\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@android:id/button1\"\n        style=\"@style/CardButton\"\n        android:text=\"@string/home_root_button_start\"\n        app:icon=\"@drawable/ic_server_start_24dp\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/home_terminal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    style=\"?homeCardStyle\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <ImageView\n        android:id=\"@android:id/icon\"\n        style=\"@style/CardIcon\"\n        android:duplicateParentState=\"true\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_terminal_24\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/home_icon_padding\"\n        android:duplicateParentState=\"true\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@android:id/text1\"\n            style=\"@style/CardTitle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:text=\"@string/home_terminal_title\" />\n\n        <TextView\n            android:id=\"@android:id/text2\"\n            style=\"@style/CardSummary\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            tools:text=\"@string/home_terminal_description\" />\n\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/preference_recyclerview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rikka.widget.borderview.BorderRecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@android:id/list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    android:fadeScrollbars=\"true\"\n    android:paddingTop=\"?actionBarSize\"\n    android:scrollbarStyle=\"outsideOverlay\"\n    android:scrollbars=\"vertical\"\n    app:borderBottomVisibility=\"never\"\n    app:borderTopDrawable=\"@null\"\n    app:borderTopVisibility=\"whenTop\"\n    app:fitsSystemWindowsInsets=\"bottom|top\"\n    tools:ignore=\"UnusedResources\"\n    tools:viewBindingIgnore=\"true\" />\n"
  },
  {
    "path": "manager/src/main/res/layout/shell_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <HorizontalScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <TextView\n            android:id=\"@android:id/text1\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textColor=\"?android:textColorPrimary\"\n            android:fontFamily=\"monospace\"\n            android:padding=\"24dp\"\n            android:textIsSelectable=\"true\"/>\n\n    </HorizontalScrollView>\n\n</ScrollView>"
  },
  {
    "path": "manager/src/main/res/layout/starter_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <rikka.widget.borderview.BorderNestedScrollView\n        android:id=\"@android:id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        android:paddingTop=\"?actionBarSize\"\n        android:scrollbarStyle=\"insideOverlay\"\n        android:scrollbars=\"vertical\"\n        app:borderBottomVisibility=\"never\"\n        app:borderTopDrawable=\"@null\"\n        app:borderTopVisibility=\"whenTop\"\n        app:fitsSystemWindowsInsets=\"top|bottom\">\n\n        <TextView\n            android:id=\"@android:id/text1\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:fontFamily=\"monospace\"\n            android:paddingStart=\"@dimen/list_item_padding\"\n            android:paddingTop=\"16dp\"\n            android:paddingEnd=\"@dimen/list_item_padding\"\n            android:paddingBottom=\"16dp\"\n            android:textColor=\"?android:textColorPrimary\"\n            android:textIsSelectable=\"true\"\n            android:textSize=\"12sp\" />\n\n    </rikka.widget.borderview.BorderNestedScrollView>\n\n</FrameLayout>\n"
  },
  {
    "path": "manager/src/main/res/layout/terminal_tutorial_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rikka.widget.borderview.BorderNestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/scrollView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:scrollbars=\"vertical\"\n    app:borderBottomVisibility=\"never\"\n    app:borderTopDrawable=\"@null\"\n    app:borderTopVisibility=\"whenTop\">\n\n    <LinearLayout\n        android:id=\"@android:id/content\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:clipChildren=\"false\"\n        android:clipToPadding=\"false\"\n        android:orientation=\"vertical\"\n        android:paddingStart=\"?android:listPreferredItemPaddingStart\"\n        android:paddingTop=\"?actionBarSize\"\n        android:paddingEnd=\"?android:listPreferredItemPaddingEnd\"\n        android:paddingBottom=\"16dp\"\n        app:fitsSystemWindowsInsets=\"bottom|top\">\n\n        <com.google.android.material.card.MaterialCardView\n            android:id=\"@android:id/button2\"\n            style=\"@style/FilledCard\">\n\n            <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"-8dp\"\n                android:layout_marginTop=\"4dp\"\n                android:importantForAccessibility=\"no\"\n                android:src=\"@drawable/ic_help_outline_24dp\"\n                android:tint=\"?colorOnSecondaryContainer\"\n                android:tintMode=\"src_in\" />\n\n            <TextView\n                android:id=\"@android:id/summary\"\n                style=\"@style/TerminalTutorialText\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"36dp\"\n                android:duplicateParentState=\"true\"\n                android:textColor=\"?colorOnSecondaryContainer\"\n                tools:text=\"@string/rish_description\" />\n\n        </com.google.android.material.card.MaterialCardView>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"24dp\"\n            android:clipChildren=\"false\"\n            android:clipToPadding=\"false\"\n            android:orientation=\"horizontal\">\n\n            <ImageView\n                android:layout_width=\"32dp\"\n                android:layout_height=\"32dp\"\n                android:importantForAccessibility=\"no\"\n                android:padding=\"4dp\"\n                android:layout_marginStart=\"8dp\"\n                android:src=\"@drawable/ic_numeric_1_circle_outline_24\"\n                android:tint=\"?android:textColorSecondary\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_weight=\"1\"\n                android:clipChildren=\"false\"\n                android:clipToPadding=\"false\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    android:id=\"@+id/text1\"\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    tools:text=\"@string/terminal_tutorial_1\" />\n\n                <TextView\n                    android:id=\"@+id/summary1\"\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8sp\"\n                    android:text=\"@string/terminal_tutorial_1_description\"\n                    android:textColor=\"?android:textColorSecondary\" />\n\n                <Button\n                    android:id=\"@android:id/button1\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:text=\"@string/terminal_export_files\"\n                    android:textAllCaps=\"false\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"24dp\"\n            android:orientation=\"horizontal\">\n\n            <ImageView\n                android:layout_width=\"32dp\"\n                android:layout_height=\"32dp\"\n                android:importantForAccessibility=\"no\"\n                android:padding=\"4dp\"\n                android:layout_marginStart=\"8dp\"\n                android:src=\"@drawable/ic_numeric_2_circle_outline_24\"\n                android:tint=\"?android:textColorSecondary\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_weight=\"1\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    android:id=\"@+id/text2\"\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    tools:text=\"@string/terminal_tutorial_2\" />\n\n                <TextView\n                    android:id=\"@+id/summary2\"\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8sp\"\n                    android:textColor=\"?android:textColorSecondary\"\n                    tools:text=\"@string/terminal_tutorial_2_description\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"24dp\"\n            android:orientation=\"horizontal\">\n\n            <ImageView\n                android:layout_width=\"32dp\"\n                android:layout_height=\"32dp\"\n                android:importantForAccessibility=\"no\"\n                android:padding=\"4dp\"\n                android:layout_marginStart=\"8dp\"\n                android:src=\"@drawable/ic_numeric_3_circle_outline_24\"\n                android:tint=\"?android:textColorSecondary\"\n                android:tintMode=\"src_in\" />\n\n            <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_weight=\"1\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    android:id=\"@+id/text3\"\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    tools:text=\"@string/terminal_tutorial_3\" />\n\n                <TextView\n                    android:id=\"@+id/summary3\"\n                    style=\"@style/TerminalTutorialText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8sp\"\n                    android:textColor=\"?android:textColorSecondary\"\n                    tools:text=\"@string/terminal_tutorial_3_description\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n    </LinearLayout>\n\n</rikka.widget.borderview.BorderNestedScrollView>\n"
  },
  {
    "path": "manager/src/main/res/menu/main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/action_settings\"\n        android:icon=\"@drawable/ic_action_settings_24dp\"\n        android:title=\"@string/settings_title\"\n        android:showAsAction=\"ifRoom\"/>\n\n    <item\n        android:id=\"@+id/action_stop\"\n        android:title=\"@string/action_stop\"\n        android:showAsAction=\"never\"/>\n\n    <item\n        android:id=\"@+id/action_about\"\n        android:title=\"@string/action_about\"\n        android:showAsAction=\"never\"/>\n\n</menu>"
  },
  {
    "path": "manager/src/main/res/values/arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <string-array name=\"night_mode\">\n        <item>@string/dark_theme_off</item>\n        <item>@string/dark_theme_on</item>\n        <item>@string/follow_system</item>\n    </string-array>\n\n    <integer-array name=\"night_mode_value\">\n        <item>1</item>\n        <item>2</item>\n        <item>-1</item>\n    </integer-array>\n\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <attr name=\"homeCardStyle\" format=\"reference\" />\n    <attr name=\"appColorPrimary\" format=\"reference\" />\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/bools.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:ignore=\"UnusedResources\">\n    <bool name=\"is_tablet\">false</bool>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"notification\">#3F51B5</color>\n\n    <color name=\"app_color_light\">#3F51B5</color>\n    <color name=\"app_color_dark\">#B1B8DF</color>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:ignore=\"UnusedResources\">\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n\n    <dimen name=\"request_dialog_text_size\">18sp</dimen>\n\n    <dimen name=\"list_padding\">16dp</dimen>\n\n    <dimen name=\"toolbar_content_padding_start\">16dp</dimen>\n    <dimen name=\"toolbar_content_padding_start_with_navigation\">72dp</dimen>\n    <dimen name=\"toolbar_padding_end\">0dp</dimen>\n\n    <dimen name=\"home_padding\">0dp</dimen>\n\n    <dimen name=\"home_margin\">4dp</dimen>\n\n    <dimen name=\"default_app_icon_size\">40dp</dimen>\n\n    <dimen name=\"home_icon_padding\">16dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\" translatable=\"false\">Shizuku</string>\n\n    <!-- To translators: you can leave your here -->\n    <string name=\"translation_contributors\" />\n\n    <!-- Home - Status -->\n    <string name=\"home_status_service_is_running\">%1$s is running</string>\n    <string name=\"home_status_service_not_running\">%1$s is not running</string>\n    <string name=\"home_status_service_version\">Version %2$s, %1$s</string>\n    <string name=\"home_status_service_version_update\"><![CDATA[Version %2$s, %1$s<br>Start again to update to version %3$s]]></string>\n\n    <!-- Home - Adb -->\n    <string name=\"home_adb_title\"><![CDATA[Start by connecting to a computer]]></string>\n    <string name=\"home_adb_description\"><![CDATA[For devices without root, you need to use adb to start Shizuku (requires computer connection). This process needs to be repeated every time the device is restarted. Please <b><a href=\\\"%1$s\\\">read the help</a></b>.]]></string>\n    <string name=\"home_adb_button_view_help\">Read help</string>\n    <string name=\"home_adb_button_view_command\">View command</string>\n    <string name=\"home_adb_dialog_view_command_message\"><![CDATA[<font face=\"monospace\">%1$s</font><br><br>* There are some other considerations, please confirm that you have read the help first.]]></string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copy</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Send</string>\n\n    <!-- Home - Wireless Adb -->\n    <string name=\"home_wireless_adb_title\"><![CDATA[Start via Wireless debugging]]></string>\n    <string name=\"home_wireless_adb_description\"><![CDATA[On Android 11 or above, you can enable Wireless debugging and start Shizuku directly from your device, without connecting to a computer.<p>Please view the step-by-step guide first.]]></string>\n    <string name=\"home_wireless_adb_description_pre_11\"><![CDATA[Before Android 11, connecting to a computer is required to enable Wireless debugging.]]></string>\n    <string name=\"home_wireless_adb_view_guide_button\">Step-by-step guide</string>\n\n    <!-- Adb -->\n    <string name=\"dialog_adb_discovery\">Searching for wireless debugging service</string>\n    <string name=\"dialog_adb_discovery_message\">Please enable \\\"Wireless debugging\\\" in \\\"Developer options\\\". \\\"Wireless debugging\\\" is automatically disabled when network changes.\\n\\nNote, do not disable \\\"Developer options\\\" or \\\"USB debugging\\\", or Shizuku will be stopped.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Please try to disable and enable \\\"Wireless debugging\\\" if it keeps searching.</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_invalid_port\">Port is an integer ranging from 1 to 65535.</string>\n    <string name=\"adb_pairing\">Pairing</string>\n    <string name=\"dialog_adb_pairing_title\">Pair with device</string>\n    <string name=\"dialog_adb_pairing_discovery\">Searching for pairing service</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Pairing code</string>\n    <string name=\"paring_code_is_wrong\">Pairing code is wrong.</string>\n    <string name=\"cannot_connect_port\">Can\\'t connect to wireless debugging service.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Wireless debugging is not enabled.\\nNote, before Android 11, to enable wireless debugging, computer connection is a must.</string>\n    <string name=\"dialog_adb_pairing_message\">Please start paring by the following steps: \\\"Developer Options\\\" - \\\"Wireless debugging\\\" - \\\"Pairing device using pairing code\\\".\\n\\nAfter the pairing process starts, you will able to input the pairing code.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Please enter split-screen (multi-window) mode first.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">The system requires the pairing dialog always visible, using split-screen mode is the only way to let this app and system dialog visible at the same time.</string>\n    <string name=\"adb_error_key_store\">Unable to generate key for wireless debugging.\\nThis may be because KeyStore mechanism of this device is broken.</string>\n    <string name=\"adb_pair_required\">Please go through the pairing step first.</string>\n    <string name=\"development_settings\">Developer options</string>\n    <string name=\"notification_settings\">Notification options</string>\n    <string name=\"adb_pairing_tutorial_title\">Pair Shizuku with your device</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">A notification from Shizuku will help you complete the pairing.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Enter \\\"Developer options\\\" - \\\"Wireless debugging\\\". Tap \\\"Pair device with pairing code\\\", you will see a six-digit code.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Enter the code in the notification to complete pairing.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">The pairing process needs you to interact with a notification from Shizuku. Please allow Shizuku to post notifications.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">MIUI users may need to switch notification style to \\\"Android\\\" from \\\"Notification\\\" - \\\"Notification shade\\\" in system settings.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Otherwise, you may not able to enter paring code from the notification.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Please note, left part of the \\\"Wireless debugging\\\" option is clickable, tapping it will open a new page. Only turing on the switch on the right is incorrect.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Back to Shizuku and start Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku needs to access local network. It is controlled by the network permission.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Some systems (such as MIUI) disallow apps to access the network when they are not visible, even if the app uses foreground service as standard. Please disable battery optimization features for Shizuku on such systems.</string>\n\n    <!-- Home - Root -->\n    <string name=\"home_root_title\"><![CDATA[Start (for rooted devices)]]></string>\n    <string name=\"home_root_description\"><![CDATA[In addition, Shizuku can be started automatically on boot. If not, please check if your system or third-party tools have restricted Shizuku.<br>You can refer to %s.]]></string>\n    <string name=\"home_root_description_sui\"><![CDATA[If you are using Magisk, you can try %1$s. For root users, it will eventually replace Shizuku. Note, existing applications needs to change a little to use %2$s.]]></string>\n    <string name=\"home_root_button_start\">Start</string>\n    <string name=\"home_root_button_restart\">Restart</string>\n\n    <!-- Home - Application management -->\n    <string name=\"home_app_management_title\">Application management</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\"><![CDATA[Authorized %d application]]></item>\n        <item quantity=\"other\"><![CDATA[Authorized %d applications]]></item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\"><![CDATA[Tap to manage authorized apps]]></string>\n    <string name=\"home_app_management_empty\">Apps that has requested or declared Shizuku will show here.</string>\n\n    <!-- Home - Learn more -->\n    <string name=\"home_learn_more_title\">Learn Shizuku</string>\n    <string name=\"home_learn_more_description\">Learn how to develop with Shizuku</string>\n\n    <!-- Home - Adb permissions limited -->\n    <string name=\"home_adb_is_limited_title\">You need to take an extra step</string>\n    <string name=\"home_adb_is_limited_description\">Your device manufacturer has restricted adb permissions and apps using Shizuku will not work properly.\\n\\nUsually, this limitation can be lifted by adjusting some options in \\\"Developer options\\\". Please read the help for details on how to do this.\\n\\nYou may need to restart Shizuku for the operation to take effect.</string>\n\n    <!-- Application management -->\n    <string name=\"app_management_dialog_adb_is_limited_title\">The permission of adb is limited</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\"><![CDATA[It\\'s highly possible that your device manufacturer limits the permission of adb.<p>There may be a solution for your system in <b><a href=\\\"%1$s\\\">this document</a></b>.]]></string>\n    <string name=\"app_management_item_summary_requires_root\">* requires Shizuku runs with root</string>\n\n    <!-- Terminal -->\n    <string name=\"home_terminal_title\">Use Shizuku in terminal apps</string>\n    <string name=\"home_terminal_description\">Run commands through Shizuku in terminal apps you like</string>\n    <string name=\"terminal_tutorial_1\">First, Export files to any where you want. You will find two files, %1$s and %2$s.</string>\n    <string name=\"terminal_tutorial_1_description\">If there are files with the same name in the selected folder, they will be deleted.\\n\\nThe export function uses SAF (Storage Access Framework). It\\'s reported that MIUI breaks the functions of SAF. If you are using MIUI, you may have to extract the file from Shizuku\\'s apk or download from GitHub.</string>\n    <string name=\"terminal_export_files\">Export files</string>\n    <string name=\"terminal_tutorial_2\">Then, use any text editor to open and edit %1$s.</string>\n    <string name=\"terminal_tutorial_2_description\">For example, if you want to use Shizuku in %1$s, you should replace %2$s with %3$s (%4$s is the package name of %1$s).</string>\n    <string name=\"terminal_tutorial_3\">Finally, move the files to somewhere where your terminal app can access, you will be able to use %1$s to run commands through Shizuku.</string>\n    <string name=\"terminal_tutorial_3_description\">Some tips: grant execute permission to %1$s and add it to %2$s, you will able to use %1$s directly.</string>\n    <string name=\"rish_description\"><![CDATA[\nWith %1$s, in any terminal app, you can connect to and interact with the shell runs by Shizuku.\n<p>About the detailed usage %1$s, tap to view the document.\n    ]]></string>\n\n    <!-- Settings -->\n    <string name=\"settings_title\">Settings</string>\n    <string name=\"settings_language\">Language</string>\n    <string name=\"settings_user_interface\">Appearance</string>\n    <string name=\"settings_black_night_theme\">Black night theme</string>\n    <string name=\"settings_black_night_theme_summary\">Use the pure black theme if night mode is enabled</string>\n    <string name=\"settings_startup\">Startup</string>\n    <string name=\"settings_translation_contributors\">Translation contributors</string>\n    <string name=\"settings_translation\">Participate in translation</string>\n    <string name=\"settings_translation_summary\">Help us translate %s into your language</string>\n    <string name=\"settings_start_on_boot\">Start on boot (root)</string>\n    <string name=\"settings_start_on_boot_summary\">For rooted devices, Shizuku is able to start automatically on boot</string>\n    <string name=\"settings_use_system_color\">Use system theme color</string>\n\n    <!-- About -->\n    <string name=\"action_about\">About</string>\n    <string name=\"about_view_source_code\"><![CDATA[View source code at %s]]></string>\n\n    <!-- Stop -->\n    <string name=\"action_stop\">Stop Shizuku</string>\n    <string name=\"dialog_stop_message\">Shizuku service will be stopped.</string>\n\n    <!-- Notification -->\n    <string name=\"notification_channel_service_status\">Service start status</string>\n    <string name=\"notification_service_starting\">Shizuku service is starting…</string>\n    <string name=\"notification_service_start_failed\">Start Shizuku service failed.</string>\n    <string name=\"notification_service_start_no_root\">Failed to request root permission.</string>\n    <string name=\"notification_working\">Working…</string>\n    <string name=\"notification_channel_adb_pairing\">Wireless debugging pairing</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Enter pairing code</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Searching for pairing service</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Pairing service found</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Stop searching</string>\n    <string name=\"notification_adb_pairing_working_title\">Pairing in progress</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Pairing successful</string>\n    <string name=\"notification_adb_pairing_succeed_text\">You can start Shizuku service now.</string>\n    <string name=\"notification_adb_pairing_failed_title\">Pairing failed</string>\n    <string name=\"notification_adb_pairing_retry\">Retry</string>\n\n    <!-- Permission related, appears in system permission UI -->\n    <string name=\"permission_group_label\" translatable=\"false\">Shizuku</string>\n    <string name=\"permission_group_description\" translatable=\"false\">@string/permission_label</string>\n    <string name=\"permission_label\">access Shizuku</string>\n    <string name=\"permission_description\">Allow the app to use Shizuku.</string>\n    <string name=\"permission_warning_template\"><![CDATA[Allow <b>%1$s</b> to %2$s?]]></string>\n    <string name=\"grant_dialog_button_allow_always\">Allow all the time</string>\n    <string name=\"grant_dialog_button_deny\">\"Deny\"</string>\n\n    <!-- Starter -->\n    <string name=\"starter\">Starter</string>\n    <string name=\"starting_root_shell\" translatable=\"false\">Starting root shell…</string>\n    <string name=\"start_with_root_failed\">Can\\'t start service because root permission is not granted or this device is not rooted.</string>\n\n    <!-- Misc -->\n    <string name=\"dialog_cannot_open_browser_title\">Can\\'t start browser</string>\n    <string name=\"toast_copied_to_clipboard\">%s\\nhas been copied to clipboard.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><![CDATA[<b>%s</b> has been copied to clipboard.]]></string>\n\n    <!-- Messages for legacy -->\n    <string name=\"dialog_legacy_not_support_title\">%1$s does not support modern Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\"><![CDATA[Legacy Shizuku has been deprecated since March 2019. Also, legacy Shizuku does not work on newer Android systems.<p>Please ask the developer of <b>%1$s</b> to update.]]></string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s is requesting legacy Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\"><![CDATA[<b>%1$s</b> has modern Shizuku support, but it\\'s requesting legacy Shizuku. This could because Shizuku is not running, please check in Shizuku app.<p>Legacy Shizuku has been deprecated since March 2019.]]></string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Open Shizuku</string>\n\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/strings_untranslatable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"translation_url\" translatable=\"false\">https://rikka.app/contribute_translation/</string>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"AppTheme\" parent=\"Theme.Light\" />\n\n    <style name=\"Card\">\n        <item name=\"android:duplicateParentState\">true</item>\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:paddingStart\">16dp</item>\n        <item name=\"android:paddingEnd\">16dp</item>\n        <item name=\"android:paddingTop\">20dp</item>\n        <item name=\"android:paddingBottom\">20dp</item>\n    </style>\n\n    <style name=\"Card.Light\" />\n\n    <style name=\"CardButton\" parent=\"Widget.Material3.Button\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"iconPadding\">12dp</item>\n    </style>\n\n    <style name=\"CardTitle\">\n        <item name=\"android:textAppearance\">?textAppearanceBodyLarge</item>\n        <item name=\"android:textColor\">?android:textColorPrimary</item>\n        <item name=\"android:textSize\">16sp</item>\n        <item name=\"android:lineSpacingExtra\">1sp</item>\n    </style>\n\n    <style name=\"CardSummary\">\n        <item name=\"android:textAppearance\">?textAppearanceBodyMedium</item>\n        <item name=\"android:textColor\">?android:textColorSecondary</item>\n        <item name=\"android:layout_marginTop\">4sp</item>\n    </style>\n\n    <style name=\"CardContent\">\n        <item name=\"android:textAppearance\">?textAppearanceBodyMedium</item>\n        <item name=\"android:textColor\">?android:textColorSecondary</item>\n    </style>\n\n    <style name=\"CardIcon\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:background\">@drawable/shape_circle_icon_background</item>\n        <item name=\"android:tint\">?colorOnPrimaryContainer</item>\n        <item name=\"android:tintMode\">src_in</item>\n        <item name=\"android:backgroundTint\">?colorPrimaryContainer</item>\n        <item name=\"android:backgroundTintMode\">src_in</item>\n    </style>\n\n    <style name=\"GrantPermissions\" parent=\"@style/AppTheme\">\n        <item name=\"android:colorBackground\">?colorBackgroundFloating</item>\n        <item name=\"android:colorBackgroundCacheHint\">@null</item>\n\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:backgroundDimEnabled\">true</item>\n        <item name=\"android:windowAnimationStyle\">@android:style/Animation.Dialog</item>\n    </style>\n\n    <style name=\"TerminalTutorialText\">\n        <item name=\"android:textAppearance\">?textAppearanceBodyMedium</item>\n        <item name=\"android:minHeight\">32dp</item>\n        <item name=\"android:gravity\">center_vertical</item>\n    </style>\n\n    <style name=\"FilledCard\" parent=\"@style/Widget.Material3.CardView.Filled\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_marginStart\">-4dp</item>\n        <item name=\"android:layout_marginEnd\">-4dp</item>\n        <item name=\"android:checkable\">true</item>\n        <item name=\"android:clickable\">true</item>\n        <item name=\"android:focusable\">true</item>\n        <item name=\"android:clipChildren\">false</item>\n        <item name=\"android:clipToPadding\">false</item>\n        <item name=\"cardCornerRadius\">28dp</item>\n        <item name=\"contentPaddingStart\">24dp</item>\n        <item name=\"contentPaddingEnd\">24dp</item>\n        <item name=\"contentPaddingLeft\">24dp</item>\n        <item name=\"contentPaddingRight\">24dp</item>\n        <item name=\"contentPaddingTop\">20dp</item>\n        <item name=\"contentPaddingBottom\">20dp</item>\n        <item name=\"cardBackgroundColor\">?colorSecondaryContainer</item>\n    </style>\n\n    <style name=\"GrantPermissionsButtons\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_marginStart\">24dp</item>\n        <item name=\"android:layout_marginEnd\">24dp</item>\n        <item name=\"android:minHeight\">56dp</item>\n        <item name=\"android:padding\">16dp</item>\n        <item name=\"android:textSize\">14sp</item>\n        <item name=\"android:textColor\">?textColorOnPrimaryContainer</item>\n        <item name=\"android:fontFamily\">sans-serif-medium</item>\n        <item name=\"android:gravity\">center</item>\n    </style>\n\n    <style name=\"GrantPermissionsButtons.Top\">\n        <item name=\"android:background\">@drawable/grant_permissions_buttons_top</item>\n        <item name=\"android:layout_marginBottom\">2dp</item>\n    </style>\n\n    <style name=\"GrantPermissionsButtons.Buttom\">\n        <item name=\"android:background\">@drawable/grant_permissions_buttons_bottom</item>\n        <item name=\"android:layout_marginTop\">2dp</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Base.AppTheme.Light\" parent=\"Theme.Material3.Light.Shizuku\">\n        <item name=\"android:statusBarColor\">?android:colorBackground</item>\n\n        <item name=\"appColorPrimary\">@color/app_color_light</item>\n        <item name=\"homeCardStyle\">@style/Card.Light</item>\n\n        <item name=\"android:windowActionBar\">false</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"Theme.Light\" parent=\"Base.AppTheme.Light\" />\n\n    <style name=\"Base.AppTheme\" parent=\"Theme.Material3.Dark.Shizuku\">\n        <item name=\"appColorPrimary\">@color/app_color_dark</item>\n        <item name=\"homeCardStyle\">@style/Card</item>\n\n        <item name=\"android:windowActionBar\">false</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"Theme\" parent=\"Base.AppTheme\" />\n\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/themes_overlay.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"ThemeOverlay\"/>\n\n    <style name=\"ThemeOverlay.Black\">\n        <item name=\"android:colorPrimary\">@android:color/black</item>\n        <item name=\"android:colorPrimaryDark\">@android:color/black</item>\n        <item name=\"android:colorBackground\">@android:color/black</item>\n        <item name=\"colorSurface\">@android:color/black</item>\n    </style>\n\n    <style name=\"ThemeOverlay.DynamicColors.Light\" parent=\"ThemeOverlay.Material3.DynamicColors.Light.Rikka\"/>\n\n    <style name=\"ThemeOverlay.DynamicColors.Dark\" parent=\"ThemeOverlay.Material3.DynamicColors.Dark.Rikka\"/>\n\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_layout_manager\" translatable=\"false\">androidx.recyclerview.widget.LinearLayoutManager</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ang/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Webmaster araçlan</item>\n        <item quantity=\"other\"></item>\n    </plurals>\n    <string name=\"notification_service_start_failed\">Webmaster araçlan</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_status_service_version\">الإصدار %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s لا يعمل</string>\n    <string name=\"home_status_service_is_running\">%1$s يعمل بنجاح</string>\n    <string name=\"home_adb_title\">ابدأ بالاتصال بجهاز كمبيوتر</string>\n    <string name=\"home_adb_button_view_help\">اقرأ التعليمات</string>\n    <string name=\"home_adb_button_view_command\">عرض الأمر</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">نسخ</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">إرسال</string>\n    <string name=\"home_status_service_version_update\">الإصدار %2$s, %1$s&lt;br&gt;اعد تشغيل التطبيق من جديد للتحديث إلى الإصدار %3$s</string>\n    <string name=\"home_adb_description\">بالنسبة للأجهزة التي لا تحتوي على الجذر (Root) ، تحتاج إلى استخدام adb لبدء Shizuku (يتطلب اتصال الكمبيوتر). يجب تكرار هذه العملية في كل مرة يتم فيها إعادة تشغيل الجهاز. يرجى <b><a href=\"%1$s\"> قراءة التعليمات </a></b>.</string>\n    <string name=\"dialog_adb_discovery_message\">يرجى تمكين \\\"التصحيح اللاسلكي\\\" في \\\"خيارات المطور\\\". \\\"تصحيح لاسلكي\\\" يتم تعطيلها عندما تتغير الشبكة تلقائيا.\n\\n\n\\n ملاحظة، لا تعطل \\\"خيارات المطور\\\" أو \\\"تصحيح USB\\\"، أو سيتم إيقاف شيزوكو</string>\n    <string name=\"dialog_adb_port\">المنفذ</string>\n    <string name=\"adb_pairing\">الاقتران</string>\n    <string name=\"home_adb_dialog_view_command_message\">font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* هناك بعض الاعتبارات الأخرى، يرجى تأكيد أنك قرأت التعليمات أولا.</string>\n    <string name=\"home_wireless_adb_title\">البدء باستخدام التصحيح اللاسلكي</string>\n    <string name=\"home_wireless_adb_description\">على أندرويد 11 وما فوق ، يمكنك تفعيل التصحيح اللاسلكي وبدء Shizuku مباشرة من جهازك ، دون الاحتياج إتصال بالكمبيوتر.&lt;p&gt;يرجى الإطلاع أولاً على التعليمات المفصلة خطوة بخطوة.</string>\n    <string name=\"dialog_adb_discovery\">البحث عن خدمة التصحيح اللاسلكي</string>\n    <string name=\"dialog_adb_invalid_port\">المنفذ هو عدد صحيح يتراوح من 1 إلى 65535.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">‌دليل خطوة بخطوة</string>\n    <string name=\"dialog_adb_pairing_title\">إقران مع الجهاز</string>\n    <string name=\"home_wireless_adb_description_pre_11\">على الأجهزة الأقدم من إصدار الأندرويد 11 ، يلزم الاتصال بجهاز كمبيوتر لتمكين المعالجة/التصحيح اللاسلكي.</string>\n    <string name=\"dialog_adb_pairing_discovery\">جاري البحث على جهاز للإتصال</string>\n    <string name=\"translation_contributors\">‮المشاركين في الترجمة</string>\n    <string name=\"settings_startup\">بدء</string>\n    <string name=\"settings_black_night_theme_summary\">استخدم سمة السواد النقيّ إذ الوضع الليلي الذي بالجهاز مفعل</string>\n    <string name=\"settings_black_night_theme\">وضع السواد النقيّ</string>\n    <string name=\"settings_user_interface\">المظهر</string>\n    <string name=\"settings_language\">اللغة</string>\n    <string name=\"settings_title\">الإعدادات</string>\n    <string name=\"rish_description\">باستخدام %1$s ، في أي تطبيق طرفي ، يمكنك الاتصال والتفاعل مع عمليات تشغيل shell بواسطة Shizuku. &lt;p&gt; حول الاستخدام التفصيلي %1$s ، انقر لعرض المستند.</string>\n    <string name=\"terminal_tutorial_3_description\">بعض النصائح: امنح إذن التنفيذ لـ %1$s وأضفه إلى%2$s ، ستتمكن من استخدام %1$s مباشرةً.</string>\n    <string name=\"terminal_tutorial_3\">أخيرًا ، انقل الملفات إلى مكان يمكن لتطبيقك الطرفي الوصول إليه ، وستتمكن من استخدام %1$s لتشغيل الأوامر من خلال Shizuku.</string>\n    <string name=\"terminal_tutorial_2_description\">على سبيل المثال ، إذا كنت تريد استخدام Shizuku في %1$s ، فيجب استبدال %2$s بـ %3$s (%4$s هو اسم الحزمة %1$s).</string>\n    <string name=\"terminal_tutorial_2\">بعد ذلك ، استخدم أي محرر نصوص لفتح %1$s وقم بتعديله.</string>\n    <string name=\"terminal_export_files\">تصدير الملفات</string>\n    <string name=\"terminal_tutorial_1_description\">إذا كانت هناك ملفات بنفس الاسم في المجلد المحدد ، فسيتم حذفها.\n\\n\n\\nتستخدم وظيفة التصدير SAF (إطار عمل الوصول إلى التخزين). يُذكر أن MIUI قد يخرب وظائف SAF. إذا كنت من تستخدمي MIUI ، فقد تضطر إلى استخراج الملف من APK Shizuku أو تنزيله من GitHub.</string>\n    <string name=\"terminal_tutorial_1\">أولاً ، قم بتصدير الملفات إلى أي مكان تريده. ستجد ملفين, %1$s و %2$s.</string>\n    <string name=\"home_terminal_description\">قم بتشغيل الأوامر من خلال Shizuku في تطبيقات المحطة التي تريدها</string>\n    <string name=\"home_terminal_title\">استخدم Shizuku في تطبيقات المحطة</string>\n    <string name=\"app_management_item_summary_requires_root\">* يطلب Shizuku الجذر (الروت) للعمل</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">من المحتمل جدًا أن تحدد الشركة المصنعة للجهاز إذن adb. &lt;p&gt; قد يكون هناك حل لنظامك في &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;هذا المستند&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">إذن الADB محدود</string>\n    <string name=\"home_adb_is_limited_description\">قامت الشركة المصنعة لجهازك بتقييد أذونات adb ولن تعمل التطبيقات التي تستخدم Shizuku بشكل صحيح.\n\\n\n\\nعادة ، يمكن رفع هذا القيد عن طريق تعديل بعض الخيارات في \\\"خيارات المطور\\\". يرجى قراءة التعليمات للحصول على تفاصيل حول كيفية القيام بذلك.\n\\n\n\\nقد تحتاج إلى إعادة تشغيل Shizuku حتى تدخل العملية حيز التنفيذ.</string>\n    <string name=\"home_adb_is_limited_title\">أنت بحاجة إلى اتخاذ خطوة إضافية</string>\n    <string name=\"home_learn_more_description\">تعلم كيف تطور مع Shizuku</string>\n    <string name=\"home_learn_more_title\">معلومات عن Shizuku</string>\n    <string name=\"home_app_management_empty\">ستظهر هنا التطبيقات التي تتطلب Shizuku.</string>\n    <string name=\"home_app_management_view_authorized_apps\">انقر لإدارة التطبيقات المصرح بها</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"zero\">تطبيق %d معتمد</item>\n        <item quantity=\"one\">تطبيقات %d معتمدة</item>\n        <item quantity=\"two\">تطبيقات %d معتمدة</item>\n        <item quantity=\"few\">تطبيقات %d معتمدة</item>\n        <item quantity=\"many\">تطبيقات %d معتمدة</item>\n        <item quantity=\"other\">تطبيقات %d معتمدة</item>\n    </plurals>\n    <string name=\"home_app_management_title\">الإدارة التطبيقية</string>\n    <string name=\"home_root_button_restart\">إعادة البدء بالتشغيل</string>\n    <string name=\"home_root_button_start\">البدء بالتشغيل</string>\n    <string name=\"home_root_description_sui\">إذا كنت تستخدم Magisk ، فيمكنك تجربة %1$s. بالنسبة لمستخدمي الجذر (الروت) ، سيحل في مكان Shizuku. ملاحظة ، تحتاج التطبيقات الحالية إلى التغيير بسيط لاستخدام %2$s.</string>\n    <string name=\"home_root_description\">بالإضافة إلى ذلك ، يمكن بدء تشغيل Shizuku تلقائياً عند حالة التشغيل بعد القفل. إذا لم يكن الأمر كذلك ، فيرجى التحقق مما إذا كان نظامك أو أدوات الجهات الخارجية (تطبيقات خارجية) قد حد أو عطل Shizuku.\n\\n&lt;br&gt; يمكنك الرجوع إلى %s.</string>\n    <string name=\"home_root_title\">ابدأ (للأجهزة المجذرة)</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">بعض الأنظمة (مثل MIUI) لا تسمح للتطبيقات بالوصول إلى الشبكة عندما لا تكون مرئية ، حتى إذا كان التطبيق يستخدم الخدمة الأمامية كمعيار. يرجى تعطيل ميزات تحسين البطارية لـShizuku على هذه الأنظمة.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">يحتاج Shizuku للوصول إلى الشبكة المحلية. يتم التحكم بها عن طريق إذن الشبكة.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">إرجع إلى Shizuku وقم بتشغيل Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">يرجى ملاحظة أن الجزء الأيسر من خيار \\\"التصحيح اللاسلكي\\\" قابل للنقر عليه ، وسيؤدي النقر عليه إلى فتح صفحة جديدة. تفعيل \\\"التصحيح اللاسلكي\\\" من المفتاح الأيمن قد يكون غير صحيح.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">بخلاف ذلك ، قد لا تتمكن من إدخال رمز الاقتران من الإشعار.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">قد يحتاج مستخدمو MIUI إلى تبديل نمط الإعلام إلى \\\"Android\\\" من \\\"Notification\\\" - \\\"Notification Shade\\\" في إعدادات النظام.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">تحتاج عملية الاقتران إلى التفاعل مع إشعار من Shizuku. يرجى السماح لشيزوكو بنشر الإخطارات.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">أدخل الرمز في إشعار Shizuku المرسل لإكمال الاقتران.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">أدخل \\\"خيارات المطور\\\" - \\\"التصحيح اللاسلكي\\\". انقر على \\\"إقران الجهاز برمز الإقران\\\" ، وسترى رمزًا مكونًا من ستة أرقام.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">سيساعدك إشعار من Shizuku على إكمال الاقتران.</string>\n    <string name=\"adb_pairing_tutorial_title\">قم بإقران Shizuku بجهازك</string>\n    <string name=\"notification_settings\">إعداد الإشعارات</string>\n    <string name=\"development_settings\">خيارات للمطور</string>\n    <string name=\"adb_pair_required\">يرجى المرور بخطوة الاقتران أولاً.</string>\n    <string name=\"adb_error_key_store\">تعذر إنشاء مفتاح لتصحيح الأخطاء اللاسلكية.\n\\nقد يكون هذا بسبب تعطل آلية KeyStore لهذا الجهاز.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">يتطلب النظام أن يكون مربع حوار الاقتران مرئيًا دائمًا ، واستخدام وضع تقسيم الشاشة هو الطريقة الوحيدة للسماح لهذا التطبيق ومربع حوار النظام بالظهور في نفس الوقت.</string>\n    <string name=\"adb_pairing_requires_multi_window\">الرجاء إدخال وضع تقسيم الشاشة (متعدد النوافذ) أولاً.</string>\n    <string name=\"dialog_adb_pairing_message\">يرجى بدء الاقتران بالخطوات التالية: \\\"خيارات المطور\\\" - \\\"التصحيح اللاسلكي\\\" - \\\"إقران الجهاز باستخدام رمز الاقتران\\\".\n\\n\n\\nبعد بدء عملية الاقتران ، ستتمكن من إدخال رمز الاقتران.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">التصحيح اللاسلكي غير ممكّن.\n\\nملاحظة ، قبل Android 11 ، لتمكين التصحيح اللاسلكي ، يجب أن يكون الاتصال بالكمبيوتر أمرًا ضروريًا.</string>\n    <string name=\"cannot_connect_port\">لا يمكن الاتصال بخدمة تصحيح الأخطاء اللاسلكية.</string>\n    <string name=\"paring_code_is_wrong\">رمز الاقتران خاطئ.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">كود الاقتران</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">يرجى محاولة تعطيل \\\"التصحيح اللاسلكي\\\" وتمكينه إذا استمر في البحث.</string>\n    <string name=\"dialog_stop_message\">سيتم إيقاف خدمة Shizuku.</string>\n    <string name=\"action_stop\">إيقاف Shizuku</string>\n    <string name=\"notification_service_starting\">بدأت خدمة Shizuku…</string>\n    <string name=\"notification_adb_pairing_service_found_title\">تم العثور على خدمة الاقتران</string>\n    <string name=\"permission_label\">الوصول إلى Shizuku</string>\n    <string name=\"permission_description\">اسمح للتطبيق باستخدام Shizuku.</string>\n    <string name=\"permission_warning_template\">هل تريد السماح لـ <b>%1$s</b> بـ %2$s؟</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">افتح Shizuku</string>\n    <string name=\"settings_start_on_boot\">ابدأ عند التشغيل من حالة القفل (تحتاج جذر/روت)</string>\n    <string name=\"action_about\">حول</string>\n    <string name=\"notification_adb_pairing_succeed_title\">تم الاقتران بنجاح</string>\n    <string name=\"dialog_requesting_legacy_message\">يحتوي &lt;b&gt; %1$s &lt;/b&gt; على دعم Shizuku الحديث ، لكنه يتطلب شيزوكو القديم. قد يكون هذا بسبب عدم تشغيل Shizuku ، يرجى التحقق في تطبيق Shizuku. &lt;p&gt; تم إيقاف Legacy Shizuku منذ آذار (مارس) 2019.</string>\n    <string name=\"settings_translation_summary\">ساعدنا في ترجمة %s إلى لغتك</string>\n    <string name=\"settings_start_on_boot_summary\">بالنسبة للأجهزة المجذرة (تستخدم الروت) ، يمكن لـShizuku البدء تلقائيًا عند التشغيل من حالة القفل</string>\n    <string name=\"settings_use_system_color\">استخدم لون سمة النظام</string>\n    <string name=\"notification_service_start_no_root\">فشل في طلب إذن الجذر (الروت).</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">البحث عن خدمة الاقتران</string>\n    <string name=\"notification_adb_pairing_succeed_text\">يمكنك بدء خدمة Shizuku الآن.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\">تم نسخ <b>%s</b> إلى الحافظة.</string>\n    <string name=\"notification_channel_service_status\">بدء حالة الخدمة</string>\n    <string name=\"notification_service_start_failed\">فشل بدء تشغيل خدمة Shizuku.</string>\n    <string name=\"notification_working\">يعمل…</string>\n    <string name=\"start_with_root_failed\">لا يمكن بدء الخدمة لأنه لم يتم منح إذن الجذر (الروت) أو قد يكون هذا الجهاز ليس مزوّدًا بحق الوصول إلى الجذر (الروت).</string>\n    <string name=\"dialog_requesting_legacy_title\">يطلب %1$s تطبيق Shizuku القديم</string>\n    <string name=\"dialog_legacy_not_support_message\">تم إهمال Legacy Shizuku منذ آذار (مارس) 2019. أيضًا ، لا يعمل Shizuku القديم على أنظمة Android الأحدث. &lt;p&gt; يُرجى مطالبة مطور &lt;b&gt; %1$s &lt;/b&gt; بالتحديث.</string>\n    <string name=\"settings_translation_contributors\">المساهمون في الترجمة</string>\n    <string name=\"settings_translation\">شارك في الترجمة</string>\n    <string name=\"about_view_source_code\">عرض التعليمات البرمجية المصدر في %s</string>\n    <string name=\"notification_channel_adb_pairing\">اقتران التصحيح/العلاج اللاسلكي</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">أدخل رمز الاقتران</string>\n    <string name=\"notification_adb_pairing_stop_searching\">توقف عن البحث</string>\n    <string name=\"notification_adb_pairing_working_title\">الاقتران قيد التقدم</string>\n    <string name=\"notification_adb_pairing_failed_title\">فشل الاقتران</string>\n    <string name=\"notification_adb_pairing_retry\">أعد المحاولة</string>\n    <string name=\"grant_dialog_button_allow_always\">السماح في كل وقت</string>\n    <string name=\"grant_dialog_button_deny\">منع</string>\n    <string name=\"starter\">مفتاح التشغيل</string>\n    <string name=\"dialog_cannot_open_browser_title\">لا يمكن بدء المتصفح</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\n تم نسخه إلى الحافظة.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s لا يدعم النسخة الحديثة من Shizuku</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ars/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_adb_discovery_message\">“ارجوك شغل ”المعالجة اللاسلكية</string>\n    <string name=\"dialog_adb_discovery\">\\\"عم نشيّك خاصية \\\"المعالجة اللاسلكية</string>\n    <string name=\"home_wireless_adb_description\">على إصدارات الأندرويد ١١ او اعلى، فيك تشغل \\\"المعالجة اللاسلكية\\\" وتشغل معها شيزوكو مباشرا من جهازك، من دون ما تتصل بالكمبيوتر\n\\nبحيات ربك، ارجوك شوف التعليمات</string>\n    <string name=\"home_wireless_adb_title\">بلش بـالمعالجة اللاسلكية</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">نسخ</string>\n    <string name=\"home_adb_button_view_command\">شوف الأمر</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-az/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"translation_contributors\">By3lish</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopyala</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Shizukunu aç</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; müasir Shizuku dəstəyinə malikdir, lakin o, köhnə Şizuku tələb edir. Bu, Shizuku işləmədiyinə görə ola bilər, lütfən, Shizuku proqramında yoxlayın.&lt;p&gt;Legacy Shizuku 2019-cu ilin mart ayından etibarən köhnəlib</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s köhnə Şizuku tələb edir</string>\n    <string name=\"dialog_legacy_not_support_message\">Köhnə Shizuku 2019-cu ilin mart ayından ləğv edilib. Həmçinin, köhnə Shizuku daha yeni Android sistemlərində işləmir.&lt;p&gt;Lütfən, &lt;b&gt;%1$s&lt;/b&gt; tərtibatçısından yeniləməsini xahiş edin.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s müasir Shizukunu dəstəkləmir</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> kopyalandı.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nkopyalandı.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Brauzeri başlatmaq mümkün deyil</string>\n    <string name=\"start_with_root_failed\">Root icazəsi verilmədiyi və ya bu cihaz rootlu olmadığı üçün xidməti başlatmaq mümkün deyil.</string>\n    <string name=\"starter\">Başlanğıc</string>\n    <string name=\"grant_dialog_button_deny\">Ləğv et</string>\n    <string name=\"grant_dialog_button_allow_always\">Hər zaman icazə ver</string>\n    <string name=\"permission_warning_template\"><b>%1$s</b> - ya %2$s üçün icazə verilsin\\?</string>\n    <string name=\"permission_description\">Proqramın Shizukudan istifadə etməsinə icazə verin</string>\n    <string name=\"permission_label\">Shizukuya daxil olun</string>\n    <string name=\"notification_adb_pairing_retry\">Yenidən cəhd edin</string>\n    <string name=\"notification_adb_pairing_failed_title\">Qoşulma uğursuz oldu</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Siz indi Shizuku xidmətini başlata bilərsiniz.</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Qoşulma uğurludur</string>\n    <string name=\"notification_adb_pairing_working_title\">Axtarış davam edir</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Axtarışı dayandırın</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Qoşulma xidməti tapıldı</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Qoşulma xidməti axtarılır</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Cütləşmə kodunu daxil edin</string>\n    <string name=\"notification_channel_adb_pairing\">Simsiz debaq qoşulur...</string>\n    <string name=\"notification_working\">İşləyir…</string>\n    <string name=\"notification_service_start_no_root\">Root icazəsini tələb etmək alınmadı.</string>\n    <string name=\"notification_service_start_failed\">Shizuku servisini başlatmaq mümkün olmadı</string>\n    <string name=\"notification_service_starting\">Shizuku servisi başladılır…</string>\n    <string name=\"notification_channel_service_status\">Xidmətin başlama statusu</string>\n    <string name=\"dialog_stop_message\">Shizuku xidməti dayandırılacaq.</string>\n    <string name=\"action_stop\">Shizikunu dayandır</string>\n    <string name=\"about_view_source_code\">Qaynaq kodlarına buradan baxın %s</string>\n    <string name=\"action_about\">Haqqında</string>\n    <string name=\"settings_use_system_color\">Sistem teması rəngindən istifadə edin</string>\n    <string name=\"settings_start_on_boot_summary\">Rootlu cihazlar üçün, Shizuku boot zamanı avtomatik başlaya bilir</string>\n    <string name=\"settings_start_on_boot\">Boot anında başlatın (Root lazımdır)</string>\n    <string name=\"settings_translation_summary\">%s dilini öz dilinizə tərcümə etməkdə bizə kömək edin</string>\n    <string name=\"settings_translation\">Tərcümədə iştirak et</string>\n    <string name=\"settings_translation_contributors\">Tərcümədə iştirak edənlər</string>\n    <string name=\"settings_startup\">başlamaq</string>\n    <string name=\"settings_black_night_theme_summary\">Gecə rejimi aktivdirsə, saf qara temasından istifadə edin</string>\n    <string name=\"settings_black_night_theme\">Qara gecə teması</string>\n    <string name=\"settings_user_interface\">Görünüş</string>\n    <string name=\"settings_language\">Dil</string>\n    <string name=\"settings_title\">Parametrlər</string>\n    <string name=\"rish_description\">%1$s ilə istənilən terminal proqramında siz Shizuku tərəfindən hazırlanmış shell-lərə qoşula və onlarla əlaqə saxlaya bilərsiniz. &lt;p&gt;Ətraflı istifadə %1$s haqqında sənədə baxmaq üçün toxunun.</string>\n    <string name=\"terminal_tutorial_3_description\">Bəzi məsləhətlər: %1$s-a icra icazəsi verin və onu %2$s-a əlavə edin, siz birbaşa %1$s-dan istifadə edə biləcəksiniz.</string>\n    <string name=\"terminal_tutorial_3\">Nəhayət, faylları terminal proqramınızın daxil ola biləcəyi yerə köçürün, Shizuku vasitəsilə əmrləri yerinə yetirmək üçün %1$s-dan istifadə edə biləcəksiniz.</string>\n    <string name=\"terminal_tutorial_2_description\">Məsələn, %1$s-da Shizuku-dan istifadə etmək istəyirsinizsə, %2$s-ı %3$s ilə əvəz etməlisiniz (%4$s %1$s paketinin adıdır).</string>\n    <string name=\"terminal_tutorial_2\">Sonra %1$s-ı açmaq və redaktə etmək üçün istənilən mətn redaktorundan istifadə edin.</string>\n    <string name=\"terminal_export_files\">Faylları ixrac edin</string>\n    <string name=\"terminal_tutorial_1_description\">Seçilmiş qovluqda eyni adlı fayllar varsa, onlar silinəcək.\n\\n\n\\nİxrac funksiyası SAF (Storage Access Framework) istifadə edir. MIUI-nin SAF funksiyalarını pozduğu bildirilir. MIUI istifadə edirsinizsə, faylı Shizuku-nun apk-dan çıxarmalı və ya GitHub-dan yükləməli ola bilərsiniz.</string>\n    <string name=\"terminal_tutorial_1\">Birincisi, faylları istədiyiniz yerə ixrac edin. Siz iki fayl tapacaqsınız, %1$s və %2$s.</string>\n    <string name=\"home_terminal_description\">İstədiyiniz terminal proqramlarında Shizuku vasitəsilə əmrləri işə salın</string>\n    <string name=\"home_terminal_title\">Shizikunu terminal proqramlarında istifadə edin</string>\n    <string name=\"app_management_item_summary_requires_root\">* Shizuku rootla işləməsini tələb edir</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Çox güman ki, cihazınızın istehsalçısı adb icazəsini məhdudlaşdırır.&lt;p&gt;Sisteminiz üçün &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;bu sənəddə&lt;/a&gt;&lt;/b&gt; həll yolu ola bilər.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">adb icazəsi məhduddur</string>\n    <string name=\"home_learn_more_description\">Necə Shizuku dəstəkli proqram hazırlaya biləcəyinizi öyrənin və ya Shizuku dəstəkli proqramları əldə edin</string>\n    <string name=\"home_learn_more_title\">Shizuku haqqında</string>\n    <string name=\"home_app_management_view_authorized_apps\">İcazə verilmiş proqramları idarə etmək üçün toxunun</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">İcazə verilmiş %d proqram</item>\n        <item quantity=\"other\">İcazə verilmiş %d proqramlar</item>\n    </plurals>\n    <string name=\"home_app_management_title\">tətbiqin idarə edilməsi</string>\n    <string name=\"home_root_button_restart\">Yenidən Başlat</string>\n    <string name=\"home_root_button_start\">Başlat</string>\n    <string name=\"home_root_description_sui\">Magisk istifadə edirsinizsə, %1$s istifadə edə bilərsiniz. Root istifadəçiləri üçün o, nəticədə Shizuku əvəz edəcək. Qeyd edək ki, %2$s-dan istifadə etmək üçün mövcud proqramlar bir az dəyişməlidir.</string>\n    <string name=\"home_root_description\">Bundan əlavə, Shizuku yüklənərkən avtomatik olaraq işə salına bilər. Əks-təqdirdə , sisteminizin və ya üçüncü tərəf alətlərin Shizuku-nu məhdudlaşdırıb-məhdudlaşdırdığını yoxlayın.&lt;br&gt;Siz %s-ə müraciət edə bilərsiniz.</string>\n    <string name=\"home_root_title\">Başlat (root edilmiş cihazlar üçün)</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Bəzi sistemlər (məsələn, MIUI) proqramlar görünmədikdə şəbəkəyə daxil olmağa icazə vermir, hətta proqram standart olaraq ön plan xidmətindən istifadə edir. Zəhmət olmasa Shizuku üçün batareyanın optimallaşdırılması xüsusiyyətlərini deaktiv edin</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku lokal şəbəkəyə daxil olmalıdır. Şəbəkə icazəsi ilə idarə olunur.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Shizikuya geri dön və Shizikunu başlat</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Nəzərə alın ki, \\\"Simsiz debaq\\\" seçiminin sol hissəsi tıklana bilər, ona toxunmaq yeni səhifə açacaq. Yalnız sağdakı açara basmaq düzgün deyil.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Əks təqdirdə siz bildirişdə olan cütləşdirmə kodunu daxil edə bilməyəcəksiniz</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">MIUI istifadəçiləri sistem parametrlərində bildiriş tərzini \\\"Bildiriş\\\" - \\\"Bildiriş kölgəsi\\\"ndən \\\"Android\\\"ə keçirməli ola bilərlər</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Cütləşmə prosesi Shizukudan gələn bildirişi görməyinizi tələb edir. Zəhmət olmasa, Shizuku-ya bildirişlər göndərməyə icazə verin.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Cütləşdirməni tamamlamaq üçün bildirişdəki kodu daxil edin</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">\\\"Tərtibatçı seçimləri\\\" - \\\"Simsiz debaq\\\" daxil olun. \\\"Cihazı cütləşdirmə kodu ilə cütləşdir\\\" klikləyin, altı rəqəmli kod görəcəksiniz.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Shizukudan gələn bildiriş cütləşdirməni tamamlamağınız üçün sizə kömək edə bilər</string>\n    <string name=\"adb_pairing_tutorial_title\">Shizuku-nu cihazınızla cütləşdirin</string>\n    <string name=\"notification_settings\">Bildiriş seçimləri</string>\n    <string name=\"development_settings\">Tərtibatçı seçimləri</string>\n    <string name=\"adb_pair_required\">Lütfən, əvvəlcə cütləşmə mərhələsini keçin.</string>\n    <string name=\"adb_error_key_store\">Simsiz debaq üçün açar yaratmaq mümkün deyil.\n\\nBunun səbəbi bu cihazın KeyStore mexanizminin xarab olması ola bilər.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Sistem cütləşmə dialoqunun həmişə görünməsini tələb edir, bölünmüş ekran rejimindən istifadə bu proqram və sistem dialoqunun eyni vaxtda görünməsinə imkan verən yeganə yoldur.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Əvvəlcə bölünmüş ekran (çoxu pəncərə) rejiminə daxil olun.</string>\n    <string name=\"dialog_adb_pairing_message\">Zəhmət olmasa, aşağıdakı addımlarla cütləşdirmə etməyə başlayın: \\\"Tərtibatçı Seçimləri\\\" - \\\"Simsiz debaq\\\" - \\\"Cütləşdirmə kodundan istifadə edərək cihazın cütləşdirilməsi\\\".\n\\n\n\\nCütləşdirmə prosesi başladıqdan sonra siz cütləşdirmə kodunu daxil edə biləcəksiniz</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Simsiz debaq aktiv edilməyib.\n\\nQeyd edək ki, Android 11-dən əvvəl simsiz debaqı aktivləşdirmək üçün kompüter bağlantısı mütləqdir.</string>\n    <string name=\"cannot_connect_port\">Simsiz debaq cihazına qoşulmaq mümkün olmadı</string>\n    <string name=\"paring_code_is_wrong\">Cütləşmə kodu yanlışdır</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Cütləşmə kodu</string>\n    <string name=\"dialog_adb_pairing_discovery\">Cütləşdirmə servisi axtarılır</string>\n    <string name=\"dialog_adb_pairing_title\">Cihaz ilə cütləşdir</string>\n    <string name=\"adb_pairing\">Cütləşmə</string>\n    <string name=\"dialog_adb_invalid_port\">Port 1 ilə 65535 arasında dəyişən tam ədəddir.</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_discovery_message\">Lütfən, \\\"Tərtibatçı seçimləri\\\"ndə \\\"Simsiz Debaq\\\" funksiyasını aktivləşdirin. Şəbəkə dəyişdikdə \\\"Simsiz Debaq\\\" avtomatik olaraq söndürülür.\n\\n\n\\nQeyd edək ki, Tərtibatçı seçimlərini, USB Debaqı və ya Shizuku-nu söndürməyin</string>\n    <string name=\"dialog_adb_discovery\">Simsiz debaq cihazı axtarılır</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Addım-Addım Təlimat</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Android 11 - dən aşağı android versiyalarında simsiz debaq üçün kompüterə bağlanmaq mütləqdir</string>\n    <string name=\"home_wireless_adb_description\">Android 11 və ya daha yuxarı versiyalarda siz Simsiz debaqı aktivləşdirə və kompüterə qoşulmadan Shizuku-nu birbaşa cihazınızdan başlada bilərsiniz.&lt;p&gt;Lütfən, əvvəlcə addım-addım təlimata baxın.</string>\n    <string name=\"home_wireless_adb_title\">Simsiz debaq ilə başladın</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Göndər</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Bəzi başqa mülahizələr də var, lütfən, əvvəlcə yardımı oxuduğunuzu təsdiqləyin.</string>\n    <string name=\"home_adb_button_view_command\">Əmirə baxın</string>\n    <string name=\"home_adb_button_view_help\">Yardım</string>\n    <string name=\"home_adb_description\">Root olmayan cihazlarda Shizuku-nu işə salmaq üçün adb-dən istifadə etməlisiniz (kompüter bağlantısı tələb olunur). Cihaz hər dəfə yenidən işə salındıqda bu proses təkrarlanmalıdır. Lütfən, <b><a href=\"%1$s\">yardımı oxuyun</a></b>.</string>\n    <string name=\"home_adb_title\">Kompüterə qoşularaq başlayın</string>\n    <string name=\"home_status_service_version_update\">Versiya %2$s, %1$s &lt;br&gt; %3$s Versiyasına güncəlləmək üçün proqramı yenidən başladın</string>\n    <string name=\"home_status_service_version\">Versiya %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s davam etmir</string>\n    <string name=\"home_status_service_is_running\">%1$s davam edir</string>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-b+es+419/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"paring_code_is_wrong\">El código de emparejamiento es incorrecto.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Código de emparejamiento</string>\n    <string name=\"dialog_adb_pairing_discovery\">Buscando servicio de emparejamiento</string>\n    <string name=\"dialog_adb_pairing_title\">Emparejar con dispositivo</string>\n    <string name=\"dialog_adb_discovery_message\">Habilite \\\"Depuración inalámbrica\\\" en \\\"Opciones de desarrollador\\\". La \\\"depuración inalámbrica\\\" se desactiva automáticamente cuando cambia la red.\n\\n\n\\nTenga en cuenta que no desactive las \\\"Opciones de desarrollador\\\" o la \\\"Depuración USB\\\", o Shizuku se detendrá.</string>\n    <string name=\"home_status_service_version_update\">Versión %2$s, %1$s&lt;br&gt;Vuelva a empezar para actualizar a la versión %3$s</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Abrir Shizuku</string>\n    <string name=\"action_about\">Acerca de</string>\n    <string name=\"development_settings\">Opciones de desarrollador</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">El sistema requiere que el cuadro de diálogo de emparejamiento esté siempre visible, el uso del modo de pantalla dividida es la única forma de permitir que esta aplicación y el cuadro de diálogo del sistema estén visibles al mismo tiempo.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Ingrese primero al modo de pantalla dividida (ventanas múltiples).</string>\n    <string name=\"dialog_adb_invalid_port\">El puerto es un número entero comprendido entre 1 y 65535.</string>\n    <string name=\"dialog_adb_port\">Puerto</string>\n    <string name=\"dialog_adb_discovery\">Buscando servicio de depuración inalámbrica</string>\n    <string name=\"home_wireless_adb_title\">Iniciar desde depuración inalámbrica</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Enviar</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copiar</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Esto tiene otras consideraciones, por favor confirme que ha leído la información de ayuda primero.</string>\n    <string name=\"home_adb_button_view_command\">Ver comando</string>\n    <string name=\"home_adb_button_view_help\">Ver ayuda</string>\n    <string name=\"home_adb_description\">Para dispositivos sin root, usted necesita ADB para ejecutar Shizuku (requiere una conexión a un ordenador). Este proceso se debe repetir cada vez que el dispositivo sea reiniciando. &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;obtener más ayuda&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"home_adb_title\">Empiece por conectarse a su computador</string>\n    <string name=\"home_status_service_version\">Versión %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s no está activo</string>\n    <string name=\"home_status_service_is_running\">%1$s está activo</string>\n    <string name=\"translation_contributors\">—Peter Cuevas</string>\n    <string name=\"grant_dialog_button_deny\">Negar</string>\n    <string name=\"grant_dialog_button_allow_always\">Permitir todo el tiempo</string>\n    <string name=\"notification_service_start_failed\">Error al iniciar el servicio Shizuku.</string>\n    <string name=\"notification_service_starting\">El servicio de Shizuku se está iniciando…</string>\n    <string name=\"action_stop\">Detener Shizuku</string>\n    <string name=\"about_view_source_code\">Ver código fuente en %s</string>\n    <string name=\"settings_start_on_boot_summary\">Para dispositivos root, Shizuku puede iniciarse automáticamente al arrancar</string>\n    <string name=\"settings_start_on_boot\">Iniciar en el arranque (root)</string>\n    <string name=\"settings_translation\">Participe en la traducción</string>\n    <string name=\"settings_translation_contributors\">Colaboradores de traducción</string>\n    <string name=\"settings_black_night_theme_summary\">Use el tema negro puro si el modo nocturno está habilitado</string>\n    <string name=\"settings_black_night_theme\">Tema negro</string>\n    <string name=\"settings_user_interface\">Apariencia</string>\n    <string name=\"settings_language\">Idioma</string>\n    <string name=\"settings_title\">Configuraciones</string>\n    <string name=\"home_learn_more_title\">Aprende sobre Shizuku</string>\n    <string name=\"home_app_management_view_authorized_apps\">Toque para administrar aplicaciones autorizadas</string>\n    <string name=\"home_app_management_title\">Gestión de aplicaciones</string>\n    <string name=\"home_root_button_restart\">Reiniciar</string>\n    <string name=\"home_root_button_start\">Iniciar</string>\n    <string name=\"home_root_title\">Iniciar (para dispositivos root)</string>\n    <string name=\"adb_pair_required\">Primero, realice el paso de emparejamiento.</string>\n    <string name=\"adb_error_key_store\">No se puede generar la clave para la depuración inalámbrica.\n\\nEsto puede deberse a que el mecanismo KeyStore de este dispositivo está roto.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">La depuración inalámbrica no está habilitada.\n\\nTenga en cuenta que antes de Android 11, para habilitar la depuración inalámbrica, la conexión a la computadora es imprescindible.</string>\n    <string name=\"cannot_connect_port\">No se puede conectar al servicio de depuración inalámbrico.</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; tiene soporte para Shizuku moderno, pero está solicitando Shizuku heredado. Esto podría deberse a que Shizuku no se está ejecutando, por favor, compruébalo en la aplicación Shizuku.&lt;p&gt;Shizuku heredado está obsoleto desde marzo de 2019.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s está solicitando Shizuku heredado</string>\n    <string name=\"dialog_cannot_open_browser_title\">No se puede iniciar el navegador</string>\n    <string name=\"starter\">Inicio</string>\n    <string name=\"permission_warning_template\">¿Permitir a <b>%1$s</b> a %2$s\\?</string>\n    <string name=\"permission_label\">acceder a Shizuku</string>\n    <string name=\"notification_working\">Trabajando…</string>\n    <string name=\"notification_service_start_no_root\">No se ha podido solicitar el permiso de root.</string>\n    <string name=\"notification_channel_service_status\">Estado de inicio del servicio</string>\n    <string name=\"dialog_stop_message\">El servicio de Shizuku se detendrá.</string>\n    <string name=\"settings_startup\">Inicio</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Aplicación %d autorizada</item>\n        <item quantity=\"other\">Aplicaciones %d autorizadas</item>\n    </plurals>\n    <string name=\"home_root_description_sui\">Si estás usando Magisk, puedes probar %1$s. Para los usuarios root, eventualmente reemplazará a Shizuku. Tenga en cuenta que las aplicaciones existentes deben cambiar un poco para utilizar %2$s.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s no soporta el Shizuku moderno</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> se ha copiado en el portapapeles.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nse ha copiado en el portapapeles.</string>\n    <string name=\"permission_description\">Permitir que la aplicación utilice Shizuku.</string>\n    <string name=\"app_management_item_summary_requires_root\">* requiere que Shizuku se ejecute con la root</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">El permiso de adb es limitado</string>\n    <string name=\"home_learn_more_description\">Aprenda a desarrollar con Shizuku o consiga aplicaciones con Shizuku</string>\n    <string name=\"start_with_root_failed\">No se puede iniciar el servicio porque el permiso de root no está concedido o este dispositivo no está rooteado.</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Es muy posible que el fabricante de tu dispositivo limite el permiso de adb.&lt;p&gt;Puede que haya una solución para tu sistema en &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;este documento&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"dialog_legacy_not_support_message\">El Shizuku heredado está obsoleto desde marzo de 2019. Además, el Shizuku heredado no funciona en los sistemas Android más nuevos.&lt;p&gt;Por favor, pide al desarrollador de &lt;b&gt;%1$s&lt;/b&gt; que se actualice.</string>\n    <string name=\"home_root_description\">Además, Shizuku puede iniciarse automáticamente al arrancar. Si no es así, por favor compruebe si su sistema o herramientas de terceros han restringido Shizuku.&lt;br&gt;Puede consultar %s.</string>\n    <string name=\"dialog_adb_pairing_message\">Por favor, inicie el emparejamiento mediante los siguientes pasos: \\\"Opciones de desarrollador\\\" - \\\"Depuración inalámbrica\\\" - \\\"Emparejar el dispositivo con el código de emparejamiento\\\".\n\\n\n\\nUna vez iniciado el proceso de emparejamiento, podrá introducir el código de emparejamiento.</string>\n    <string name=\"adb_pairing\">‎Emparejamiento‎</string>\n    <string name=\"settings_translation_summary\">Ayúdanos a traducir %s a tu idioma</string>\n    <string name=\"terminal_tutorial_3_description\">Algunos consejos: conceda permiso de ejecución a %1$s y agréguelo a %2$s , podrá usar %1$s directamente.</string>\n    <string name=\"terminal_tutorial_3\">Finalmente, mueva los archivos a un lugar donde su aplicación de terminal pueda acceder, podrá usar %1$s para ejecutar comandos a través de Shizuku.</string>\n    <string name=\"terminal_tutorial_2_description\">Por ejemplo, si desea usar Shizuku en %1$s, debe reemplazar %2$s con %3$s (%4$s es el nombre del paquete de %1$s).</string>\n    <string name=\"terminal_tutorial_2\">Luego, use cualquier editor de texto para abrir y editar %1$s.</string>\n    <string name=\"terminal_export_files\">Exportar archivos</string>\n    <string name=\"terminal_tutorial_1_description\">Si hay archivos con el mismo nombre en la carpeta seleccionada, se eliminarán.\n\\n\n\\nLa función de exportación utiliza SAF (Storage Access Framework). Se informa que MIUI rompe las funciones de SAF. Si está utilizando MIUI, es posible que deba extraer el archivo de la apk de Shizuku o descargarlo de GitHub.</string>\n    <string name=\"home_terminal_title\">Utilice Shizuku en apps de terminal</string>\n    <string name=\"home_terminal_description\">Ejecute comandos a través de Shizuku en las aplicaciones de terminal que le gusten</string>\n    <string name=\"terminal_tutorial_1\">Primero, exporte archivos a cualquier lugar que desee. Encontrará dos archivos,%1$s y %2$s.</string>\n    <string name=\"rish_description\">Con %1$s, en cualquier aplicación de terminal, puede conectarse e interactuar con el shell que ejecuta Shizuku. &lt;p&gt;Acerca del uso detallado %1$s, toca para ver el documento.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Shizuku te enviará una notificación para completar la vinculación</string>\n    <string name=\"home_wireless_adb_description\">A partir de Android 11 o menor, puedes activar la opción de depuración inalámbrica y ejecutar Shizuku desde tu dispositivo, sin necesidad de conectar a una computadora.&lt;p&gt;Por favor revisa la primera guía de paso a paso.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Guía paso a paso</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Digita el código en la notificación para completar el emparejamiento.</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Ingresar código de emparejamiento</string>\n    <string name=\"adb_pairing_tutorial_title\">Vincula Shizuku con tu dispositivo</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Versiones anteriores a Android 11, es necesario conectar a una computadora para activar la depuración inalámbrica.</string>\n    <string name=\"notification_settings\">Opciones de Notificacion</string>\n    <string name=\"notification_adb_pairing_failed_title\">¡Hubo un problema al emparejar!</string>\n    <string name=\"notification_adb_pairing_retry\">Reintentar</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">The pairing process needs you to interact with a notificación from Shizuku. Please allow Shizuku to post notifications.El proceso de emparejamiento necesita que interactúes con una notificación de Shizuku. Permita que Shizuku publique notificaciones.El proceso de emparejamiento necesita que interactúes con una notificación de Shizuku. Permita que Shizuku publique notificaciones.</string>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-bg/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-bn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_adb_dialog_view_command_copy_button\">নকল</string>\n    <string name=\"home_adb_button_view_command\">কমান্ড প্রদর্শন করুন</string>\n    <string name=\"home_adb_button_view_help\">সহযোগিতা নিন</string>\n    <string name=\"home_adb_title\">একটি কম্পিউটার এ সংযোগ প্রদানের মাধ্যমে শুরু করুন</string>\n    <string name=\"home_status_service_version_update\">সংস্করণ %2$s, %1$s&lt;br&gt; %3$s সংস্করণে নবায়ন করতে আবার শুরু করুন</string>\n    <string name=\"home_status_service_version\">সংস্করণ %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s চলছে না</string>\n    <string name=\"home_status_service_is_running\">%1$s চলমান</string>\n    <string name=\"translation_contributors\">অনুবাদকগণ</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ca/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_adb_discovery_message\">Activeu \\\"Depuració sense fil\\\" a \\\"Opcions de desenvolupador\\\". La \\\"depuració sense fil\\\" es desactiva automàticament quan canvia la xarxa.\n\\n\n\\nTingueu en compte que no desactiveu les \\\"Opcions de desenvolupador\\\" ni la \\\"depuració USB\\\", o Shizuku s\\'aturarà.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Abans d\\'Android 11, cal connectar-se a un ordinador per habilitar la depuració sense fil.</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Obre Shizuku</string>\n    <string name=\"paring_code_is_wrong\">El codi de vinculació és incorrecte.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Codi d\\'aparellament</string>\n    <string name=\"dialog_adb_pairing_discovery\">S\\'està buscant el servei d\\'aparellament</string>\n    <string name=\"dialog_adb_pairing_title\">Vincula amb el dispositiu</string>\n    <string name=\"adb_pairing\">Maridatge</string>\n    <string name=\"dialog_adb_invalid_port\">El port és un nombre enter que va de l\\'1 al 65535.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Si us plau, proveu de desactivar i activar \\\"Depuració sense fil\\\" si continua cercant.</string>\n    <string name=\"dialog_adb_discovery\">Cercant servei de depuració sense fil</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Guia pas a pas</string>\n    <string name=\"home_wireless_adb_title\">Comenceu mitjançant la depuració sense fil</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Enviar</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Còpia</string>\n    <string name=\"home_adb_button_view_command\">Veure comanda</string>\n    <string name=\"home_adb_button_view_help\">Llegeix l\\'ajuda</string>\n    <string name=\"home_adb_title\">Comenceu connectant-vos a un ordinador</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ckb/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-cs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Otevřít Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s &lt;/b&gt; má podporu pro moderní Shizuku, ale vyžaduje starší Shizuku. Mohlo by to být proto, že Shizuku není spuštěno, zkontrolujte aplikaci Shizuku. &lt;p&gt; Podpora staršího Shizuku je od března 2019 ukončena.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s vyžaduje starší Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\">Podpora starší verze Shizuku je od března 2019. Starší verze Shizuku také nefunguje na novějších systémech Android. &lt;p&gt; O aktualizaci požádejte vývojáře &lt;b&gt;%1$s &lt;/b&gt;.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s nepodporuje moderní Shizuku</string>\n    <string name=\"toast_copied_to_clipboard_with_text\">&lt;b&gt;%s&lt;/b&gt; byl zkopírován do schránky.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nbyl zkopírován do schránky.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Prohlížeč nelze spustit</string>\n    <string name=\"start_with_root_failed\">Službu nelze spustit, protože není uděleno oprávnění k rootu nebo toto zařízení není rootováno.</string>\n    <string name=\"starter\">Spouštěč</string>\n    <string name=\"permission_description\">povolí aplikaci používat systémová rozhraní API s vyššími oprávněními (Shizuku).</string>\n    <string name=\"permission_label\">přístup k Shizuku</string>\n    <string name=\"permission_group_description\">přístup k Shizuku</string>\n    <string name=\"notification_working\">Pracuji…</string>\n    <string name=\"notification_service_start_no_root\">Nepodařilo se požádat o oprávnění root.</string>\n    <string name=\"notification_service_start_failed\">Spuštění služby Shizuku se nezdařilo.</string>\n    <string name=\"notification_service_starting\">Služba Shizuku se spouští…</string>\n    <string name=\"notification_channel_service_status\">Stav spuštění služby</string>\n    <string name=\"dialog_stop_message\">Služba Shizuku bude zastavena.</string>\n    <string name=\"action_stop\">Zastavit Shizuku</string>\n    <string name=\"about_view_source_code\">Zobrazit zdrojový kód na %su</string>\n    <string name=\"action_about\">O Shizuku</string>\n    <string name=\"settings_start_on_boot_summary\">U rootovaných zařízení je Shizuku schopen automaticky spustit při spuštění</string>\n    <string name=\"settings_start_on_boot\">Spustit při spuštění (root)</string>\n    <string name=\"settings_translation_summary\">Pomozte nám přeložit %s do vašeho jazyka</string>\n    <string name=\"settings_translation\">Podílet se na překladu</string>\n    <string name=\"settings_translation_contributors\">Přispěvatelé překladu</string>\n    <string name=\"settings_startup\">Spuštění</string>\n    <string name=\"settings_black_night_theme_summary\">Pokud je povolen noční režim, použijte motiv čistě černé barvy</string>\n    <string name=\"settings_black_night_theme\">Motiv černé noci</string>\n    <string name=\"settings_user_interface\">Vzhled</string>\n    <string name=\"settings_language\">Jazyk</string>\n    <string name=\"settings_title\">Nastavení</string>\n    <string name=\"app_management_item_summary_requires_root\">* vyžaduje spustit Shizuku s rootem</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Je vysoce možné, že výrobce vašeho zařízení omezuje oprávnění adb. &lt;p&gt; V &lt;b&gt; &lt;a href=\\\"%1$s\\\"&gt; tomto dokumentu &lt;/a&gt; &lt;/b&gt; může být pro váš systém řešení.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Oprávnění adb je omezené</string>\n    <string name=\"home_learn_more_description\">Naučte se, jak vyvíjet aplikace s pomocí Shizuku</string>\n    <string name=\"home_learn_more_title\">Naučte se Shizuku</string>\n    <string name=\"home_app_management_view_authorized_apps\">Klepnutím můžete spravovat autorizované aplikace</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Autorizovaná %d aplikace</item>\n        <item quantity=\"few\">Autorizováno %d aplikací</item>\n        <item quantity=\"other\">Autorizovány %d aplikace</item>\n    </plurals>\n    <string name=\"home_app_management_title\">Správa aplikací</string>\n    <string name=\"home_root_button_restart\">Restartovat</string>\n    <string name=\"home_root_button_start\">Spustit</string>\n    <string name=\"home_root_description\">Kromě toho lze Shizuku spustit automaticky při spuštění. Pokud ne, zkontrolujte, zda váš systém nebo nástroje třetích stran neomezují Shizuku. &lt;br&gt; Můžete se podívat na %s.</string>\n    <string name=\"home_adb_title\">Spustit připojením k počítači</string>\n    <string name=\"home_status_service_version_update\">Verze %2$s, %1$s&lt;br&gt;Znovu spusťte pro aktualizaci na verzi %3$s</string>\n    <string name=\"home_status_service_version\">Verze %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s neběží</string>\n    <string name=\"home_status_service_is_running\">%1$s běží</string>\n    <string name=\"home_root_title\">Start (pro rootovaná zařízení)</string>\n    <string name=\"development_settings\">Developer options</string>\n    <string name=\"adb_pair_required\">Nejprve projděte krok párování.</string>\n    <string name=\"adb_error_key_store\">Nelze vygenerovat klíč pro bezdrátové ladění.\n\\nMůže to být proto, že je narušen mechanismus úložiště klíčů tohoto zařízení.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Systém vyžaduje, aby bylo dialogové okno párování vždy viditelné, použití režimu rozdělené obrazovky je jediný způsob, jak nechat tuto aplikaci a systémový dialog viditelný současně.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Nejprve prosím přejděte do režimu rozdělené obrazovky (více oken).</string>\n    <string name=\"dialog_adb_pairing_message\">Začněte párovat podle následujících kroků: „Možnosti pro vývojáře“ - „Bezdrátové ladění“ - „Párování zařízení pomocí párovacího kódu“.\n\\n\n\\nPo zahájení procesu párování budete moci zadat párovací kód.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Bezdrátové ladění není povoleno.\n\\nPřed povolením systému Android 11 je pro povolení bezdrátového ladění nutné připojení k počítači.</string>\n    <string name=\"cannot_connect_port\">Nelze se připojit k bezdrátové ladicí službě.</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_discovery_message\">Povolte „Bezdrátové ladění“ v „Možnosti pro vývojáře“. „Bezdrátové ladění“ je při změně sítě automaticky deaktivováno.\n\\n\n\\nNezapínejte „Možnosti pro vývojáře“ nebo „Ladění USB“, jinak bude Shizuku zastaven.</string>\n    <string name=\"paring_code_is_wrong\">Chybný kód pro párování.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Kód pro párování</string>\n    <string name=\"dialog_adb_pairing_discovery\">Hledání zařízení pro párování</string>\n    <string name=\"dialog_adb_pairing_title\">Párovat se zařízením</string>\n    <string name=\"adb_pairing\">Párování</string>\n    <string name=\"dialog_adb_invalid_port\">Port je číslo od 1 do 65535.</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopírovat</string>\n    <string name=\"translation_contributors\">JohanyXcz, konggdev</string>\n    <string name=\"dialog_adb_discovery\">Hledání služby bezdrátového ladění</string>\n    <string name=\"home_wireless_adb_title\">Spustit pomocí WiFi debuging</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Odeslat</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Existuje několik dalších úvah, nejprve si prosím přečtěte nápovědu.</string>\n    <string name=\"home_adb_button_view_command\">Zobrazit příkaz</string>\n    <string name=\"home_adb_button_view_help\">Přečíst nápovědu</string>\n    <string name=\"home_adb_description\">U zařízení bez root musíte ke spuštění Shizuku použít adb (vyžaduje připojení k počítači). Tento proces je třeba opakovat při každém restartu zařízení. Přečtěte si prosím &lt;b&gt; &lt;a href=\\\"%1$s\\\"&gt; nápovědu &lt;/a&gt; &lt;/b&gt;.</string>\n    <string name=\"grant_dialog_button_deny\">Zakázat</string>\n    <string name=\"grant_dialog_button_allow_always\">Povolit vždy</string>\n    <string name=\"permission_warning_template\">Povolit aplikaci &lt;/b&gt;%1$s&lt;/b&gt; %2$s\\?</string>\n    <string name=\"home_terminal_title\">Použít Shizuku v terminálových aplikacích</string>\n    <string name=\"home_terminal_description\">Spouštějte příkazy přes Shizuku v terminálových aplikacích které máte rádi</string>\n    <string name=\"adb_pairing_tutorial_title\">Spárovat Shizuku s vaším zařízením</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Otevřete \\\"Vývojářská Nastavení\\\" - \\\"Bezdrátové ladění\\\". Klikněte na \\\"Spárovat zařízení s párovacím kódem\\\", uvidíte šesti-místný kód.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Zadejte ten kód do oznámení aby jste dokončili párování.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Jinak, možná nebudete moct zadat párovací kód do oznámení.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Před Androidem 11, připojení k počítači je vyžadováno k povolení Bezdrátového Ladění.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Návod krok-za-krokem</string>\n    <string name=\"notification_settings\">Nastavení oznámení</string>\n    <string name=\"settings_use_system_color\">Použít systémovou barvu motivu</string>\n    <string name=\"terminal_export_files\">Exportovat soubory</string>\n    <string name=\"terminal_tutorial_1\">Prvně, Exportujte soubory kamkoliv chcete. Najdete dva soubory, %1$s a %2$s.</string>\n    <string name=\"terminal_tutorial_2\">Pak, použijte jakýkoliv textový editor k otevření a upravení %1$s.</string>\n    <string name=\"terminal_tutorial_2_description\">Jako příklad, pokud chcete použít Shizuku v %1$su, musíte změnit %2$s na %3$s (%4$s je jméno balíčku %1$su).</string>\n    <string name=\"terminal_tutorial_3\">Nakonec, přesuňte ty soubory někam kde k nim vaše terminálová aplikace může přistupovat a budete moci používat %1$s aby jste pouštěli příkazy přes Shizuku.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Prosím zkuste zakázat a znovu povolit \\\"Bezdrátové ladění\\\" pokud nepřestává hledat.</string>\n    <string name=\"notification_channel_adb_pairing\">Párování bezdrátového ladění</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Vložte párovací kód</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Párovací služba nalezena</string>\n    <string name=\"notification_adb_pairing_working_title\">Párování probíhá</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Přestaňte hledat</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Párování bylo úspěšné</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Nyní můžete spustit službu Shizuku.</string>\n    <string name=\"notification_adb_pairing_failed_title\">Párování selhalo</string>\n    <string name=\"notification_adb_pairing_retry\">Zkusit znovu</string>\n    <string name=\"home_wireless_adb_description\">Na verzi Android 11 nebo vyšší můžete povolit Bezdrátové ladění a spustit Shizuku přímo z vašeho zařízení, bez připojení k počítači. Přečtěte si prosím prvně návod krok-za-krokem před spuštěním.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Notifikace od Shizuku vám pomůže dokončit párování.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Proces párování vyžaduje interakci s oznámením od Shizuku. Prosím povolte Shizuku posílat oznámení.</string>\n    <string name=\"home_root_description_sui\">Pokud používáte Magisk můžete zkusit %1$s. Pro uživatele s rootem to eventuálně nahradí Shizuku. Existující aplikace musí být trochu změněny aby mohly používat %2$s.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Běžte zpátky do Shizuku a spusťte Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku potřebuje přístup k lokální síti, který je spravován oprávněním k síti.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Některé systémy (například MIUI) nepovolují aplikacím přístup k síti když nejsou viditelné, i když používají služby na popředí. Prosím zakažte optimalizace baterie na takových systémech.</string>\n    <string name=\"home_adb_is_limited_title\">Je třeba udělat jeden krok navíc</string>\n    <string name=\"home_adb_is_limited_description\">Výrobce vašeho zařízení omezil přístup k adb a aplikace používající Shizuku by kvůli tomu nefungovaly správně.\n\\n\n\\nToto omezení může většinou být zakázáno pouze změněním některých možností ve \\\"Vývojářských Nastaveních\\\". Prosím přečtěte si stránku podpory pro informace jak toto udělat.\n\\n\n\\nMožná budete muset restartovat Shizuku pro tuto operaci aby měla efekt.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Uživatelé MIUI možná budou muset přepnout styl oznámení na \\\"Android\\\" z \\\"Oznámení\\\" - \\\"Lišta Oznámení\\\" v nastavení systému.</string>\n    <string name=\"terminal_tutorial_1_description\">Pokir jsou be vybrané složce soubory se stejným jménem budou smazány.\n\\n\n\\nFunkce exportu používá SAF (Storage Access Framework - \\\"Rámcový přístup k úložišti\\\"). Je nahlašováno že MIUI rozbíjí funkce SAF. Pokud používáte MIUI, možná budete muset extraktovat ty soubory z apk Shizuku nebo je stáhnout z GitHubu.</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Hledání párovací služby</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Prosím pamatujte, levá strana možnosti \\\"Bezdrátové ladění\\\" se dá rozkliknout, což otevře novou stranu. Pouhé přepnutí přepínače napravo je nesprávné.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-da/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_adb_discovery\">Nach kabellosem Debugging-Dienst suchen</string>\n    <string name=\"home_wireless_adb_title\">Über Wireless-Debugging starten</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Senden</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopieren</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Es gibt noch einige andere Überlegungen, bitte vergewissern, dass Sie zuerst die Hilfe gelesen haben.</string>\n    <string name=\"home_adb_button_view_command\">Befehl anzeigen</string>\n    <string name=\"home_adb_description\">Bei Geräten ohne Root müssen Sie adb verwenden, um Shizuku zu starten (erfordert Computerverbindung). Dieser Vorgang muss bei jedem Neustart des Geräts wiederholt werden. Bitte <b><a href=\"%1$s\">die Hilfe lesen</a></b>.</string>\n    <string name=\"home_adb_button_view_help\">Hilfe lesen</string>\n    <string name=\"home_adb_title\">Verbindung mit dem Compter herstellen</string>\n    <string name=\"home_status_service_version_update\">Version %2$s, %1$s&lt;br&gt;Erneut starten, um auf Version %3$s zu aktualisieren</string>\n    <string name=\"home_status_service_version\">Version %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s wird nicht ausgeführt</string>\n    <string name=\"home_status_service_is_running\">%1$s läuft</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">ADB-Berechtigungen sind begrenzt</string>\n    <string name=\"about_view_source_code\">Quelltext auf %s anzeigen</string>\n    <string name=\"action_about\">Über</string>\n    <string name=\"action_stop\">Shizuku anhalten</string>\n    <string name=\"settings_black_night_theme_summary\">Das rein schwarze Thema verwenden, wenn der Nachtmodus aktiviert ist</string>\n    <string name=\"settings_black_night_theme\">Schwarzes Thema</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">%d autorisierte App</item>\n        <item quantity=\"other\">%d autorisierte Apps</item>\n    </plurals>\n    <string name=\"dialog_wireless_adb_not_enabled\">Kabelloses Debugging ist nicht aktiviert.\n\\nHinweis: Vor Android 11 ist für die Aktivierung des kabellosen Debugging eine Computerverbindung erforderlich.</string>\n    <string name=\"home_root_description\">Außerdem kann Shizuku beim Booten automatisch gestartet werden. Wenn nicht, überprüfen Sie bitte, ob Ihr System oder Tools von Drittanbietern Shizuku eingeschränkt haben.&lt;br&gt;Sie können auf %s verweisen.</string>\n    <string name=\"development_settings\">Entwickleroptionen</string>\n    <string name=\"adb_pairing_requires_multi_window\">Bitte zuerst in den Modus \\\"Geteilter Bildschirm\\\" (Mehrfenster) gehen.</string>\n    <string name=\"dialog_adb_discovery_message\">Bitte \\\"Wireless Debugging\\\" in den \\\"Entwickleroptionen\\\" aktivieren. \\\"Wireless Debugging\\\" wird automatisch deaktiviert, wenn sich das Netzwerk ändert.\n\\n\n\\nHinweis: \\\"Entwickleroptionen\\\" oder \\\"USB-Debugging\\\" nicht deaktivieren, sonst wird Shizuku gestoppt.</string>\n    <string name=\"grant_dialog_button_deny\">Verweigern</string>\n    <string name=\"grant_dialog_button_allow_always\">Immer zulassen</string>\n    <string name=\"permission_warning_template\"><b>%1$s</b> erlauben %2$s zu verwenden\\?</string>\n    <string name=\"translation_contributors\">\" \"</string>\n    <string name=\"notification_service_start_failed\">Shizuku-Dienst starten fehlgeschlagen.</string>\n    <string name=\"notification_channel_service_status\">Status des Dienststarts</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Es ist sehr wahrscheinlich, dass Ihr Gerätehersteller die Berechtigung von adb einschränkt. &lt;p&gt;Vielleicht finden Sie in &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;diesem Dokument&lt;/a&gt;&lt;/b&gt; eine Lösung für Ihr System.</string>\n    <string name=\"home_root_description_sui\">Wenn Sie Magisk verwenden, können Sie %1$s ausprobieren. Für Root-Nutzer wird es irgendwann Shizuku ersetzen. Beachten Sie, dass bestehende Apps ein wenig geändert werden müssen, um %2$s zu verwenden.</string>\n    <string name=\"adb_pairing\">Kopplung</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Shizuku öffnen</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s bittet um Legacy Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\">Legacy Shizuku ist seit März 2019 veraltet. Außerdem funktioniert Legacy Shizuku nicht auf neueren Android-Systemen.&lt;p&gt;Bitte bitten Sie den Entwickler von &lt;b&gt;%1$s&lt;/b&gt; es zu aktualisieren.</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; hat moderne Shizuku-Unterstützung, aber es fordert Legacy Shizuku an. Dies könnte daran liegen, dass Shizuku nicht läuft. Bitte in der Shizuku-App überprüfen.&lt;p&gt;Legacy Shizuku wird seit März 2019 nicht mehr unterstützt.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s unterstützt das moderne Shizuku nicht</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> wurde in Zwischenablage kopiert.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nwurde in Zwischenablage kopiert.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Browser starten nicht möglich</string>\n    <string name=\"start_with_root_failed\">Dienst starten nicht möglich, da keine Root-Rechte erteilt wurden oder das Gerät nicht gerootet ist.</string>\n    <string name=\"starter\">Starter</string>\n    <string name=\"permission_description\">Der App erlauben, Shizuku zu verwenden.</string>\n    <string name=\"permission_label\">Shizuku-Zugriff</string>\n    <string name=\"notification_working\">Läuft…</string>\n    <string name=\"notification_service_start_no_root\">Root-Rechte anfordern fehlgeschlagen.</string>\n    <string name=\"notification_service_starting\">Shizuku-Dienst startetet…</string>\n    <string name=\"dialog_stop_message\">Shizuku-Dienst wird angehalten.</string>\n    <string name=\"settings_translation\">An der Übersetzung mitarbeiten</string>\n    <string name=\"settings_translation_contributors\">Zur Übersetzung beigetragen</string>\n    <string name=\"settings_translation_summary\">Uns helfen, %s in Ihre Sprache zu übersetzen</string>\n    <string name=\"settings_start_on_boot_summary\">Bei gerooteten Geräten kann Shizuku beim Booten automatisch starten</string>\n    <string name=\"settings_start_on_boot\">Beim Hochfahren starten (Root)</string>\n    <string name=\"settings_startup\">Beim Starten</string>\n    <string name=\"settings_user_interface\">Aussehen</string>\n    <string name=\"settings_language\">Sprache</string>\n    <string name=\"settings_title\">Einstellungen</string>\n    <string name=\"app_management_item_summary_requires_root\">* erfordert, dass Shizuku mit Root läuft</string>\n    <string name=\"home_learn_more_description\">Lernen Sie, wie Apps mit Shizuku entwickelt werden</string>\n    <string name=\"home_learn_more_title\">Shizuku kennenlernen</string>\n    <string name=\"home_app_management_view_authorized_apps\">Tippen, um autorisierte Apps zu verwalten</string>\n    <string name=\"home_app_management_title\">App-Verwaltung</string>\n    <string name=\"home_root_button_restart\">Neustart</string>\n    <string name=\"home_root_button_start\">Start</string>\n    <string name=\"home_root_title\">Start (für gerootete Geräte)</string>\n    <string name=\"adb_pair_required\">Bitte zuerst den Kopplungschritt durchführen.</string>\n    <string name=\"adb_error_key_store\">Schlüssel für kabelloses Debugging kann nicht generiert werden.\n\\nDies kann daran liegen, dass der KeyStore-Mechanismus dieses Geräts defekt ist.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Der Kopplungsdialog muss immer sichtbar sein. Den Split-Screen Modus zu benutzen, ist der einzige Weg diese App und den Systemdialog zur selben Zeit sichtbar zu lassen.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Kopplungscode</string>\n    <string name=\"paring_code_is_wrong\">Kopplungscode ist falsch.</string>\n    <string name=\"dialog_adb_pairing_message\">Bitte die Kopplung mit den folgenden Schritten straten: \\\"Entwickleroptionen\\\" - \\\"Kabelloses Debugging\\\" - \\\"Gerät mit Pairing-Code koppeln\\\".\n\\n\n\\nNachdem der Kopplungsrozess gestartet wurde, können Sie den Pairing-Code eingeben.</string>\n    <string name=\"cannot_connect_port\">Verbindung zum kabellosen Debugging-Dienst nicht möglich.</string>\n    <string name=\"dialog_adb_pairing_discovery\">Nach Kopplungsdienst suchen</string>\n    <string name=\"dialog_adb_pairing_title\">Mit Gerät koppeln</string>\n    <string name=\"dialog_adb_invalid_port\">Port ist eine ganze Zahl zwischen 0 und 65536.</string>\n    <string name=\"terminal_tutorial_3\">Zum Schluss verschieben Sie die Dateien an einen Ort, auf den Ihre Terminal-App zugreifen kann, damit Sie mit %1$s Befehle über Shizuku ausführen können.</string>\n    <string name=\"terminal_tutorial_2_description\">Wenn Sie beispielsweise Shizuku in %1$s verwenden möchten, sollten Sie %2$s durch %3$s ersetzen (%4$s ist der Paketname von %1$s).</string>\n    <string name=\"terminal_tutorial_2\">Dann einen beliebigen Texteditor verwenden, um %1$s zu öffnen und zu bearbeiten.</string>\n    <string name=\"terminal_export_files\">Dateien exportieren</string>\n    <string name=\"terminal_tutorial_1_description\">Wenn es im ausgewählten Ordner Dateien mit demselben Namen gibt, werden diese gelöscht.\n\\n\n\\nDie Exportfunktion verwendet SAF (Storage Access Framework). Es wird berichtet, dass MIUI die Funktionen von SAF unterbricht. Wenn Sie MIUI verwenden, müssen Sie möglicherweise die Datei aus der apk von Shizuku extrahieren oder von GitHub herunterladen.</string>\n    <string name=\"terminal_tutorial_1\">Zuerst Dateien an einen beliebigen Ort exportieren. Sie werden zwei Dateien finden, %1$s und %2$s.</string>\n    <string name=\"home_terminal_description\">Befehle über Shizuku in Terminal-Apps ausführen, die Sie mögen</string>\n    <string name=\"home_terminal_title\">Shizuku in Terminal-Apps verwenden</string>\n    <string name=\"terminal_tutorial_3_description\">Einige Tipps: %1$s die Ausführungsberechtigung erteilen und zu %2$s hinzufügen, dann können Sie %1$s direkt verwenden.</string>\n    <string name=\"home_wireless_adb_description\">Unter Android 11 oder höher können Sie Wireless Debugging aktivieren und Shizuku direkt von Ihrem Gerät aus starten, ohne eine Verbindung zu einem Computer herzustellen.&lt;p&gt;Bitte zuerst die Schritt-für-Schritt-Anleitung ansehen.</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Kopplungsdienst gefunden</string>\n    <string name=\"adb_pairing_tutorial_title\">Shizuku mit Ihrem Gerät koppeln</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">\\\"Entwickleroptionen\\\" - \\\"Kabelloses Debugging\\\" wählen. Auf \\\"Gerät mit Pairing-Code koppeln\\\", ein sechsstelligen Code ist zusehen.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Code aus der Benachrichtigung eingeben, um die Kopplung abzuschließen.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Andernfalls können Sie den Kopplungscode möglicherweise nicht über die Meldung eingeben.</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Suche beenden</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Nach Kopplungsdienst suchen</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Erfolgreich gekoppelt</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Sie können den Shizuku-Dienst jetzt starten.</string>\n    <string name=\"notification_adb_pairing_failed_title\">Koppeln fehlgeschlagen</string>\n    <string name=\"notification_adb_pairing_retry\">Wiederholen</string>\n    <string name=\"notification_channel_adb_pairing\">Kabellose Debugging-Kopplung</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Kopplungscode eingeben</string>\n    <string name=\"notification_adb_pairing_working_title\">Koppeln läuft</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Eine Benachrichtigung von Shizuku wird Ihnen helfen, die Kopplung abzuschließen.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Vor Android 11 ist eine Verbindung zu einem Computer erforderlich, um Wireless Debugging zu aktivieren.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Schritt-für-Schritt-Anleitung</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">MIUI-Nutzer müssen in den Systemeinstellungen unter \\\"Benachrichtigung\\\" - \\\"Benachrichtigungsleiste\\\" möglicherweise den Benachrichtigungsstil auf \\\"Android\\\" umstellen.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Zurück zu Shizuku und Shizuku starten.</string>\n    <string name=\"rish_description\">Mit %1$s können Sie in jeder Terminal-App eine Verbindung zur Shell von Shizuku herstellen und mit ihr interagieren. &lt;p&gt;Zur detaillierten Verwendung von %1$s tippen, um das Dokument anzuzeigen.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Für den Kopplungssprozess müssen Sie mit einer Benachrichtigung von Shizuku interagieren. Bitte Shizuku erlauben, Benachrichtigungen zu posten.</string>\n    <string name=\"notification_settings\">Benachrichtigungsoptionen</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku muss auf das lokale Netzwerk zugreifen. Dies wird durch die Netzwerkberechtigung gesteuert.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Einige Systeme (z. B. MIUI) verbieten Apps den Netzwerkzugriff, wenn sie nicht sichtbar sind, selbst wenn die App standardmäßig einen Vordergrunddienst verwendet. Bitte auf solchen Systemen die Akku-Optimierungsfunktionen für Shizuku deaktivieren.</string>\n    <string name=\"settings_use_system_color\">Verwende Farbe des Systemdesigns</string>\n    <string name=\"home_adb_is_limited_description\">Ihr Gerätehersteller hat ADB-Berechtigungen eingeschränkt. Dadurch werden Apps, die Shizuku verwenden, nicht ordnungsgemäß funktionieren.\n\\n\n\\nMeist kann diese Einschränkung aufgehoben werden, wenn bestimmte Einstellungen in den \\\"Entwicklereinstellungen\\\" angepasst werden. Bitte lesen Sie die Hilfeseite, um mehr darüber zu erfahren.\n\\n\n\\nEventuell müssen Sie Shizuku neustarten, damit die Änderungen angewandt werden.</string>\n    <string name=\"home_adb_is_limited_title\">Sie müssen einen zusätzlichen Schritt durchführen</string>\n    <string name=\"home_app_management_empty\">Apps, die Shizuku angefordert oder deklariert haben, werden hier angezeigt.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Bitte beachte, dass der linke Teil der \\\"Wireless debugging\\\"-Option anklickbar ist; wird es angetippt öffnet es eine neue Seite. Lediglich den Schalter auf der rechten Seite umzulegen ist falsch.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Bitte versuche \\\"Wireless debugging\\\" aus- und einzuschalten, falls es weiterhin sucht.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-el/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"cannot_connect_port\">Δεν είναι δυνατή η σύνδεση με την υπηρεσία ασύρματου εντοπισμού σφαλμάτων.</string>\n    <string name=\"paring_code_is_wrong\">Ο κωδικός σύζευξης είναι εσφαλμένος.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Κωδικός σύζευξης</string>\n    <string name=\"dialog_adb_pairing_discovery\">Αναζήτηση για υπηρεσία σύζευξης</string>\n    <string name=\"dialog_adb_pairing_title\">Σύζευξη με συσκευή</string>\n    <string name=\"adb_pairing\">Σύζευξη</string>\n    <string name=\"dialog_adb_invalid_port\">Η θύρα είναι ένας ακέραιος αριθμός μεταξύ 1 και 65535.</string>\n    <string name=\"dialog_adb_discovery\">Αναζήτηση για υπηρεσία ασύρματου εντοπισμού σφαλμάτων</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Αναλυτικός οδηγός</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Πριν από το Android 11, είναι απαραίτητη η σύνδεση με έναν υπολογιστή για την ενεργοποίηση του ασύρματου εντοπισμού σφαλμάτων.</string>\n    <string name=\"home_adb_button_view_command\">Προβολή εντολής</string>\n    <string name=\"home_adb_button_view_help\">Ανάγνωση βοήθειας</string>\n    <string name=\"home_adb_description\">Για συσκευές χωρίς πρόσβαση root, πρέπει να χρησιμοποιήσετε το adb για την εκκίνηση του Shizuku (απαιτεί σύνδεση σε υπολογιστή). Αυτή η διαδικασία θα πρέπει να επαναλαμβάνεται κάθε φορά που επανεκκινείται η συσκευή. <b><a href=\"%1$s\">Διαβάστε τη βοήθεια</a></b>.</string>\n    <string name=\"home_adb_title\">Έναρξη μέσω σύνδεσης με υπολογιστή</string>\n    <string name=\"home_status_service_version_update\">Έκδοση %2$s, %1$s&lt;br&gt;Κάντε ξανά εκκίνηση για ενημέρωση στην έκδοση %3$s</string>\n    <string name=\"home_status_service_not_running\">Το %1$s δεν εκτελείται</string>\n    <string name=\"home_status_service_is_running\">Το %1$s εκτελείται</string>\n    <string name=\"dialog_adb_port\">Θύρα</string>\n    <string name=\"home_wireless_adb_title\">Έναρξη μέσω Ασύρματου εντοπισμού σφαλμάτων</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-enm/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-eo/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"settings_black_night_theme\">Nigra nokta etoso</string>\n    <string name=\"settings_user_interface\">Aspekto</string>\n    <string name=\"settings_language\">Lingvo</string>\n    <string name=\"settings_title\">Agordoj</string>\n    <string name=\"home_learn_more_title\">Lerni Shizuku</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Rajtigis %d aplikaĵon</item>\n        <item quantity=\"other\">Rajtigis %d aplikaĵojn</item>\n    </plurals>\n    <string name=\"home_root_button_start\">Komenci</string>\n    <string name=\"development_settings\">Programistaj opcioj</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Sendi</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopii</string>\n    <string name=\"home_adb_button_view_command\">Vidi komandon</string>\n    <string name=\"home_adb_button_view_help\">Legi helpon</string>\n    <string name=\"home_adb_title\">Konektu al komputilo por komenci</string>\n    <string name=\"home_status_service_version\">Versio %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s ne estas funkcianta</string>\n    <string name=\"home_status_service_is_running\">%1$s estas funkcianta</string>\n    <string name=\"translation_contributors\">JakubFabijan</string>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_adb_title\">Inicie conectándose a una computadora</string>\n    <string name=\"home_status_service_version_update\">Versión %2$s, %1$s&lt;br&gt;Inicie nuevamente para actualizar a la versión %3$s</string>\n    <string name=\"home_status_service_version\">Versión %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s no se está ejecutando</string>\n    <string name=\"home_status_service_is_running\">%1$s se está ejecutando</string>\n    <string name=\"translation_contributors\">NoelFeijooIglesias</string>\n    <string name=\"home_wireless_adb_description\">En Android 11 o superior, se puede habilitar Depuración inalámbrica e iniciar Shizuku directamente desde el dispositivo sin la necesidad de una computadora.&lt;p&gt;Por favor revisa la Guía paso a paso.</string>\n    <string name=\"home_adb_description\">Para dispositivos sin acceso root, se necesita ADB para ejecutar Shizuku (requiere conexión a una computadora). Este proceso debe repetirse cada vez que el dispositivo sea reiniciado.Favor <b><a href=\"%1$s\">leer la guía</a></b>.</string>\n    <string name=\"home_adb_button_view_help\">Leer ayuda</string>\n    <string name=\"home_adb_button_view_command\">Ver comando</string>\n    <string name=\"home_adb_dialog_view_command_message\">\"&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Existen  otras consideraciones, por favor confirme que ha leído antes la ayuda.\"</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copiar</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Enviar</string>\n    <string name=\"home_wireless_adb_title\">Iniciar vía Depuración inalámbrica</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Guía paso-a-paso</string>\n    <string name=\"dialog_adb_discovery\">Buscando servicio de depuración inalámbrica</string>\n    <string name=\"adb_pairing\">Emparejar</string>\n    <string name=\"home_root_title\">Iniciar (dispositivo rooteado)</string>\n    <string name=\"home_root_description_sui\">Si esta usando Magisk, puedes probar %1$s. Para usuarios de root, esto eventualmente reemplazará Shizuku. Nota, aplicaciones existentes necesitan cambiar un poco para usar %2$s.</string>\n    <string name=\"home_root_button_start\">Iniciar</string>\n    <string name=\"home_root_button_restart\">Reiniciar</string>\n    <string name=\"home_app_management_title\">Gestión de aplicaciones</string>\n    <string name=\"home_app_management_view_authorized_apps\">Toque para administrar aplicaciones autorizadas</string>\n    <string name=\"home_learn_more_description\">Aprende a desarrollar con Shizuku</string>\n    <string name=\"app_management_item_summary_requires_root\">* requiere que Shizuku se ejecute con root</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Es muy posible que el fabricante de su dispositivo haya limitado el permiso de ADB.&lt;p&gt;Puede que encuentre una solución para su sistema en &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;este documento&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"home_adb_is_limited_description\">El fabricante de su dispositivo ha restringido los permisos ADB y las aplicaciones que usan Shizuku no funcionarán correctamente.\n\\n\n\\nUsualmente, estas limitaciones pueden deshacerse con algunos ajustes en \\\"Opciones para desarrolladores\\\". Por favor lea la ayuda para mas detalles sobre como hacerlo.\n\\n\n\\nTal vez necesite reiniciar Shizuku para que la operación surta efecto.</string>\n    <string name=\"home_terminal_title\">Usar Shizuku en la consola de comandos</string>\n    <string name=\"home_terminal_description\">Ejecute comandos atravez de Shizuku en las aplicaciones de terminal que mas le gusten</string>\n    <string name=\"home_adb_is_limited_title\">Necesitas dar un paso más</string>\n    <string name=\"dialog_adb_pairing_title\">Emparejar con dispositivo</string>\n    <string name=\"dialog_adb_pairing_discovery\">Buscando servicio de emparejamiento</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Clave de emparejamiento</string>\n    <string name=\"paring_code_is_wrong\">Clave de emparejamiento errónea.</string>\n    <string name=\"cannot_connect_port\">No se pudo conectar al servicio de depuración inalámbrica.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Favor entre en modo de pantalla dividida (multiventana) primero.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">El sistema requiere que el dialogo de vinculación este siempre visible, el modo \\\"pantalla dividida\\\" es la única forma de tener visible esta aplicación y el dialogo del sistema visible al mismo tiempo.</string>\n    <string name=\"adb_error_key_store\">No fue posible generar la clave de la depuración inalámbrica.\n\\nEsto podría ser a causa de que el mecanismo de almacenamiento de claves (KeyStore) de este dispositivo este roto.</string>\n    <string name=\"adb_pair_required\">Por favor, ve al paso de emparejamiento primero.</string>\n    <string name=\"development_settings\">Opciones para desarrolladores</string>\n    <string name=\"notification_settings\">Opciones de notificación</string>\n    <string name=\"adb_pairing_tutorial_title\">Vincular Shizuku con tu dispositivo</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Entre en \\\"Opciones para desarrolladores\\\" - \\\"Depuración inalámbrica\\\". Toque en \\\"Vincular dispositivo con código de sincronización\\\", usted verá un código de seis dígitos.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Introduzca el código para completar el emparejamiento.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Usuarios de MIUI podrían necesitar cambiar el estilo de notificaciones por \\\"Android\\\" en \\\"Notificaciones\\\" - \\\"Barra de notificaciones\\\" dentro de los ajustes de sistema.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">De otra manera, tal vez no puedas introducir el código de vinculación en la notificación.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku necesita acceder a la red local. Esto es controlado por el permiso de acceso a la red.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Vuelva a Shizuku e inicielo.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Para versiones anteriores a Android 11, se necesita conectar a una computadora para habilitar la Depuración inalámbrica.</string>\n    <string name=\"dialog_adb_discovery_message\">Por favor activa \\\"Depuración inalámbrica\\\" en \\\"Opciones de Desarrollador\\\". \\\" Depuración inalámbrica\\\" se desactiva automáticamente cuando la red cambia.\n\\n\n\\nNota, no deshabilite las \\\"Opciones de Desarrollador\\\" o \\\"Depuración USB\\\", de lo contrario, Shizuku se detendrá.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Por favor, intente deshabilitar y volver a habilitar \\\"Depuración inalámbrica\\\" si es que no deja de seguir en búsqueda.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">La Depuración inalámbrica no esta habilitada.\n\\nNota, versiones anteriores a Android 11, para habilitar depuración inalámbrica, la conexión a una computadora es requerida.</string>\n    <string name=\"dialog_adb_pairing_message\">Por favor empiece el vinculamiento con los siguientes pasos: \\\"Opciones para desarrolladores\\\" - \\\"Depuración inalámbrica\\\" - \\\"Vincular dispositivo con código de sincronización\\\".\n\\n\n\\nDespués de que el proceso de vinculación empiece, usted podrá introducir el código de sincronización\\\".</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Una notificación de Shizuku te ayudará a completar la vinculación.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">El proceso de vinculación requiere que usted interactúe con las notificaciones de Shizuku. Por favor, permita que Shizuku pueda lanzar notificaciones.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Nótese que, la parte izquierda de la opción \\\"Depuración inalámbrica\\\" es cliqueable, si lo toca accederá a mas opciones. Solo tocar el interruptor de la derecha no es suficiente.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Algunos sistemas (como MIUI) deshabilitan el acceso a la red de aplicaciones cuando estas no están visibles, aún cuando estas usen servicios en segundo plano como estándar. Por favor deshabilite la Optimización de batería para Shizuku en estos sistemas.</string>\n    <string name=\"home_root_description\">Además, Shizuku puede iniciarse automáticamente al arrancar el sistema. Si no es así, por favor compruebe si su sistema o si herramientas de terceros no han restringido Shizuku. &lt;br&gt;Puede consultar en %s.</string>\n    <string name=\"home_learn_more_title\">Aprenda sobre Shizuku</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">El permiso de ADB es limitado</string>\n    <string name=\"settings_translation\">Participar en la traducción</string>\n    <string name=\"settings_translation_contributors\">Colaboradores de la traducción</string>\n    <string name=\"settings_black_night_theme_summary\">Use el tema Noche cerrada si el modo nocturno está habilitado</string>\n    <string name=\"settings_black_night_theme\">Tema Noche cerrada</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"rish_description\">Con %1$s, en cualquier consola de comandos , puede conectarse e interactuar con el shell que ejecuta Shizuku. &lt;p&gt;Acerca del uso detallado %1$s, toque para ver el documento.</string>\n    <string name=\"terminal_tutorial_1_description\">Si hay archivos con el mismo nombre en la carpeta seleccionada, se eliminarán.\n\\n La función de exportación utiliza SAF (Storage Access Framework). Se informa que MIUI rompe las funciones de SAF. Si está utilizando MIUI, es posible que deba extraer el archivo de la aplicación de Shizuku o descargarlo de GitHub.</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Abrir Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; tiene compatibilidad moderna con Shizuku, pero solicita Shizuku heredada. Esto podría deberse a que Shizuku no se está ejecutando, verifique en la aplicación Shizuku. &lt;p&gt; Legacy Shizuku está obsoleto desde marzo de 2019.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s está solicitando el legado de Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\">Legacy Shizuku ha quedado obsoleto desde marzo de 2019. Además, Legacy Shizuku no funciona en los sistemas Android más nuevos.&lt;p&gt;Pida al desarrollador de &lt;b&gt;%1$s&lt;/b&gt; que actualice.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s no soporta Shizuku moderno</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b>fue copiado al blog de notas.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nse copió en clipboard.</string>\n    <string name=\"dialog_cannot_open_browser_title\">No se puede iniciar el explorador</string>\n    <string name=\"start_with_root_failed\">No es posible iniciar el servicio porque no tienes permisos de root o este dispositivo no está rooteado.</string>\n    <string name=\"starter\">Arrancador</string>\n    <string name=\"grant_dialog_button_deny\">Denegar</string>\n    <string name=\"grant_dialog_button_allow_always\">Permitir siempre</string>\n    <string name=\"permission_warning_template\">Permitir <b>%1$s</b> en %2$s\\?</string>\n    <string name=\"permission_description\">Permitir que la aplicación use Shizuku.</string>\n    <string name=\"permission_label\">acceso Shizuku</string>\n    <string name=\"notification_adb_pairing_retry\">Reintentar</string>\n    <string name=\"notification_adb_pairing_failed_title\">Fallo de emparejamiento</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Puede iniciar el servicio Shizuku ahora.</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Emparejado completo</string>\n    <string name=\"notification_adb_pairing_working_title\">Emparejamiento en proceso</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Detener búsqueda</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Encontrado servicios de emparejamiento</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Buscando servicios de emparejamiento</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Introducir el código de emparejamiento</string>\n    <string name=\"notification_channel_adb_pairing\">Emparejamiento de depuración inalámbrica</string>\n    <string name=\"notification_working\">En proceso…</string>\n    <string name=\"notification_service_start_no_root\">Fallo al pedir permisos root.</string>\n    <string name=\"notification_service_start_failed\">El inicio del servicio Shizuku a fallado.</string>\n    <string name=\"notification_service_starting\">El servicio Shizuku está iniciandose…</string>\n    <string name=\"notification_channel_service_status\">Estado de inicio del servicio</string>\n    <string name=\"dialog_stop_message\">El servicio Shizuku se detendrá.</string>\n    <string name=\"action_stop\">Detener Shizuku</string>\n    <string name=\"about_view_source_code\">Ver código fuente en %s</string>\n    <string name=\"action_about\">Acerca de</string>\n    <string name=\"settings_use_system_color\">Usar el color del tema del sistema</string>\n    <string name=\"settings_start_on_boot_summary\">Para dispositivos rooteados, Shizuku puede iniciarse automáticamente en el arranque</string>\n    <string name=\"settings_start_on_boot\">Iniciar en el arranque (root)</string>\n    <string name=\"settings_translation_summary\">Ayúdanos a traducir %s a tu idioma</string>\n    <string name=\"settings_startup\">Empezando</string>\n    <string name=\"settings_user_interface\">Apariencia</string>\n    <string name=\"settings_language\">Idioma</string>\n    <string name=\"terminal_tutorial_3_description\">Algunos consejos: otorgue permiso de ejecución a %1$s y agréguelo a %2$s, podrá usar %1$s directamente.</string>\n    <string name=\"terminal_tutorial_3\">Finalmente, mueva los archivos a algún lugar donde su aplicación de terminal pueda acceder, podrá usar %1$s para ejecutar comandos a través de Shizuku.</string>\n    <string name=\"terminal_tutorial_2_description\">Por ejemplo, si desea usar Shizuku en %1$s, debe reemplazar %2$s con %3$s (%4$s es el nombre del paquete de %1$s).</string>\n    <string name=\"terminal_tutorial_2\">Luego, use cualquier editor de texto para abrir y editar %1$s.</string>\n    <string name=\"terminal_export_files\">Exportar archivos</string>\n    <string name=\"terminal_tutorial_1\">Primero, exporte archivos a cualquier lugar que desee. Encontrará dos archivos, %1$s y %2$s.</string>\n    <string name=\"home_app_management_empty\">Las aplicaciones que han solicitado o declarado Shizuku se mostrarán aquí.</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Autorizado el %d de la aplicacion</item>\n        <item quantity=\"many\">Autorizadas %d aplicaciones</item>\n        <item quantity=\"other\">Autorizadas %d aplicaciones</item>\n    </plurals>\n    <string name=\"dialog_adb_invalid_port\">Puerto es un número del 1 al 65535.</string>\n    <string name=\"dialog_adb_port\">Puerto</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-es-rCL/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_wireless_adb_title\">Iniciar desde depuración inalámbrica</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Enviar</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copiar</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Esto tiene otras consideraciones, por favor confirme que ha leído la información de ayuda primero.</string>\n    <string name=\"home_adb_button_view_help\">Ver ayuda</string>\n    <string name=\"home_adb_button_view_command\">Ver comando</string>\n    <string name=\"home_adb_description\">Para dispositivos sin root, usted necesita ADB para ejecutar Shizuku (requiere una conexión a un ordenador). Este proceso se debe repetir cada vez que el dispositivo sea reiniciando. &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;obtener más ayuda&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"home_status_service_version\">Versión %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s no está activo</string>\n    <string name=\"home_status_service_is_running\">%1$s está activo</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Abrir Shizuku</string>\n    <string name=\"action_about\">Acerca de</string>\n    <string name=\"development_settings\">Opciones de desarrollador</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">El sistema requiere que el cuadro de diálogo de emparejamiento esté siempre visible, el uso del modo de pantalla dividida es la única forma de permitir que esta aplicación y el cuadro de diálogo del sistema estén visibles al mismo tiempo.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Ingrese primero al modo de pantalla dividida (ventanas múltiples).</string>\n    <string name=\"dialog_adb_invalid_port\">El puerto es un número entero comprendido entre 1 y 65535.</string>\n    <string name=\"dialog_adb_port\">Puerto</string>\n    <string name=\"dialog_adb_discovery\">Buscando servicio de depuración inalámbrica</string>\n    <string name=\"home_adb_title\">Empiece por conectarse a su computador</string>\n    <string name=\"translation_contributors\">—Peter Cuevas</string>\n    <string name=\"home_status_service_version_update\">Versión %2$s, %1$s&lt;br&gt;Reinicie para actualizar a la versión %3$s</string>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-et/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_adb_dialog_view_command_button_send\">Saada</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopeeri</string>\n    <string name=\"home_status_service_version\">Versioon %2$s, %1$s</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\" translatable=\"false\">Shizuku</string>\n    <!-- To translators: you can leave your here -->\n    <string name=\"translation_contributors\">@Fardin_Ahmadyy</string>\n    <!-- Home - Status -->\n    <string name=\"home_status_service_is_running\">%1$s در حال اجرا است</string>\n    <string name=\"home_status_service_not_running\">%1$s در حال اجرا نیست</string>\n    <string name=\"home_status_service_version\">نسخه %2$s، %1$s</string>\n    <string name=\"home_status_service_version_update\"><![CDATA[نسخه %2$s، %1$s<br>برای به‌روزرسانی به نسخه %3$s برنامه را راه‌اندازی مجدد نمایید]]></string>\n    <!-- Home - Adb -->\n    <string name=\"home_adb_title\"><![CDATA[با اتصال به رایانه شروع کنید]]></string>\n    <string name=\"home_adb_description\"><![CDATA[برای دستگاه‌های بدون دسترسی ریشه (روت)، باید از adb برای راه‌اندازی Shizuku استفاده کنید (نیاز به اتصال به رایانه دارد). این فرآیند باید هر بار که دستگاه راه اندازی مجدد می شود تکرار شود. لطفاً <b><a href=\\\"%1$s\\\">راهنما را بخوانید</a></b>.]]></string>\n    <string name=\"home_adb_button_view_help\">خواندن راهنما</string>\n    <string name=\"home_adb_button_view_command\">مشاهده دستور</string>\n    <string name=\"home_adb_dialog_view_command_message\"><![CDATA[<font face=\"monospace\">%1$s</font><br><br>* ملاحظات دیگری نیز وجود دارد، لطفاً تأیید کنید که ابتدا راهنما را خوانده اید.]]></string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">رونوشت</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">ارسال</string>\n    <!-- Home - Wireless Adb -->\n    <string name=\"home_wireless_adb_title\"><![CDATA[از طریق اشکال زدایی بی‌سیم شروع کنید]]></string>\n    <string name=\"home_wireless_adb_description\"><![CDATA[در اندروید ۱۱ یا بالاتر، می‌توانید اشکال‌زدایی بی‌سیم را فعال کنید و Shizuku را مستقیماً از دستگاه خود بدون اتصال به رایانه شروع کنید.<p>لطفاً ابتدا راهنمای گام به گام را مطالعه کنید.]]></string>\n    <string name=\"home_wireless_adb_description_pre_11\"><![CDATA[قبل از اندروید ۱۱، برای فعال کردن اشکال‌زدایی بی‌سیم، اتصال به رایانه لازم است.]]></string>\n    <string name=\"home_wireless_adb_view_guide_button\">راهنمای گام به گام</string>\n    <!-- Adb -->\n    <string name=\"dialog_adb_discovery\">جستجوی خدمات اشکال زدایی بی‌سیم</string>\n    <string name=\"dialog_adb_discovery_message\">لطفاً \\\"اشکال‌زدایی بی‌سیم\\\" را در \\\"گزینه‌های توسعه دهنده\\\" فعال کنید. وقتی شبکه تغییر می‌کند، \\\"اشکال‌زدایی بی‌سیم\\\" به‌طور خودکار غیرفعال می‌شود.\\n\\nتوجه داشته باشید، \\\"گزینه‌های توسعه دهنده\\\" یا \\\"اشکال‌زدایی USB\\\" را غیرفعال نکنید، در غیر این صورت Shizuku متوقف خواهد شد.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">لطفاً در صورتی که به جستجو ادامه داد \\\"اشکال‌زدایی بی‌سیم\\\" را غیرفعال و فعال کنید.</string>\n    <string name=\"dialog_adb_port\">درگاه</string>\n    <string name=\"dialog_adb_invalid_port\">درگاه یک عدد صحیح از ۱ تا ۶۵۵۳۵ است.</string>\n    <string name=\"adb_pairing\">مرتبط کردن</string>\n    <string name=\"dialog_adb_pairing_title\">مرتبط کردن با دستگاه</string>\n    <string name=\"dialog_adb_pairing_discovery\">جستجوی خدمات مرتبط کردن</string>\n    <string name=\"dialog_adb_pairing_paring_code\">رمز مرتبط کردن</string>\n    <string name=\"paring_code_is_wrong\">رمز مرتبط کردن اشتباه است.</string>\n    <string name=\"cannot_connect_port\">نمی توان به خدمات اشکال زدایی بی‌سیم متصل شد.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">اشکال‌زدایی بی‌سیم فعال نیست.\\nتوجه داشته باشید، قبل از اندروید ۱۱، برای فعال کردن اشکال‌زدایی بی‌سیم، اتصال به رایانه ضروری است.</string>\n    <string name=\"dialog_adb_pairing_message\">لطفاً مرتبط کردن را با مراحل زیر شروع کنید: \\\"گزینه‌های توسعه دهنده\\\" - \\\"اشکال‌زدایی بی‌سیم\\\" - \\\"مرتبط کردن دستگاه با استفاده از رمز مرتبط سازی\\\".\\n\\nپس از شروع فرآیند جفت‌سازی، می‌توانید رمز جفت‌سازی را وارد کنید.</string>\n    <string name=\"adb_pairing_requires_multi_window\">لطفاً ابتدا وارد حالت تقسیم صفحه (چند پنجره) شوید.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">دستگاه نیاز دارد گفتگوی جفت‌سازی همیشه قابل مشاهده باشد، استفاده از حالت تقسیم صفحه تنها راهی است که به این برنامه و گفتگوی دستگاه اجازه می‌دهد همزمان قابل مشاهده باشند.</string>\n    <string name=\"adb_error_key_store\">قادر به تولید کلید برای اشکال زدایی بی‌سیم نیست.\\nاین ممکن است به این دلیل باشد که ساز و برگ KeyStore این دستگاه خراب است.</string>\n    <string name=\"adb_pair_required\">لطفاً ابتدا مرحله مرتبط کردن را طی کنید.</string>\n    <string name=\"development_settings\">گزینه های توسعه دهنده</string>\n    <string name=\"notification_settings\">گزینه های اعلان</string>\n    <string name=\"adb_pairing_tutorial_title\">برنامه Shizuku را با دستگاه خود مرتبط کنید</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">یک اعلان از Shizuku به شما امکان می دهد مرتبط کردن را تکمیل کنید.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">وارد \\\"گزینه‌های توسعه دهنده\\\" - \\\"اشکال‌زدایی بی‌سیم\\\" شوید.  روی \\\"مرتبط کردن دستگاه با رمز مرتبط‌سازی\\\" ضربه بزنید، یک رمز شش رقمی خواهید دید.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">برای تکمیل مرتبط سازی، رمز شش رقمی را در اعلان وارد کنید.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">فرآیند مرتبط شدن به شما نیاز دارد که با اعلان Shizuku تعامل داشته باشید. لطفاً به Shizuku اجازه دهید تا اعلان‌ها را ارسال کند.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">کاربران MIUI ممکن است نیاز داشته باشند که در تنظیمات دستگاه، سبک اعلان را به \\\"اندروید\\\" از \\\"اعلان ها\\\" - \\\"سایه اعلان\\\" تغییر دهند.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">در غیر این صورت، ممکن است نتوانید رمز مرتبط سازی را از اعلان وارد کنید.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">لطفاً توجه داشته باشید، قسمت سمت راست گزینه \\\"اشکال زدایی بی‌سیم\\\" قابل لمس است، با ضربه زدن روی آن صفحه جدیدی باز می شود. فقط روشن کردن دکمه سمت چپ کافی نیست.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">به Shizuku برگردید و Shizuku را راه‌اندازی کنید.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">برنامه Shizuku نیاز به دسترسی به شبکه محلی دارد. زیرا توسط مجوز شبکه مدیریت می شود.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">برخی از دستگاه ها (مانند MIUI) به برنامه‌ها اجازه دسترسی به شبکه را زمانی که قابل مشاهده نیستند، نمی‌دهند، حتی اگر برنامه از خدمات پیش‌زمینه به‌عنوان استاندارد استفاده کند. لطفاً ویژگی‌های بهینه‌سازی باتری را برای Shizuku در چنین دستگاه‌هایی غیرفعال کنید.</string>\n    <!-- Home - Root -->\n    <string name=\"home_root_title\"><![CDATA[راه‌اندازی (برای دستگاه‌هایی با دسترسی ریشه)]]></string>\n    <string name=\"home_root_description\"><![CDATA[علاوه بر این، Shizuku می تواند به طور خودکار هنگام راه‌اندازی دستگاه راه اندازی شود. اگر نه، لطفاً بررسی کنید که آیا سیستم شما یا ابزارهای شخص ثالث Shizuku را محدود کرده است.<br>می توانید به %s مراجعه کنید.]]></string>\n    <string name=\"home_root_description_sui\"><![CDATA[اگر از Magisk استفاده می‌کنید، می‌توانید %1$s را امتحان کنید. برای کاربران دارای امتیازات ریشه، در نهایت جایگزین Shizuku خواهد شد. توجه داشته باشید، برنامه‌های موجود برای استفاده از %2$s باید کمی تغییر کنند.]]></string>\n    <string name=\"home_root_button_start\">راه‌اندازی</string>\n    <string name=\"home_root_button_restart\">راه‌اندازی مجدد</string>\n    <!-- Home - Application management -->\n    <string name=\"home_app_management_title\">مدیریت برنامه</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\"><![CDATA[%d برنامه مجاز]]></item>\n        <item quantity=\"other\"><![CDATA[%d برنامه مجاز]]></item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\"><![CDATA[برای مدیریت برنامه های مجاز ضربه بزنید]]></string>\n    <string name=\"home_app_management_empty\">برنامه‌هایی که Shizuku را درخواست کرده یا اعلام کرده‌اند در اینجا نشان داده می‌شوند.</string>\n    <!-- Home - Learn more -->\n    <string name=\"home_learn_more_title\">یادگیری Shizuku</string>\n    <string name=\"home_learn_more_description\">یاد بگیرید که چگونه با Shizuku توسعه دهید</string>\n    <!-- Home - Adb permissions limited -->\n    <string name=\"home_adb_is_limited_title\">شما باید یک قدم اضافی بردارید</string>\n    <string name=\"home_adb_is_limited_description\">سازنده دستگاه شما مجوزهای adb را محدود کرده است و برنامه هایی که از Shizuku استفاده می کنند به درستی کار نمی کنند.\\n\\nمعمولاً با تنظیم برخی از گزینه‌ها در \\\"گزینه‌های توسعه دهنده\\\" می‌توان این محدودیت را برطرف کرد. لطفاً راهنما را برای جزئیات نحوه انجام این کار بخوانید.\\n\\nشاید لازم باشد Shizuku را مجدداً راه اندازی کنید تا عملیات اجرایی شود.</string>\n    <!-- Application management -->\n    <string name=\"app_management_dialog_adb_is_limited_title\">مجوز adb محدود است</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\"><![CDATA[این احتمال وجود دارد که سازنده دستگاه شما مجوز adb را محدود کند.<p>ممکن است راه حلی برای دستگاه شما در <b><a href=\\\"%1$s\\\">این سند</a></b> وجود داشته باشد.]]></string>\n    <string name=\"app_management_item_summary_requires_root\">* نیاز دارد که Shizuku با امتیازات ریشه اجرا شود</string>\n    <!-- Terminal -->\n    <string name=\"home_terminal_title\">از Shizuku در برنامه های پایانه استفاده کنید</string>\n    <string name=\"home_terminal_description\">دستورات را از طریق Shizuku در برنامه های پایانه که دوست دارید اجرا کنید</string>\n    <string name=\"terminal_tutorial_1\">ابتدا پرونده ها را به هر جایی که می خواهید صادر کنید. دو پرونده %1$s و %2$s پیدا خواهید کرد.</string>\n    <string name=\"terminal_tutorial_1_description\">اگر پرونده هایی با همین نام در پوشه انتخاب شده وجود داشته باشد، حذف خواهند شد.\\n\\nتابع صادرات از SAF (چارچوب دسترسی ذخیره سازی) استفاده می کند. گزارش شده است که MIUI عملکردهای SAF را خراب می کند. اگر از MIUI استفاده می کنید، ممکن است مجبور شوید پرونده را از apk شیزوکو استخراج کنید یا از GitHub بارگیری کنید.</string>\n    <string name=\"terminal_export_files\">صادرات پرونده ها</string>\n    <string name=\"terminal_tutorial_2\">سپس، از هر ویرایشگر متنی برای باز کردن و ویرایش %1$s استفاده کنید.</string>\n    <string name=\"terminal_tutorial_2_description\">برای مثال، اگر می‌خواهید از Shizuku در %1$s استفاده کنید، باید %2$s را با %3$s جایگزین کنید (%4$s نام بسته %1$s است).</string>\n    <string name=\"terminal_tutorial_3\">در نهایت، پرونده ها را به جایی منتقل کنید که برنامه پایانه شما می تواند به آن دسترسی داشته باشد، می توانید از %1$s برای اجرای دستورات از طریق Shizuku استفاده کنید.</string>\n    <string name=\"terminal_tutorial_3_description\">چند نکته: به %1$s اجازه اجرا بدهید و آن را به %2$s اضافه کنید، می‌توانید مستقیماً از %1$s استفاده کنید.</string>\n    <string name=\"rish_description\"><![CDATA[\nبا %1$s، در هر برنامه پایانه‌ای، می‌توانید به پوسته‌ای که Shizuku اجرا می‌کند متصل شوید و با آن تعامل داشته باشید.\n<p>درباره استفاده دقیق %1$s، برای مشاهده سند ضربه بزنید.\n    ]]></string>\n    <!-- Settings -->\n    <string name=\"settings_title\">تنظیمات</string>\n    <string name=\"settings_language\">زبان</string>\n    <string name=\"settings_user_interface\">ظاهر</string>\n    <string name=\"settings_black_night_theme\">طرح زمینه شب سیاه</string>\n    <string name=\"settings_black_night_theme_summary\">اگر حالت شب فعال است از طرح زمینه سیاه خالص استفاده کنید</string>\n    <string name=\"settings_startup\">شروع به کار</string>\n    <string name=\"settings_translation_contributors\">مشارکت کنندگان ترجمه</string>\n    <string name=\"settings_translation\">در ترجمه شرکت کنید</string>\n    <string name=\"settings_translation_summary\">با ما همکاری کنید تا %s را به زبان شما ترجمه کنیم</string>\n    <string name=\"settings_start_on_boot\">شروع هنگام راه‌اندازی دستگاه (دسترسی ریشه)</string>\n    <string name=\"settings_start_on_boot_summary\">برای دستگاه های روت شده، Shizuku می تواند به طور خودکار در هنگام راه‌اندازی دستگاه شروع شود</string>\n    <string name=\"settings_use_system_color\">از رنگ طرح زمینه دستگاه استفاده کنید</string>\n    <!-- About -->\n    <string name=\"action_about\">درباره</string>\n    <string name=\"about_view_source_code\"><![CDATA[کد منبع را در %s مشاهده کنید]]></string>\n    <!-- Stop -->\n    <string name=\"action_stop\">توقف Shizuku</string>\n    <string name=\"dialog_stop_message\">خدمات Shizuku متوقف خواهد شد.</string>\n    <!-- Notification -->\n    <string name=\"notification_channel_service_status\">وضعیت شروع خدمات</string>\n    <string name=\"notification_service_starting\">خدمات Shizuku شروع می شود…</string>\n    <string name=\"notification_service_start_failed\">راه‌اندازی خدمات Shizuku ناموفق بود.</string>\n    <string name=\"notification_service_start_no_root\">درخواست مجوز دسترسی ریشه (روت) انجام نشد.</string>\n    <string name=\"notification_working\">در حال کار کردن…</string>\n    <string name=\"notification_channel_adb_pairing\">مرتبط سازی اشکال‌زدایی بی‌سیم</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">وارد کردن رمز مرتبط سازی</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">جستجوی خدمات مرتبط سازی</string>\n    <string name=\"notification_adb_pairing_service_found_title\">خدمات مرتبط سازی پیدا شد</string>\n    <string name=\"notification_adb_pairing_stop_searching\">توقف جستجو</string>\n    <string name=\"notification_adb_pairing_working_title\">مرتبط سازی در حال انجام است</string>\n    <string name=\"notification_adb_pairing_succeed_title\">مرتبط سازی با موفقیت انجام شد</string>\n    <string name=\"notification_adb_pairing_succeed_text\">اکنون می توانید خدمات Shizuku را راه اندازی کنید.</string>\n    <string name=\"notification_adb_pairing_failed_title\">مرتبط سازی انجام نشد</string>\n    <string name=\"notification_adb_pairing_retry\">سعی مجدد</string>\n    <!-- Permission related, appears in system permission UI -->\n    <string name=\"permission_group_label\" translatable=\"false\">Shizuku</string>\n    <string name=\"permission_group_description\" translatable=\"false\">@string/permission_label</string>\n    <string name=\"permission_label\">دسترسی Shizuku</string>\n    <string name=\"permission_description\">به برنامه اجازه دهید از Shizuku استفاده کند.</string>\n    <string name=\"permission_warning_template\"><![CDATA[اجازه <b>%1$s</b> برای %2$s؟]]></string>\n    <string name=\"grant_dialog_button_allow_always\">همیشه اجازه داده شود</string>\n    <string name=\"grant_dialog_button_deny\">\"رد\"</string>\n    <!-- Starter -->\n    <string name=\"starter\">شروع کننده</string>\n    <string name=\"starting_root_shell\" translatable=\"false\">در حال راه‌اندازی پوسته ریشه…</string>\n    <string name=\"start_with_root_failed\">نمی‌توان خدمات را راه‌اندازی کرد زیرا مجوز ریشه داده نشده است یا این دستگاه روت نشده است.</string>\n    <!-- Misc -->\n    <string name=\"dialog_cannot_open_browser_title\">نمی توان مرورگر را راه اندازی کرد</string>\n    <string name=\"toast_copied_to_clipboard\">%s\\nدر بریده‌دان رونوشت شده است.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><![CDATA[<b>%s</b> در بریده‌دان رونوشت شده است.]]></string>\n    <!-- Messages for legacy -->\n    <string name=\"dialog_legacy_not_support_title\">%1$s از شیزوکوی جدید پشتیبانی نمی کند</string>\n    <string name=\"dialog_legacy_not_support_message\"><![CDATA[شیزوکوی قدیمی از مارس ۲۰۱۹ منسوخ شده است. همچنین، Shizuku قدیمی در دستگاه‌های اندروید جدید کار نمی‌کند.<p>لطفاً از توسعه‌دهنده <b>%1$s</b> بخواهید که به‌روزرسانی کند.]]></string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s در حال درخواست Shizuku قدیمی است</string>\n    <string name=\"dialog_requesting_legacy_message\"><![CDATA[<b>%1$s</b> پشتیبانی نسخه جدید شیزوکو دارد، اما شیزوکو قدیمی را درخواست می‌کند. این ممکن است به این دلیل باشد که Shizuku در حال اجرا نیست، لطفاً در برنامه Shizuku بررسی کنید.<p>Shizuku قدیمی از مارس ۲۰۱۹ منسوخ شده است.]]></string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">باز کردن Shizuku</string>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-fi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-fil/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"terminal_tutorial_3_description\">Tip: bigyan ng pahintulot na ma-execute ang %1$s at idagdag ito sa %2$s, pwede mong direktang magamit ang %1$s.</string>\n    <string name=\"terminal_tutorial_3\">At, ilipat ang mga file sa kung saan ito pwedeng ma-access ng terminal app mo, magagamit mo ang %1$s para magpaandar ng mga utos papuntang Shizuku.</string>\n    <string name=\"terminal_tutorial_2_description\">Halimbawa, kung gusto mong gamitin ang Shizuku sa %1$s, dapat palitan mo ang %2$s ng %3$s (ang package name ng %1$s ay %4$s).</string>\n    <string name=\"terminal_tutorial_2\">Tapos, guamit ng anumang editor ng teksto para buksan at baguhin ang %1$s.</string>\n    <string name=\"terminal_export_files\">I-export ang mga file</string>\n    <string name=\"terminal_tutorial_1_description\">Mabubura ang mga file na may parehong pangalan sa folder na pipiliin mo.\n\\n\n\\nGinagamit ang SAF (Storage Access Framework) para ma-export ang file. Naiulat na hindi gumagana nang maayos ang SAF sa MIUI. Kung nasa MIUI ka, baka kailangan mong i-extract ang file mula sa apk ng Shizuku o i-download ito mula sa GitHub.</string>\n    <string name=\"terminal_tutorial_1\">Una, i-export ang mga file saan mo man gusto. May dalawa kang file na makikita, %1$s at %2$s.</string>\n    <string name=\"home_terminal_description\">Magpatakbo ng mga utos papuntang Shizuku gamit ang terminal app mo</string>\n    <string name=\"home_terminal_title\">Gamitin ang Shizuku sa mga terminal app</string>\n    <string name=\"app_management_item_summary_requires_root\">* kailangang patakbuhin ang Shizuku gamit ang root</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Posibleng nilimitahan ng gumawa ng device mo ang kakayahan ng adb.&lt;p&gt;Maaaring may solusyon para sa sistema mo sa &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;dokumentong ito&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Limitado ang pahintulot ng adb</string>\n    <string name=\"home_adb_is_limited_description\">Pinaghigpitan ng gumawa ng device mo ang kakayahan ng adb, kaya hindi gagana nang maayos ang mga app na gumagamit ng Shizuku.\n\\n\n\\nKadalasan, pwedeng matanggal ang mga paghihigpit na ito sa pamamagitan ng ilang mga pagbabago sa \\\"Mga opsyon ng developer\\\". Mangyaring sumangguni sa gabay para sa higit pang detalye kung paano ito gagawin.\n\\n\n\\nMaaaring kailanganin mong isara at buksan ulit ang Shizuku para umepekto ang opersayon.</string>\n    <string name=\"home_adb_is_limited_title\">May mga karagdagang hakbang kang dapat gawin</string>\n    <string name=\"home_learn_more_description\">Matuto kung paano mag-develop gamit ang Shizuku</string>\n    <string name=\"home_learn_more_title\">Matuto Pa Tungkol sa Shizuku</string>\n    <string name=\"home_app_management_empty\">Lalabas dito ang mga app na hiniling o idineklara ang Shizuku.</string>\n    <string name=\"home_app_management_view_authorized_apps\">Pindutin para pamahalaan ang mga awtorisadong app</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">%d aplikasyon ang awtorisado</item>\n        <item quantity=\"other\">%d na aplikasyon ang awtorisado</item>\n    </plurals>\n    <string name=\"home_app_management_title\">Pamamahala sa aplikasyon</string>\n    <string name=\"home_root_button_restart\">Simulan muli</string>\n    <string name=\"home_root_button_start\">Simulan</string>\n    <string name=\"home_root_description_sui\">Kung gumagamit ka ng Magisk, subukan mo ang %1$s. Para sa mga may root, dahan-dahan nitong papalitan ang Shizuku. Tandaan, may kaunting pagbabagong kakailanganin ang mga kasalukuyang app para gamitin ang %2$s.</string>\n    <string name=\"home_root_description\">Pwede ring awtomatikong masimulan ang Shizuku pagka-boot. Kung hindi, maaaring nilimitahan ng iyong sistema o ng third-party na kagamitan ang Shizuku.&lt;br&gt;Sumangguni sa %s.</string>\n    <string name=\"home_root_title\">Simulan (para sa mga device na may root)</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Sa ilang sistema (tulad ng MIUI), hindi maa-access ng mga app ang network kapag hindi sila nakikita, kahit gumagamit ang app ng pangkaraniwang foreground na serbisyo. Patayin ang pag-optimize ng baterya para sa Shizuku sa mga sistemang iyon.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Kailangang ma-access ng Shizuku ang lokal na network. Kinokontrol ito ng pahintulot sa network.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Bumalik sa Shizuku at simulan ang Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Tandaan, ang kaliwang bahagi ng \\\"Wireless na pag-debug\\\" ay napipindot, nagbubukas ito ng bagong pahina. Mali kung pipindutin mo lang ang switch sa kanan.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Kung hindi mo ito gagawin, maaaring hindi mo mailalagay ang code ng pagpapares sa notipikasyon.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Maaaring kailangan ng mga gumagamit ng MIUI na gawing \\\"Android\\\" ang estilo ng notipikasyon sa \\\"Notification\\\" - \\\"Notification shade\\\" sa system settings.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Kailangan mong makisalamuha sa isang notipikasyon mula sa Shizuku para makumpleto ang proseso sa pagpapares. Mangyaring payagan ang Shizuku na magpadala ng mga notipikasyon.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Ilagay ang code sa notipikasyon para makumpleto ang pagpapares.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Pumunta sa \\\"Mga opsyon ng developer\\\" - \\\"Wireless na pag-debug\\\". Pindutin ang \\\"Pinapares ang device gamit ang code ng pagpapares\\\", may anim-na-numerong code kang makikita.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Tutulungan ka ng isang notipikasyon mula sa Shizuku na tapusin ang pagpapares.</string>\n    <string name=\"adb_pairing_tutorial_title\">Ipares ang Shizuku sa device mo</string>\n    <string name=\"notification_settings\">Mga opsyon sa notipikasyon</string>\n    <string name=\"development_settings\">Mga opsyon ng developer</string>\n    <string name=\"adb_pair_required\">Sundin muna ang mga hakbang sa pagpapares.</string>\n    <string name=\"adb_error_key_store\">Hindi makagawa ng susi para sa wireless na pag-debug.\n\\nMaaaring sira ang mekanismo ng KeyStore ng device na ito.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Kailangan ng sistemang laging makita ang diyalogo ng pagpapares, kaya split-screen mode lang ang paraan para makita ang app na ito at ang diyalogo ng sistema nang sabay.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Pumunta muna sa split-screen (multi-window) mode.</string>\n    <string name=\"dialog_adb_pairing_message\">Mangyaring simulan ang pagpapares, pumunta sa: \\\"Mga opsyon ng developer\\\" - \\\"Wireless na pag-debug\\\" - \\\"Pinapares ang device gamit ang code ng pagpapares\\\".\n\\n\n\\nMailalagay mo ang code ng pagpapares pagkatapos magsimula ang proseso ng pagpapares.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Hindi nakabukas ang wireless na pag-debug.\n\\nTandaan, kailangang kumonekta sa kompyuter para mabuksan ang wireless na pag-debug sa Android 10 pababa.</string>\n    <string name=\"cannot_connect_port\">Hindi makakonekta sa serbisyo ng wireless na pag-debug.</string>\n    <string name=\"paring_code_is_wrong\">Mali ang code ng pagpapares.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Code ng pagpapares</string>\n    <string name=\"dialog_adb_pairing_discovery\">Hinahanap ang serbisyo ng pagpapares</string>\n    <string name=\"dialog_adb_pairing_title\">Makipagpares sa device</string>\n    <string name=\"adb_pairing\">Pagpapares</string>\n    <string name=\"dialog_adb_invalid_port\">Ang port ay isang integer mula 1 hanggang 65535.</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Mangyaring patayin at buksan ulit ang \\\"Wireless na pag-debug\\\" kung sige lang ito sa paghahanap.</string>\n    <string name=\"dialog_adb_discovery_message\">Buksan ang \\\"Wireless na pag-debug\\\" sa \\\"Mga opsyon ng developer\\\". Awtomatikong namamatay ang \\\"Wireless na pag-debug\\\" kapag may nagbago sa network.\n\\n\n\\nTandaan, huwag patayin ang \\\"Mga opsyon ng developer\\\" o \\\"Pag-debug ng USB\\\", mahihinto ang Shizuku.</string>\n    <string name=\"dialog_adb_discovery\">Hinahanap ang serbisyo ng wireless na pag-debug</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Hakbang-hakbang na gabay</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Kailangang kumonekta sa kompyuter para mabuksan ang Wireless na pag-debug sa Android 10 pababa.</string>\n    <string name=\"home_wireless_adb_description\">Pwede mong buksan ang Wireless na pag-debug at simulan ang Shizuku direkta sa iyong device nang hindi kumokonekta sa kompyuter sa Android 11 pataas.&lt;p&gt;Mangyaring sumangguni muna sa gabay.</string>\n    <string name=\"home_wireless_adb_title\">Simulan gamit ang Wireless na pag-debug</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Ipadala</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopyahin</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* May iba pang mga dapat ikonsidera, siguraduhin munang nabasa mo na ang gabay.</string>\n    <string name=\"home_adb_button_view_command\">Tingnan ang command</string>\n    <string name=\"home_adb_button_view_help\">Sumangguni sa gabay</string>\n    <string name=\"home_adb_description\">Kailangan mong gumamit ng adb para masimulan ang Shizuku kung walang root ang device mo (kailangang kumonekta sa kompyuter). Dapat ulitin ito tuwing nare-restart ang device mo. Mangyaring <b><a href=\"%1$s\">sumangguni sa gabay</a></b>.</string>\n    <string name=\"home_adb_title\">Magsimula sa pamamagitan ng pagkonekta sa kompyuter</string>\n    <string name=\"home_status_service_version_update\">Bersyon %2$s, %1$s&lt;br&gt;Simulan ulit para maka-update patungong bersyon %3$s</string>\n    <string name=\"home_status_service_version\">Bersyon %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">Hindi tumatakbo ang %1$s</string>\n    <string name=\"home_status_service_is_running\">Tumatakbo ang %1$s</string>\n    <string name=\"translation_contributors\">\\@Cyndaquissshhh (Hosted Weblate)</string>\n    <string name=\"notification_adb_pairing_failed_title\">Nagkaproblema sa pagpapares</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Masisimulan mo na ngayon ang serbisyo ng Shizuku.</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Matagumpay na nakapagpares</string>\n    <string name=\"notification_adb_pairing_working_title\">Kasalukuyang nagpapares</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Ihinto ang paghahanap</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Nakahanap ng serbisyo sa pagpapares</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Naghahanap ng serbisyo sa pagpapares</string>\n    <string name=\"notification_service_start_no_root\">Hindi nakakuha ng pahintulot sa root.</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Ilagay ang code ng pagpapares</string>\n    <string name=\"notification_channel_adb_pairing\">Pagpapares ng wireless na pag-debug</string>\n    <string name=\"notification_working\">Inaasikaso…</string>\n    <string name=\"notification_service_start_failed\">Nagkaproblema sa pagsisimula ng serbisyo ng Shizuku.</string>\n    <string name=\"notification_service_starting\">Nagsisimula ang serbisyo ng Shizuku…</string>\n    <string name=\"notification_channel_service_status\">Estado sa pagbubukas ng serbisyo</string>\n    <string name=\"dialog_stop_message\">Ihihinto ang serbisyo ng Shizuku.</string>\n    <string name=\"action_stop\">Ihinto ang Shizuku</string>\n    <string name=\"about_view_source_code\">Tingnan ang source code sa %s</string>\n    <string name=\"action_about\">Tungkol</string>\n    <string name=\"settings_use_system_color\">Gamitin ang kulay ng tema ng sistema</string>\n    <string name=\"settings_start_on_boot_summary\">Pwede itakdang tumakbo agad pagka-boot ang Shizuku sa mga naka-root na device</string>\n    <string name=\"settings_start_on_boot\">Buksan pagka-boot (root)</string>\n    <string name=\"settings_translation_summary\">Tulungan kaming isalin ang %s sa iyong wika</string>\n    <string name=\"settings_translation\">Sumali sa pagsasalin</string>\n    <string name=\"settings_translation_contributors\">Mga nag-ambag sa pagsasalin</string>\n    <string name=\"settings_startup\">Pagbukas</string>\n    <string name=\"settings_black_night_theme_summary\">Gamitin ang purong itim na tema kung nakabukas ang panggabing mode</string>\n    <string name=\"settings_black_night_theme\">Itim na panggabing tema</string>\n    <string name=\"settings_user_interface\">Hitsura</string>\n    <string name=\"settings_language\">Wika</string>\n    <string name=\"settings_title\">Mga Setting</string>\n    <string name=\"rish_description\">Gamit ang %1$s, makakakonekta ka sa shell ng Shizuku gamit ang anumang terminal app. &lt;p&gt;Pindutin para makita ang detalyadong impormasyon tungkol sa %1$s.</string>\n    <string name=\"grant_dialog_button_deny\">Tanggihan</string>\n    <string name=\"grant_dialog_button_allow_always\">Laging payagan</string>\n    <string name=\"permission_warning_template\">Payagan ang <b>%1$s</b> na %2$s\\?</string>\n    <string name=\"permission_description\">Payagan ang app na gamitin ang Shizuku.</string>\n    <string name=\"permission_label\">ma-access ang Shizuku</string>\n    <string name=\"notification_adb_pairing_retry\">Subukan ulit</string>\n    <string name=\"starter\">Panimula</string>\n    <string name=\"start_with_root_failed\">Hindi masimulan ang serbisyo sapagkat walang pahintulot sa root o hindi na-root ang device na ito.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Hindi mabuksan ang browser</string>\n    <string name=\"toast_copied_to_clipboard\">Nakopya sa clipboard ang\n\\n%s</string>\n    <string name=\"toast_copied_to_clipboard_with_text\">Nakopya ang <b>%s</b> sa clipboard.</string>\n    <string name=\"dialog_legacy_not_support_title\">Hindi sinusuportahan ng %1$s ang makabagong Shizuku (API v11+)</string>\n    <string name=\"dialog_legacy_not_support_message\">Inihinto na ang suporta sa makalumang Shizuku (API v10-). Hindi na rin gagana ang makalumang Shizuku sa mga mas bagong bersyon ng Android.&lt;p&gt;Mangyaring ipaalam sa may-akda ng &lt;b&gt;%1$s&lt;/b&gt; na kailangan na nitong mag-update.</string>\n    <string name=\"dialog_requesting_legacy_title\">Humihiling ng makalumang Shizuku ang %1$s</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Buksan ang Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">Suportado ng &lt;b&gt;%1$s&lt;/b&gt; ang makabagong Shizuku, pero humihiling ito nang makalumang Shizuku. Pakitingnan sa Shizuku app kung tumatakbo ba nang maayos ang Shizuku dahil baka ito ay dahil nagkakaproblema ang Shizuku.&lt;p&gt;Hindi na suportado ang makalumang Shizuku simula Marso 2019.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"translation_contributors\">tclement0922</string>\n    <string name=\"paring_code_is_wrong\">Le code d\\'association n\\'est pas le bon.</string>\n    <string name=\"dialog_adb_pairing_discovery\">Recherche du service d\\'association</string>\n    <string name=\"dialog_adb_pairing_title\">Associer avec l\\'appareil</string>\n    <string name=\"adb_pairing\">Association</string>\n    <string name=\"home_adb_description\">Pour les appareils sans root, vous avez besoin d\\'utiliser adb pour démarrer Shizuku (requiert la connexion à un ordinateur). Ce processus doit être répété à chaque fois que l\\'appareil est redémarré. Merci de <b><a href=\"%1$s\">lire l\\'aide</a></b>.</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Ouvrir Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; supporte les versions récentes de Shizuku, mais demande l\\'accès à l\\'ancien Shizuku. C\\'est peut être parce que Shizuku n\\'est pas en cours de fonctionnement, merci de vérifier dans l\\'appli Shizuku.&lt;p&gt;L\\'ancien Shizuku est obsolète depuis mars 2019.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s requiert l\\'ancien Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\">Les anciennes versions de Shizuku sont obsolètes depuis mars 2019. Aussi, elles ne fonctionnent pas sur les versions plus récentes d\\'Android.&lt;p&gt;Merci de demander au développeur de &lt;b&gt;%1$s&lt;/b&gt; de mettre à jour.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s ne supporte pas les versions plus récentes de Shizuku</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> a bien été copié dans le presse papier.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\na bien été copié dans le presse papier.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Impossible de lancer le navigateur</string>\n    <string name=\"start_with_root_failed\">Impossible de lancer le service parce que la permission root n\\'est pas accordée ou que cet appareil n\\'est pas rooté.</string>\n    <string name=\"starter\">Démarreur</string>\n    <string name=\"grant_dialog_button_deny\">Refuser</string>\n    <string name=\"grant_dialog_button_allow_always\">Autoriser tout le temps</string>\n    <string name=\"permission_warning_template\">Autoriser <b>%1$s</b> à %2$s \\?</string>\n    <string name=\"permission_description\">Autorise l\\'appli à utiliser Shizuku.</string>\n    <string name=\"permission_label\">accéder à Shizuku</string>\n    <string name=\"notification_adb_pairing_retry\">Réessayer</string>\n    <string name=\"notification_adb_pairing_failed_title\">L\\'association a échoué</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Vous pouvez démarrer le service de Shizuku maintenant.</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Association terminée</string>\n    <string name=\"notification_adb_pairing_working_title\">Association en cours</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Arrêter de chercher</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Service d\\'association trouvé</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Recherche du service d\\'association</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Entrer le code d\\'association</string>\n    <string name=\"notification_channel_adb_pairing\">Association du débogage sans fil</string>\n    <string name=\"notification_working\">Chargement…</string>\n    <string name=\"notification_service_start_no_root\">Impossible de demander la permission root.</string>\n    <string name=\"notification_service_start_failed\">Le démarrage du service de Shizuku a échoué.</string>\n    <string name=\"notification_service_starting\">Le service Shizuku démarre…</string>\n    <string name=\"notification_channel_service_status\">Statut du démarrage du service</string>\n    <string name=\"dialog_stop_message\">Le service Shizuku sera arrêté.</string>\n    <string name=\"action_stop\">Arrêter Shizuku</string>\n    <string name=\"about_view_source_code\">Voir le code source sur %s</string>\n    <string name=\"action_about\">À propos</string>\n    <string name=\"settings_start_on_boot_summary\">Pour les appareils rootés, Shizuku peut se lancer automatiquement au démarrage</string>\n    <string name=\"settings_start_on_boot\">Lancer au démarrage de l\\'appareil (root)</string>\n    <string name=\"settings_translation_summary\">Aidez-nous à traduire %s dans votre langue</string>\n    <string name=\"settings_translation\">Participer à la traduction</string>\n    <string name=\"settings_translation_contributors\">Contributeurs à la traduction</string>\n    <string name=\"settings_startup\">Démarrage</string>\n    <string name=\"settings_black_night_theme_summary\">Utilise le thème noir pur si le thème sombre est activé</string>\n    <string name=\"settings_black_night_theme\">Thème sombre noir</string>\n    <string name=\"settings_user_interface\">Apparence</string>\n    <string name=\"settings_language\">Langue</string>\n    <string name=\"settings_title\">Paramètres</string>\n    <string name=\"rish_description\">Avec %1$s, dans n\\'importe quelle appli de terminal, vous pouvez vous connecter et interagir avec le shell lancé par Shizuku. &lt;p&gt;À propos de l\\'usage détaillé de %1$s, appuyez pour voir le document.</string>\n    <string name=\"terminal_tutorial_3_description\">Quelques astuces : accordez la permission d\\'exécution à %1$s et ajoutez le au %2$s, vous pourrez utiliser %1$s directement.</string>\n    <string name=\"terminal_tutorial_3\">Enfin, déplacez les fichiers quelque part où votre appli de terminal a accès, vous pourrez utiliser %1$s pour exécuter des commandes à travers Shizuku.</string>\n    <string name=\"terminal_tutorial_2_description\">Par exemple, si vous voulez utiliser Shizuku dans %1$s, vous devriez remplacer %2$s par %3$s (%4$s est le nom de package de %1$s).</string>\n    <string name=\"terminal_tutorial_2\">Ensuite, utilisez un éditeur de texte pour ouvrir et éditer %1$s.</string>\n    <string name=\"terminal_export_files\">Exporter les fichiers</string>\n    <string name=\"terminal_tutorial_1_description\">Si il y a des fichiers avec le même nom dans le dossier sélectionné, ils seront supprimés.\n\\n\n\\nLa fonction exporter utilise le SAF (Framework d\\'Accès au Stockage). Nous savons que MIUI casse les fonctions du SAF. Si vous utilisez MIUI, vous pourriez devoir extraire les fichiers depuis l\\'apk de Shizuku ou les télécharger depuis GitHub.</string>\n    <string name=\"terminal_tutorial_1\">D\\'abord, exportez les fichiers oú vous voulez. Vous trouverez deux fichiers, %1$s et %2$s.</string>\n    <string name=\"home_terminal_description\">Exécuter des commandes à travers Shizuku dans les applis de terminal que vous aimez</string>\n    <string name=\"home_terminal_title\">Utiliser Shizuku dans les applis de terminal</string>\n    <string name=\"app_management_item_summary_requires_root\">* nécessite que Shizuku fonctionne avec le root</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Il est fortement possible que le fabricant de votre appareil limite la permission de adb.&lt;p&gt;Il pourrait avoir une solution pour votre système dans &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;ce document&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">La permission de adb est limitée</string>\n    <string name=\"home_learn_more_description\">Apprenez comment développer avec Shizuku</string>\n    <string name=\"home_learn_more_title\">Apprendre Shizuku</string>\n    <string name=\"home_app_management_view_authorized_apps\">Appuyez pour gérer les applis autorisées</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">%d application autorisée</item>\n        <item quantity=\"other\">%d applications autorisées</item>\n    </plurals>\n    <string name=\"home_app_management_title\">Gestion d\\'application</string>\n    <string name=\"home_root_button_restart\">Redémarrer</string>\n    <string name=\"home_root_button_start\">Démarrer</string>\n    <string name=\"home_root_description_sui\">Si vous utilisez Magisk, vous pouvez essayer %1$s. Pour les utilisateurs root, il pourrait éventuellement remplacer Shizuku. Note, les applications existantes nécessiteraient de changer un petit peu pour utiliser %2$s.</string>\n    <string name=\"home_root_description\">De plus, Shizuku peut être démarré automatiquement au démarrage. Si non, merci de vérifier si votre système ou un outil tiers a restreint Shizuku. &lt;br&gt;Vous pouvez vous référer à %s.</string>\n    <string name=\"home_root_title\">Démarrer (pour les appareils rootés)</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Retournez dans Shizuku et lancez le.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Les utilisateurs de MIUI pourraient devoir changer le style de notifications vers \\\"Android\\\" dans \\\"Notifications\\\" - \\\"Style de notification\\\" dans les paramètres système.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Le processus d\\'association requiert que vous interagissez avec une notification de Shizuku. Merci d\\'autoriser Shizuku à envoyer les notifications.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Entrez le code dans la notification pour compléter l\\'association.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Allez dans les \\\"Options pour les développeurs\\\" - \\\"Débogage sans fil\\\". Appuyez sur \\\"Associer l\\'appareil avec un code d\\'association\\\", vous verrez un code à six chiffres.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Une notification de Shizuku vous aidera à compléter l\\'association.</string>\n    <string name=\"adb_pairing_tutorial_title\">Associer Shizuku avec votre appareil</string>\n    <string name=\"notification_settings\">Options des notifications</string>\n    <string name=\"development_settings\">Options pour les développeurs</string>\n    <string name=\"adb_pair_required\">Merci d\\'aller à l\\'étape d\\'association d\\'abord.</string>\n    <string name=\"adb_error_key_store\">Impossible de générer une clé pour le débogage sans fil.\\nCela peut être dû au fait que le mécanisme du magasin de clés de l\\'appareil est cassé.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Le système nécessite que la fenêtre d\\'association soit toujours visible, l\\'utilisation du mode écran partagé est la seule manière de laisser cette appli et la fenêtre système visibles au même moment.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Merci d\\'activer le mode écran partagé (mode multi-fenêtres) d\\'abord.</string>\n    <string name=\"dialog_adb_pairing_message\">Merci de démarrer l\\'association en suivant les étapes suivantes : \\\"Options pour les développeurs\\\" - \\\"Débogage sans fil\\\" - \\\"Associer avec un code d\\'association\\\".\\n\\nAprès que le processus d\\'association ai démarré, vous serez capable d\\'entrer le code d\\'association.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Le débogage sans fil n\\'est pas activé.\\nNote, avant Android 11, pour activer le débogage sans fil, la connexion à un ordinateur est requise.</string>\n    <string name=\"cannot_connect_port\">Impossible de se connecter au service de débogage sans fil.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Code d\\'association</string>\n    <string name=\"dialog_adb_invalid_port\">Le port est un entier compris entre 1 et 65535.</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_discovery_message\">Merci d\\'activer \\\"Débogage sans fil\\\" dans les \\\"Options pour les développeurs\\\". Le paramètre \\\"Débogage sans fil\\\" est automatiquement désactivé quand la connexion réseau change.\\n\\nNote, ne pas désactiver les \\\"Options pour les développeurs\\\" ou le \\\"Débogage USB\\\", ou Shizuku sera arrêté.</string>\n    <string name=\"dialog_adb_discovery\">Recherche du service de débogage sans fil</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Guide étape par étape</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Avant Android 11, la connection à un ordinateur est requise pour activer le débogage sans fil.</string>\n    <string name=\"home_wireless_adb_description\">Sur Android 11 ou supérieur, vous pouvez activer le débogage sans fil et démarrer Shizuku directement depuis votre appareil, sans le connecter à un ordinateur.&lt;p&gt;Merci de lire le guide étape par étape d\\'abord.</string>\n    <string name=\"home_wireless_adb_title\">Démarrer par débogage sans fil</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Envoyer</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copier</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Il y a quelques autres considérations, merci de confirmer que vous avez lu l\\'aide d\\'abord.</string>\n    <string name=\"home_adb_button_view_command\">Voir la commande</string>\n    <string name=\"home_adb_button_view_help\">Lire l\\'aide</string>\n    <string name=\"home_status_service_is_running\">%1$s est en cours de fonctionnement</string>\n    <string name=\"home_status_service_not_running\">%1$s est arrêté</string>\n    <string name=\"home_status_service_version\">Version %2$s, %1$s</string>\n    <string name=\"home_status_service_version_update\">Version %2$s, %1$s&lt;br&gt;Relancez pour mettre à jour vers la version %3$s</string>\n    <string name=\"home_adb_title\">Démarrer par connection à un ordinateur</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Sinon, vous ne pourrez peut-être pas saisir le code d\\'association depuis la notification.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku requiert l\\'accès au réseau local. C\\'est contrôlé par l\\'autorisation réseau.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Certains systèmes (tels que MIUI) interdisent aux applis d\\'accéder au réseau quand elles ne sont pas visibles, même si l\\'appli utilise un service de premier plan comme standard. Merci de désactiver l\\'optimisation de la batterie pour Shizuku sur de tels systèmes.</string>\n    <string name=\"settings_use_system_color\">Utiliser la couleur du thème système</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Veuillez noter que la partie gauche de l\\'option \\\"Débogage sans fil\\\" est clickable, la tapper va ouvrir une nouvelle page. Seulement activer le commutateur à droite est incorrect.</string>\n    <string name=\"home_adb_is_limited_description\">Le fabricant de votre appareil a restreint les permissions adb et les applis utilisant Shizuku ne fonctionneront pas bien.\n\\n\n\\nGénéralement, cette limitation peut être levée en ajustant certaines options dans les \\\"Options développeur\\\". Merci de lire l\\'aide pour des détails sur la façon de procéder.\n\\n\n\\nVous devrez sûrement redémarrer Shizuku pour que l\\'opération prenne effet.</string>\n    <string name=\"home_adb_is_limited_title\">Une étape supplémentaire est nécessaire</string>\n    <string name=\"home_app_management_empty\">Les applications qui ont demandé ou déclaré l\\'accès à Shizuku apparaîtront ici.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Merci d\\'essayer de désactiver et de réactiver le \\\"Débogage sans-fil\\\" si ça continue à chercher.</string>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-he/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_adb_button_view_command\">הצג פקודה</string>\n    <string name=\"home_adb_button_view_help\">קראו את דפי העזרה</string>\n    <string name=\"home_adb_description\">עבור מכשירים ללא גישת שורש, עליך להשתמש ב-adb כדי להתחיל את Shizuku (נדרש חיבור למחשב). \\u0020עליך לחזור על תהליך זה בכל פעם שמכשירך יופעל מחדש. בבקשה <b> <a href=\"%1$s\">קראו את דפי העזרה</a></b>.</string>\n    <string name=\"home_adb_title\">התחל באמצעות חיבור למחשב</string>\n    <string name=\"home_status_service_version_update\">גירסה %2$s, %1$s&lt;br&gt;התחל מחדש כדי לעדכן לגירסה %3$s</string>\n    <string name=\"home_status_service_version\">גירסה %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s לא רץ</string>\n    <string name=\"home_status_service_is_running\">%1$s פועל</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* יש עדין שיקולים אחרים, בבקשה תאשר שקראת את העזרה לפני.</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">שלח</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">העתק</string>\n    <string name=\"home_wireless_adb_description\">באנדרואיד 11 ומעלה, אתם יכולים להפעיל ניפוי באגים אלחוטי ולהתחיל את Shizuku ישירות מהמכשיר שלכם, ללא חיבור למחשב. קודם כל, הביטו בבקשה במדריך.</string>\n    <string name=\"home_wireless_adb_title\">התחל עם ניפוי באגים אלחוטי</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-hi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-hr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-hu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\" translatable=\"false\">Shizuku HU</string>\n    <!-- To translators: you can leave your here -->\n    <string name=\"translation_contributors\">gidano - sympda.blog.hu</string>\n    <!-- Home - Status -->\n    <string name=\"home_status_service_is_running\">A %1$s fut</string>\n    <string name=\"home_status_service_not_running\">A %1$s nem fut</string>\n    <string name=\"home_status_service_version\">Verzió %2$s, %1$s</string>\n    <string name=\"home_status_service_version_update\"><![CDATA[Verzió %2$s, %1$s<br>Kezdje újra a %3$s verzióra való frissítéshez]]></string>\n    <!-- Home - Adb -->\n    <string name=\"home_adb_title\"><![CDATA[Kezdje a számítógéphez való csatlakozással]]></string>\n    <string name=\"home_adb_description\"><![CDATA[Root nélküli eszközök esetén az adb-t kell használnia a Shizuku elindításához (számítógépes kapcsolat szükséges). Ezt a folyamatot minden alkalommal meg kell ismételni az eszköz újraindításakor. Kérem <b><a href=\\\"%1$s\\\">olvassa el a súgót</a></b>.]]></string>\n    <string name=\"home_adb_button_view_help\">Olvassa el a súgót</string>\n    <string name=\"home_adb_button_view_command\">Parancs megtekintés</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Vannak más szempontok is, kérjük erősítse meg, hogy először elolvasta a súgót.</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Másolás</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Küldés</string>\n    <!-- Home - Wireless Adb -->\n    <string name=\"home_wireless_adb_title\"><![CDATA[Kezdje a vezeték nélküli hibakereséssel]]></string>\n    <string name=\"home_wireless_adb_description\"><![CDATA[Android 11 vagy újabb rendszeren engedélyezheti a vezeték nélküli hibakeresést, és közvetlenül az eszközéről indíthatja el a Shizukut, anélkül, hogy számítógéphez csatlakozna..<p>Először tekintse meg a lépésről lépésre szóló útmutatót.]]></string>\n    <string name=\"home_wireless_adb_description_pre_11\"><![CDATA[Az Android 11 előtt a vezeték nélküli hibakeresés engedélyezéséhez csatlakozni kell egy számítógéphez.]]></string>\n    <string name=\"home_wireless_adb_view_guide_button\">Lépésről-lépésre útmutató</string>\n    <!-- Adb -->\n    <string name=\"dialog_adb_discovery\">Vezeték nélküli hibakereső szolgáltatás keresése</string>\n    <string name=\"dialog_adb_discovery_message\">Engedélyezze a \\\"Vezeték nélküli hibakeresés\\\"t a \\\"Fejlesztői lehetőségek\\\"nél. A \\\"Vezeték nélküli hibakeresés\\\" hálózatváltáskor auto. le van tiltva.\\n\\nMegj.: ne tiltsa le a \\\"Fejlesztői lehetőségek\\\"et vagy az \\\"USB hibakeresés\\\"t, ekkor a Shizuku le fog állni.</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_invalid_port\">A port egy 1 és 65535 közötti egész szám.</string>\n    <string name=\"adb_pairing\">Párosítás</string>\n    <string name=\"dialog_adb_pairing_title\">Párosítás a készülékkel</string>\n    <string name=\"dialog_adb_pairing_discovery\">Párosítási szolgáltatás keresése</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Párosítási kód</string>\n    <string name=\"paring_code_is_wrong\">Hibás a párosítási kód.</string>\n    <string name=\"cannot_connect_port\">Nem lehet csatlakozni a vezeték nélküli hibakereső szolgáltatáshoz.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Vezeték nélküli hibakeresés nincs engedélyezve.\\nNe feledje, hogy az Android 11 előtt a vezeték nélküli hibakeresés engedélyezéséhez számítógépes csatlakozásra van szükség.</string>\n    <string name=\"dialog_adb_pairing_message\">Kezdje el a párosítást a következő lépésekkel: \\\"Fejlesztői lehetőségek\\\" - \\\"Vezeték nélküli hibakeresés\\\" - \\\"Eszköz párosítása párosítási kóddal\\\".\\n\\nA párosítási folyamat megkezdése után beírhatja a párosítási kódot.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Kérjük, először lépjen az osztott képernyős (több ablakos) módba.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">A rendszer megköveteli, hogy a párosítási párbeszédpanel mindig látható legyen, az osztott képernyős mód az egyetlen módja annak, hogy ez az alkalmazás és a rendszer párbeszédpanel egyszerre látható legyen.</string>\n    <string name=\"adb_error_key_store\">Nem sikerült létrehozni a kulcsot a vezeték nélküli hibakereséshez.\\nEz azért lehet, mert az eszköz KeyStore mechanizmusa meghibásodott.</string>\n    <string name=\"adb_pair_required\">Kérjük először végezze el a párosítási lépést.</string>\n    <string name=\"development_settings\">Fejlesztői lehetőségek</string>\n    <string name=\"notification_settings\">Értesítési lehetőségek</string>\n    <string name=\"adb_pairing_tutorial_title\">Párosítsa a Shizukut készülékével</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">A Shizuku értesítése segít a párosítás befejezésében.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Lépjen a \\\"Fejlesztői lehetőségek\\\" - \\\"Vezeték nélküli hibakeresés\\\" menüpontra. Koppintson az \\\"Eszköz párosítása párosítási kóddal\\\" lehetőségre, és megjelenik egy hatjegyű kód.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">A párosítás befejezéséhez írja be az értesítésben lévő kódot.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">A párosítási folyamat során kapcsolatba kell lépni Shizuku értesítésével. Kérjük, engedélyezze a Shizukunak, hogy értesítéseket tegyen közzé.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Előfordulhat, hogy a MIUI-felhasználóknak át kell váltaniuk az értesítési stílust \\\"Android\\\"-ra a \\\"Értesítés\\\" - \\\"Értesítési árnyék\\\" lehetőségről a rendszerbeállításokban.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Ellenkező esetben előfordulhat, hogy nem tudja megadni a párosítási kódot az értesítésből.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Felhívjuk figyelmét, hogy a \\\"Vezeték nélküli hibakeresés\\\" opció bal oldali része kattintható, rákattintva egy új oldal nyílik meg. A jobb oldali kapcsoló bekapcsolása helytelen.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Vissza és Shizuku elindítása.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">A Shizukunak hozzá kell férnie a helyi hálózathoz. A hálózati engedély vezérli.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Egyes rendszerek (például a MIUI) nem engedélyezik az alkalmazások számára, hogy hozzáférjenek a hálózathoz ha nem láthatók, még akkor sem, ha az alkalmazás alapértelmezés szerint előtérbeli szolgáltatást használ. Kapcsolja ki a Shizuku akku optimalizálási funkcióit az ilyen rendszereken.</string>\n    <!-- Home - Root -->\n    <string name=\"home_root_title\">Indítás (rootolt eszközökhöz)</string>\n    <string name=\"home_root_description\"><![CDATA[Ezenkívül a Shizuku automatikusan elindítható rendszerindításkor. Ha nem, ellenőrizze, hogy rendszere vagy harmadik féltől származó eszközei nem korlátozták-e a Shizukut.<br>A következőre hivatkozhat: %s.]]></string>\n    <string name=\"home_root_description_sui\"><![CDATA[Ha Magisk-et használ, megpróbálhatja a %1$s-t. A root felhasználók számára végül felváltja a Shizukut. Megj.: a meglévő alkalmazásokat kissé módosítani kell a %2$s használatához.]]></string>\n    <string name=\"home_root_button_start\">Indítás</string>\n    <string name=\"home_root_button_restart\">Újraindítás</string>\n    <!-- Home - Application management -->\n    <string name=\"home_app_management_title\">Alkalmazáskezelés</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\"><![CDATA[%d app engedélyezett]]></item>\n        <item quantity=\"other\"><![CDATA[%d app engedélyezett]]></item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\"><![CDATA[Érintse meg az engedélyezett alkalmazások kezeléséhez]]></string>\n    <string name=\"home_app_management_empty\">Itt jelennek meg azok az alkalmazások, amelyek Shizukut kértek vagy bejelentettek.</string>\n    <!-- Home - Learn more -->\n    <string name=\"home_learn_more_title\">Tanulja a Shizukut</string>\n    <string name=\"home_learn_more_description\">Tanuljon meg fejlődni a Shizukuval</string>\n    <!-- Home - Adb permissions limited -->\n    <string name=\"home_adb_is_limited_title\">Egy plusz lépést kell tennie</string>\n    <string name=\"home_adb_is_limited_description\">Az eszköz gyártója korlátozta az adb-engedélyeket, és a Shizuku-t használó alkalmazások nem működnek megfelelően.\\n\\nÁltalában ez a korlátozás bizonyos beállítások módosításával feloldható a \\\"Fejlesztői lehetőségek\\\"-nél. Kérjük, olvassa el a súgót ennek részleteiért.\\n\\nLehet, hogy újra kell indítania a Shizukut, hogy a művelet érvénybe lépjen.</string>\n    <!-- Application management -->\n    <string name=\"app_management_dialog_adb_is_limited_title\">Az adb engedélye korlátozott</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\"><![CDATA[Nagyon valószínű, hogy az eszköz gyártója korlátozza az adb engedélyét.<p>Lehet, hogy van megoldás a rendszeréhez ebben a <b><a href=\\\"%1$s\\\">dokumentumban</a></b>.]]></string>\n    <string name=\"app_management_item_summary_requires_root\">* szükséges, hogy a Shizuku root-on fusson</string>\n    <!-- Terminal -->\n    <string name=\"home_terminal_title\">Használja a Shizukut a terminál appokban</string>\n    <string name=\"home_terminal_description\">Futtasson parancsokat a Shizuku-n keresztül a kívánt terminálalkalmazásokban</string>\n    <string name=\"terminal_tutorial_1\">Először is exportálja a fájlokat a kívánt helyre. Két fájlt fog találni, %1$s és %2$s.</string>\n    <string name=\"terminal_tutorial_1_description\">Ha a kiválasztott mappában vannak azonos nevű fájlok, akkor azok törlődnek.\\n\\nAz export funkció SAF-et használ (Storage Access Framework). A jelentések szerint a MIUI megszakítja a SAF funkcióit. Ha MIUI-t használ, előfordulhat, hogy ki kell csomagolnia a fájlt a Shizuku apk-jából, vagy le kell töltenie a GitHubról.</string>\n    <string name=\"terminal_export_files\">Fájlok exportálása</string>\n    <string name=\"terminal_tutorial_2\">Ezután bármelyik szövegszerkesztővel nyissa meg és szerkessze a %1$s fájlt.</string>\n    <string name=\"terminal_tutorial_2_description\">Ha például a Shizukut szeretné használni a %1$s alkalmazásban, cserélje ki a %2$s kifejezést a következőre: %3$s (%4$s a csomag neve ennek: %1$s).</string>\n    <string name=\"terminal_tutorial_3\">Végül helyezze át a fájlokat valahova, ahol a terminálalkalmazása hozzáférhet, így a %1$s segítségével parancsokat futtathat a Shizuku-n keresztül..</string>\n    <string name=\"terminal_tutorial_3_description\">Néhány tipp: adjon végrehajtási engedélyt a következőnek: %1$s, és adja hozzá a következőhöz: %2$s, így közvetlenül használhatja a %1$s-t.</string>\n    <string name=\"rish_description\"><![CDATA[\nA %1$s segítségével bármely terminálalkalmazásban csatlakozhat a Shizuku által futtatott shellhez, és kommunikálhat vele.\n<p>A %1$s részletes használatáról, érintse a dokumentum megtekintéséhez.\n    ]]></string>\n    <!-- Settings -->\n    <string name=\"settings_title\">Beállítások</string>\n    <string name=\"settings_language\">Nyelv</string>\n    <string name=\"settings_user_interface\">Megjelenés</string>\n    <string name=\"settings_black_night_theme\">Sötét éj téma</string>\n    <string name=\"settings_black_night_theme_summary\">Használja a tiszta fekete témát, ha az éjszakai mód be van kapcsolva</string>\n    <string name=\"settings_startup\">Üzembe helyezés</string>\n    <string name=\"settings_translation_contributors\">Fordítási közreműködők</string>\n    <string name=\"settings_translation\">Vegyen részt a fordításban</string>\n    <string name=\"settings_translation_summary\">Segítsen nekünk lefordítani a %s-t az Ön nyelvére</string>\n    <string name=\"settings_start_on_boot\">Induljon rendszerindításkor (root)</string>\n    <string name=\"settings_start_on_boot_summary\">Rootolt eszközök esetén a Shizuku képes auto. elindulni rendszerindításkor</string>\n    <string name=\"settings_use_system_color\">Használja a rendszertéma színét</string>\n    <!-- About -->\n    <string name=\"action_about\">Rólunk</string>\n    <string name=\"about_view_source_code\"><![CDATA[Forráskód megtekintése itt: %s]]></string>\n    <!-- Stop -->\n    <string name=\"action_stop\">A Shizuku leállítása</string>\n    <string name=\"dialog_stop_message\">A Shizuku szolgáltatás leáll.</string>\n    <!-- Notification -->\n    <string name=\"notification_channel_service_status\">Szolgáltatásindítási állapot</string>\n    <string name=\"notification_service_starting\">A Shizuku szolgáltatás indul…</string>\n    <string name=\"notification_service_start_failed\">A Shizuku szolgáltatás indítása nem sikerült.</string>\n    <string name=\"notification_service_start_no_root\">Nem sikerült root engedélyt kérni.</string>\n    <string name=\"notification_working\">Dolgozom…</string>\n    <string name=\"notification_channel_adb_pairing\">Vezeték nélküli hibakeresés pairing</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Írja be a párosítási kódot</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Párosítási szolgáltatás keresése</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Párosítási szolgáltatás található</string>\n    <string name=\"notification_adb_pairing_stop_searching\">A keresés leállítása</string>\n    <string name=\"notification_adb_pairing_working_title\">A párosítás folyamatban</string>\n    <string name=\"notification_adb_pairing_succeed_title\">A párosítás sikeres</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Most elindíthatja a Shizuku szolgáltatást.</string>\n    <string name=\"notification_adb_pairing_failed_title\">A párosítás nem sikerült</string>\n    <string name=\"notification_adb_pairing_retry\">Újra</string>\n    <!-- Permission related, appears in system permission UI -->\n    <string name=\"permission_group_label\" translatable=\"false\">Shizuku</string>\n    <string name=\"permission_group_description\" translatable=\"false\">@string/permission_label</string>\n    <string name=\"permission_label\">Shizuku hozzáférés</string>\n    <string name=\"permission_description\">Engedélyezze az app számára a Shizuku használatát.</string>\n    <string name=\"permission_warning_template\"><![CDATA[Engedélyezi <b>%1$s</b> ide, %2$s?]]></string>\n    <string name=\"grant_dialog_button_allow_always\">Mindig engedje meg</string>\n    <string name=\"grant_dialog_button_deny\">\"Megtagad\"</string>\n    <!-- Starter -->\n    <string name=\"starter\">Indító</string>\n    <string name=\"starting_root_shell\" translatable=\"false\">Root shell indítása…</string>\n    <string name=\"start_with_root_failed\">A szolgáltatás nem indítható el, mert nincs root jogosultság megadva, vagy ez az eszköz nincs rootolva.</string>\n    <!-- Misc -->\n    <string name=\"dialog_cannot_open_browser_title\">Nem lehet elindítani a böngészőt</string>\n    <string name=\"toast_copied_to_clipboard\">%s\\n a vágólapra másolva.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><![CDATA[<b>%s</b> a vágólapra másolva.]]></string>\n    <!-- Messages for legacy -->\n    <string name=\"dialog_legacy_not_support_title\">%1$s nem támogatja a modern Shizukut</string>\n    <string name=\"dialog_legacy_not_support_message\"><![CDATA[Az örökölt Shizuku 2019 márciusa óta elavult. Ezenkívül a régi Shizuku nem működik újabb Android-rendszereken.<p>Kérdezze meg a fejlesztőt <b>%1$s</b> frissítéséről.]]></string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s az örökölt Shizukut kéri</string>\n    <string name=\"dialog_requesting_legacy_message\"><![CDATA[<b>%1$s</b> modern Shizuku támogatással rendelkezik, de az örökölt Shizukut kéri. Ez azért lehet, mert a Shizuku nem fut, ellenőrizze a Shizuku alkalmazást.<p>Az örökölt Shizuku 2019 márciusa óta elavult.]]></string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Nyissa meg a Shizukut</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Próbálja kikapcsolni majd engedélyezni a \\\"Vezeték nélküli hibakeresés\\\" opciót, ha továbbra is keres.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-hy/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_legacy_not_support_title\">%1$s-ը չի ընդունում այժմյան Shizuku-ն</string>\n    <string name=\"toast_copied_to_clipboard_with_text\">&lt;b&gt;%s&lt;/b&gt;-ն պատճենվել է կցատարում։</string>\n    <string name=\"toast_copied_to_clipboard\">%s-ն\n\\nպատճենվել է կցատարում։</string>\n    <string name=\"dialog_cannot_open_browser_title\">Չհաջողվեց միացնել ինտերնետի ծրագիրը</string>\n    <string name=\"start_with_root_failed\">Չհաջողվեց բեռնել ծառայությունը քանի որ root թույլտվությունը մերժված է կամ սարքը root չունի։</string>\n    <string name=\"starter\">Սկսնակ</string>\n    <string name=\"permission_description\">Թողնել ծրագրին օգտվել ավելի բարձր արտոնություններով համակարգային API-ներից։</string>\n    <string name=\"permission_label\">օգտվել Shizuku-ից</string>\n    <string name=\"permission_group_description\">օգտվել Shizuku-ից</string>\n    <string name=\"notification_working\">Աշխատում է…</string>\n    <string name=\"notification_service_start_no_root\">Չհաջողվեց ստանալ root թույլտվություն։</string>\n    <string name=\"notification_service_start_failed\">Shizuku-ի միացումը ձախողվեց։</string>\n    <string name=\"notification_service_starting\">Shizuku-ի ծառայությունը միանում է…</string>\n    <string name=\"notification_channel_service_status\">Ծառայության վիճակ</string>\n    <string name=\"action_stop\">Անջատել Shizuku-ն</string>\n    <string name=\"dialog_stop_message\">Shizuku-ի ծառայությունը կանջատվի։</string>\n    <string name=\"about_view_source_code\">Տեսնել կոդի աղբյուրը %s-ում</string>\n    <string name=\"action_about\">Ծրագրի մասին</string>\n    <string name=\"settings_start_on_boot_summary\">Root թույլտվություն ունեցող սարքերում Shizuku-ն ավտոմատացված ձևով կարող է միանալ սարքի հետ</string>\n    <string name=\"settings_start_on_boot\">Միանալ սարքի հետ (root-ով)</string>\n    <string name=\"settings_translation_summary\">Օգնեք մեզ թարգմանել %s-ը Ձեր լեզվով</string>\n    <string name=\"settings_translation\">Մասնակցել թարգմանության մեջ</string>\n    <string name=\"settings_translation_contributors\">Թարգմանության աջակցողներ</string>\n    <string name=\"settings_startup\">Միացում</string>\n    <string name=\"settings_black_night_theme_summary\">Օգտագործել սև տեսքը եթե գիշերային ռեժիմը միացված է</string>\n    <string name=\"settings_black_night_theme\">Սև գիշերի տեսք</string>\n    <string name=\"settings_user_interface\">Տեսք</string>\n    <string name=\"settings_language\">Լեզու</string>\n    <string name=\"settings_title\">Կարգավորումներ</string>\n    <string name=\"app_management_item_summary_requires_root\">* Shizuku-ն root թույլտվություն պետք է ունենա</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Շատ հնարավոր է, որ Ձեր սարքի արտադրողը սահմանափակել է adb-ի թույլտվությունները։ &lt;p&gt;Հնարավոր լուծումները գտեք &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;այստեղ&lt;/a&gt;&lt;/b&gt;։</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Adb-ի թույլտվությունները սահմանափակված են</string>\n    <string name=\"home_learn_more_description\">Սովորեք ծրագրավորել Shizuku-ով կամ Shizuku-ն ուրիշ ծրագրերի հետ օգտագործել</string>\n    <string name=\"home_learn_more_title\">Սովորել Shizuku</string>\n    <string name=\"home_app_management_view_authorized_apps\">Սեղմեք, որպեսզի վավերացված ծրագրերը տիրապետելու համար</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Վավերացված է %d ծրագիր</item>\n        <item quantity=\"other\">Վավերացված է %d ծրագիր</item>\n    </plurals>\n    <string name=\"home_app_management_title\">Ծրագրերի տիրապետում</string>\n    <string name=\"home_root_button_restart\">Վերաբեռնել</string>\n    <string name=\"home_root_button_start\">Միացնել</string>\n    <string name=\"home_root_title\">Միացնել (root արած սարքերի համար)</string>\n    <string name=\"development_settings\">Ծրագրավորողի կարգավորումներ</string>\n    <string name=\"adb_pair_required\">Խնդրում ենք սկզբում կատարել զուգելու քայլերը։</string>\n    <string name=\"adb_error_key_store\">Չստացվեց բանակի ստանալ անլար կարգաբերման համար։\n\\nՀնարավոր է, որ այս սարքի KeyStore մեխանիզմը փչացել է։</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Համակարգին անհրաժեշտ է որ զուգման պատուհանը միշտ երևա։ Էկրանի կիսման ռեժիմը միակ միջոցն է որ այս ծրագիրը և զուգման պատուհանը միաժամանակ երևան։</string>\n    <string name=\"adb_pairing_requires_multi_window\">Սկզբում միացրեք էկրանի կիսման ռեժիմը։</string>\n    <string name=\"dialog_adb_pairing_message\">Սկսեք զուգելը հետևյալ քայլերով. «Ծրագրավորողի կարգավորումներ» - «Անլար կարգաբերում» - «Զուգել սարքը զուգվելու կոդով»։\n\\n\n\\nԶուգվելու պրոցեսի սկսվելուց հետո դուք կկարողանաք ներմուծել զուգվելու կոդը։</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Անլար կարգաբերումը միացված չէ։\n\\nAndroid 11-ից առաջ անլար կարգաբերման համար անհրաժեշտ է համակարգչային կապ։</string>\n    <string name=\"cannot_connect_port\">Հնարավոր չէ կպնել անլար կարգաբերման ծառայությանը։</string>\n    <string name=\"paring_code_is_wrong\">Զուգելու կոդը սխալ է։</string>\n    <string name=\"dialog_adb_pairing_title\">Զուգել սարքի հետ</string>\n    <string name=\"dialog_adb_pairing_discovery\">Որոնվում է զուգելու ծառայությունը</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Զուգելու կոդ</string>\n    <string name=\"adb_pairing\">Զուգավորում</string>\n    <string name=\"dialog_adb_invalid_port\">Պոռտը թիվ է 1-ի և 65535-ի միջև։</string>\n    <string name=\"dialog_adb_port\">Պոռտ</string>\n    <string name=\"dialog_adb_discovery_message\">Խնդրում ենք միացնել «Անլար կարգաբերում»-ը «Ծրագրավորողի կարգավորումներ»-ի մեջ։ «Անլար կարգաբերում»-ը ավտոմատացված ձևով անջատվում է ցանցի փոփոխման ժամանակ։\n\\n\n\\nՉանջատեք «Ծրագրավորողի կարգավորումներ»-ը կամ «USB-ով կարգաբերում»-ը, թե չէ Shizuku-ն կանջատվի։</string>\n    <string name=\"dialog_adb_discovery\">Որոնվում է անլար կարգաբերման ծառայությունը</string>\n    <string name=\"home_wireless_adb_title\">Միացնել Անլար կարգաբերման օգնությամբ</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Ուղարկել</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Պատճենել</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Գոյություն ունեն ուրիշ դիտողություններ։ Սկզբում հաստատեք, որ կարդացել եք օգնությունը։</string>\n    <string name=\"home_adb_button_view_command\">Տեսնել հրահանգը</string>\n    <string name=\"home_adb_button_view_help\">Կարդալ օգնությունը</string>\n    <string name=\"home_adb_description\">Առանց «root» թույլտվություն ունեցող սարքերի օգտատերերը պետք է օգտագործեն adb, որպեսզի միացնեն Shizuku-ն (անհրաժեշտ է համակարգչային կապ)։ Այս գործողությունը պետք է կրկնել ամեն անգամ սարքի վերաբեռնելուց հետո։ Խնդրում ենք &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;կարդալ օգնությունը&lt;/a&gt;&lt;/b&gt;։</string>\n    <string name=\"home_adb_title\">Միացնել համակարգչի օգնությամբ</string>\n    <string name=\"home_status_service_version_update\">Փոփոխակ %2$s, %1$s&lt;br&gt;Միացրեք կրկին որպեսզի թարմացնեք դեպի %3$s փոփոխակ</string>\n    <string name=\"home_status_service_version\">Փոփոխակ %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s-ը միացված չէ</string>\n    <string name=\"home_status_service_is_running\">%1$s-ը միացված է</string>\n    <string name=\"translation_contributors\">Tigran Khachatryan</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s-ն առաջարկում է օգտվել հին Shizuku-ից</string>\n    <string name=\"dialog_legacy_not_support_message\">Հին Shizuku-ն համարվում է հնացած 2019-ի մարտից։ Հին Shizuku-ն չի աշխատում նոր Android-ի փոփոխակներում։&lt;p&gt;Դիմեք &lt;b&gt;%1$s&lt;/b&gt;-ի ծրագրավորողին և ասեք, որ ծրագիրը թարմացնի։</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Բացել Shizuku-ն</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt;-ն օժտված է նոր Shizuku-ից օգտվելու հատկությունից, բայց այն փորձում է օգտվել հին Shizuku-ից։ Հնարավոր է, որ Shizuku-ն միացված չէ, ստուգեք Shizuku ծրագիրը։&lt;p&gt;Հին Shizuku-ն համարվում է հնացած 2019-ի մարտից։</string>\n    <string name=\"grant_dialog_button_deny\">Մերժել</string>\n    <string name=\"grant_dialog_button_allow_always\">Միշտ թույլատրել</string>\n    <string name=\"permission_warning_template\">Թույլատրե՞լ <b>%1$s</b> հավելվածին %2$s:</string>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-id/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_status_service_version_update\">Versi %2$s, %1$s &lt;br&gt; Mulai ulang untuk upgrade ke versi %3$s</string>\n    <string name=\"home_adb_description\">Untuk perangkat tanpa akses root, Anda harus menggunakan adb untuk memulai Shizuku (perlu terhubung dengan komputer). Proses ini harus diulang setiap kali perangkat di-restart. Harap <b><a href=\"%1$s\">baca dokumentasi</a></b> untuk info lebih lanjut.</string>\n    <string name=\"dialog_adb_discovery_message\">Harap aktifkan \\\"Debug Nirkabel (Wireless Debugging)\\\" pada \\\"Pilihan Pengembang (Developer Option)\\\". Opsi \\\"Debug Nirkabel\\\" akan nonaktif otomatis saat koneksi berubah.\n\\n\n\\nSebagai catatan, jangan nonaktifkan \\\"Pilihan Pengembang\\\" atau \\\"Debug USB\\\", karena Shizuku akan terhenti.</string>\n    <string name=\"dialog_adb_pairing_message\">Harap mulai penyambungan melalui langkah berikut: \\\"Pilihan Pengembang\\\" – \\\"Debug Nirkabel\\\" – \\\"Sambungkan perangkat dengan kode penghubung\\\".\n\\n\n\\nSetelah penyambungan dimulai, Anda akan diminta untuk memasukkan kode penghubung.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Sistem mengharuskan dialog penyambungan untuk selalu terlihat, hal ini hanya bisa diakali dengan mode layar pisah (split-screen) untuk membuat Shizuku dan dialog sistem muncul secara bersamaan.</string>\n    <string name=\"home_root_description\">Sebagai tambahan, Shizuku bisa dimulai secara otomatis saat perangkat dimulai. Kalau hal ini tak bisa dilakukan, harap cek apakah sistem Anda atau aplikasi pihak-ketiga telah membatasi Shizuku.&lt;br&gt;Lebih lanjut, cek %s.</string>\n    <string name=\"home_learn_more_description\">Pelajari cara mengembangkan dengan Shizuku</string>\n    <string name=\"terminal_tutorial_1\">Pertama, Ekspor file ke tempat mana pun yang Anda mau. Anda akan mendapatkan dua file, yaitu %1$s dan %2$s.</string>\n    <string name=\"terminal_tutorial_1_description\">Jika ada file bernama sama pada folder tersebut, maka file tersebut akan ditimpa.\n\\n\n\\nFungsi ekspor ini menggunakan SAF (Storage Access Framework). Beberapa orang melaporkan bahwa MIUI mengacaukan fungsi SAF. Jadi jika Anda memakai MIUI, mungkin Anda harus mengekstrak file ini dari apk Shizuku atau mengunduhnya dari GitHub.</string>\n    <string name=\"terminal_tutorial_2_description\">Sebagai contoh, jika Anda mau menggunakan Shizuku di %1$s, Anda harus menimpa %2$s dengan %3$s (%4$s adalah nama paket dari %1$s).</string>\n    <string name=\"terminal_tutorial_3_description\">Tips tambahan: berikan izin eksekusi pada %1$s dan tambahkan pada %2$s, Anda akan bisa menggunakan %1$s secara langsung.</string>\n    <string name=\"action_stop\">Hentikan Shizuku</string>\n    <string name=\"notification_service_start_no_root\">Gagal mendapat izin root.</string>\n    <string name=\"start_with_root_failed\">Layanan tidak bisa dimulai karena aplikasi tidak mendapat izin root atau perangkat tidak memiliki akses root.</string>\n    <string name=\"translation_contributors\">laymoth</string>\n    <string name=\"home_status_service_is_running\">%1$s aktif</string>\n    <string name=\"home_status_service_not_running\">%1$s tidak berjalan</string>\n    <string name=\"home_status_service_version\">Versi %2$s, %1$s</string>\n    <string name=\"home_adb_title\">Mulai dengan menghubungkan ke komputer</string>\n    <string name=\"home_adb_button_view_help\">Baca dokumentasi</string>\n    <string name=\"home_adb_button_view_command\">Lihat perintah</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Terdapat beberapa pertimbangan tambahan, harap pastikan bahwa Anda telah membaca dokumentasi.</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Salin</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Kirim ke...</string>\n    <string name=\"home_wireless_adb_title\">Mulai melalui Debug Nirkabel</string>\n    <string name=\"dialog_adb_discovery\">Mencari layanan debug nirkabel</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_invalid_port\">Port adalah integer antara 1 sampai 65535.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Debug nirkabel belum diaktifkan.\n\\nSebagai catatan, Anda harus terhubung ke komputer untuk mengaktifkan debug nirkabel pada perangkat sebelum Android 11.</string>\n    <string name=\"adb_pairing\">Sambungkan</string>\n    <string name=\"dialog_adb_pairing_title\">Sambungkan dengan perangkat</string>\n    <string name=\"dialog_adb_pairing_discovery\">Mencari layanan penyambung</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Kode penghubung</string>\n    <string name=\"paring_code_is_wrong\">Kode penghubung tidak sesuai.</string>\n    <string name=\"cannot_connect_port\">Gagal menyambungkan ke layanan debug nirkabel.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Harap pindah ke mode layar pisah (split-screen) terlebih dahulu.</string>\n    <string name=\"adb_error_key_store\">Gagal membuat kunci untuk debug nirkabel.\n\\nHal ini bisa terjadi karena mekanisme KeyStore pada perangkat ini mengalami kerusakan.</string>\n    <string name=\"adb_pair_required\">Harap lakukan penyambungan terlebih dahulu.</string>\n    <string name=\"development_settings\">Pilihan pengembang</string>\n    <string name=\"home_root_title\">Mulai (untuk perangkat dengan root)</string>\n    <string name=\"home_root_description_sui\">Jika Anda menggunakan Magisk, Anda bisa coba %1$s. Untuk pengguna root, hal ini perlahan akan menggantikan Shizuku. Sebagai catatan, aplikasi yang sudah ada harus disesuaikan sedikit untuk menggunakan %2$s.</string>\n    <string name=\"home_root_button_start\">Mulai</string>\n    <string name=\"home_root_button_restart\">Mulai ulang</string>\n    <string name=\"home_app_management_title\">Manajemen Aplikasi</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"other\">%d aplikasi terdaftar</item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\">Ketuk untuk mengatur aplikasi terdaftar</string>\n    <string name=\"home_learn_more_title\">Pelajari Shizuku</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Izin adb terbatas</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Kemungkinan besar merk perangkat Anda membatasi perizinan adb.&lt;p&gt;Solusi untuk perangkat Anda mungkin ada pada &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;dokumentasi ini&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_item_summary_requires_root\">* Shizuku harus dijalankan dengan root</string>\n    <string name=\"home_terminal_title\">Gunakan Shizuku pada aplikasi terminal</string>\n    <string name=\"home_terminal_description\">Jalankan perintah melalui Shizuku pada aplikasi terminal yang Anda gunakan</string>\n    <string name=\"terminal_export_files\">Ekspor file</string>\n    <string name=\"terminal_tutorial_2\">Lalu, gunakan penyunting teks apa pun untuk membuka dan mengubah %1$s.</string>\n    <string name=\"terminal_tutorial_3\">Terakhir, pindahkan file ke tempat yang bisa diakses oleh aplikasi terminal yang Anda gunakan, Anda akan bisa menggunakan %1$s untuk menjalan perintah melalui Shizuku.</string>\n    <string name=\"settings_title\">Pengaturan</string>\n    <string name=\"settings_language\">Bahasa</string>\n    <string name=\"settings_user_interface\">Penampilan</string>\n    <string name=\"settings_black_night_theme\">Tema hitam gelap</string>\n    <string name=\"settings_black_night_theme_summary\">Gunakan tema hitam gelap jika mode malam diaktifkan</string>\n    <string name=\"settings_startup\">Pemulaian</string>\n    <string name=\"settings_translation_contributors\">Kontributor penerjemah</string>\n    <string name=\"settings_translation\">Ikut menerjemahkan</string>\n    <string name=\"settings_translation_summary\">Bantu kami menerjemahkan %s dengan bahasa Anda</string>\n    <string name=\"settings_start_on_boot\">Mulai saat boot (root)</string>\n    <string name=\"settings_start_on_boot_summary\">Untuk perangkat root, Shizuku bisa mulai otomatis saat boot</string>\n    <string name=\"action_about\">Tentang</string>\n    <string name=\"about_view_source_code\">Lihat kode sumbernya di %s</string>\n    <string name=\"dialog_stop_message\">Layanan Shizuku akan berhenti.</string>\n    <string name=\"notification_channel_service_status\">Status layanan</string>\n    <string name=\"notification_service_starting\">Memulai layanan Shizuku…</string>\n    <string name=\"notification_service_start_failed\">Layanan Shizuku gagal dimulai.</string>\n    <string name=\"notification_working\">Sedang bekerja…</string>\n    <string name=\"permission_description\">Izinkan aplikasi menggunakan Shizuku.</string>\n    <string name=\"permission_label\">mengakses Shizuku</string>\n    <string name=\"permission_warning_template\">Izinkan <b>%1$s</b> untuk %2$s\\?</string>\n    <string name=\"grant_dialog_button_allow_always\">Selalu izinkan</string>\n    <string name=\"grant_dialog_button_deny\">Tolak</string>\n    <string name=\"starter\">Pemulaian</string>\n    <string name=\"dialog_cannot_open_browser_title\">Tidak bisa membuka browser</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\ntelah disalin ke papan klip.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> telah disalin ke papan klip.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s tidak mendukung Shizuku modern</string>\n    <string name=\"dialog_legacy_not_support_message\">Shizuku Kuno sudah dihentikan sejak Maret 2019. Selain itu, Shizuku kuno tidak bisa bekerja pada sistem Android yang lebih baru.&lt;p&gt;Coba minta kepada pengembang dari &lt;b&gt;%1$s&lt;/b&gt; untuk memperbarui aplikasinya.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s meminta akses Shizuku kuno</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; memiliki dukungan Shizuku modern, namun meminta akses Shizuku kuno. Hal ini bisa terjadi karena Shizuku tidak aktif, harap periksa di aplikasi Shizuku. &lt;p&gt;Shizuku Kuno sudah dihentikan sejak Maret 2019.</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Buka Shizuku</string>\n    <string name=\"rish_description\">Dengan %1$s, di aplikasi terminal mana pun, Anda dapat terhubung dan berinteraksi dengan shell yang dijalankan oleh Shizuku. &lt;p&gt;Tentang detail penggunaan %1$s, ketuk untuk melihat dokumen.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Sebelum Android 11, koneksi ke komputer diperlukan untuk mengaktifkan debug Nirkabel.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Pengguna MIUI mungkin perlu mengubah gaya pemberitahuan ke \\\"Android\\\" dari \\\"Pemberitahuan\\\" - \\\"Bayangan pemberitahuan\\\" di pengaturan sistem.</string>\n    <string name=\"home_wireless_adb_description\">Pada Android 11 atau yang lebih baru, Anda dapat mengaktifkan debug Nirkabel dan memulai Shizuku langsung dari perangkat Anda, tanpa menyambungkan ke komputer.&lt;p&gt;Silakan lihat panduan langkah demi langkah terlebih dahulu.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Notifikasi dari Shizuku akan membantu Anda untuk menyelesaikan pemasangan.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Masuk \\\"Opsi developer\\\" - \\\"Debug nirkabel\\\". Sentuh \\\"Sambungkan perangkat dengan kode penghubung\\\", Anda akan melihat enam digit kode.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Masukkan kode pada notifikasi untuk menyelesaikan penyambungan.</string>\n    <string name=\"notification_channel_adb_pairing\">Pemasangan debug nirkabel</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Masukkan kode penyambungan</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Mencari layanan penyambungan</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Layanan penyambungan ditemukan</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Berhenti mencari</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Anda dapat memulai layanan Shizuku sekarang.</string>\n    <string name=\"notification_adb_pairing_failed_title\">Penyambungan gagal</string>\n    <string name=\"notification_adb_pairing_retry\">Ulangi</string>\n    <string name=\"adb_pairing_tutorial_title\">Pasangkan Shizuku dengan perangkat Anda</string>\n    <string name=\"notification_adb_pairing_working_title\">Penyambungan dalam proses</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Penyambungan berhasil</string>\n    <string name=\"notification_settings\">Pengaturan notifikasi</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Proses penyambungan membutuhkan Anda untuk berinteraksi dengan notifikasi dari Shizuku. Mohon izinkan Shizuku untuk mengirim pemberitahuan.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Panduan langkah demi langkah</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Kembali ke Shizuku dan mulai Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Harap dicatat, bagian kiri dari opsi \\\"Debug nirkabel \\\" dapat diklik, mengetuknya akan membuka halaman baru. Hanya menyalakan sakelar di sebelah kanan yang salah.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Jika tidak, Anda mungkin tidak dapat memasukan kode penyandingan dari notifikasi.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku membutuhkan akses ke jaringan lokal. Itu dikontrol oleh izin jaringan.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Beberapa sistem (seperti MIUI) melarang aplikasi untuk mengakses jaringan ketika tidak terlihat, bahkan jika aplikasi berjalan dilatar depan. Tolong matikan fitur optimisasi baterai untuk Shizuku pada sistem tersebut.</string>\n    <string name=\"settings_use_system_color\">Gunakan tema warna sistem</string>\n    <string name=\"home_adb_is_limited_description\">Produsen perangkat Anda telah membatasi izin adb dan aplikasi yang menggunakan Shizuku tidak akan berfungsi dengan baik.\n\\n\n\\nBiasanya, batasan ini dapat dihilangkan dengan menyesuaikan beberapa opsi di \\\"Opsi pengembang\\\". Silakan baca bantuan untuk detail tentang cara melakukan ini.\n\\n\n\\nAnda mungkin perlu memulai ulang Shizuku agar operasi dapat diterapkan.</string>\n    <string name=\"home_adb_is_limited_title\">Anda perlu mengambil langkah ekstra</string>\n    <string name=\"home_app_management_empty\">Aplikasi yang telah meminta atau mendeklarasikan Shizuku akan ditampilkan di sini.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Coba untuk matikan dan hidupkan kembali \\\"Debug nirkabel\\\" jika terus mencari.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_adb_button_view_help\">Leggi la guida</string>\n    <string name=\"home_adb_description\">Per i dispositivi non rootati occorre usare adb per avviare Shizuku (serve una connessione ad un computer). Questo processo deve essere ripetuto ogni volta che il dispositivo viene riavviato. Per favore <b><a href=\"%1$s\">leggi la guida</a></b>.</string>\n    <string name=\"home_adb_title\">Avvia collegandoti ad un computer</string>\n    <string name=\"home_status_service_version_update\">Versione %2$s, %1$s&lt;br&gt;Riavvia per aggiornare alla versione %3$s</string>\n    <string name=\"home_status_service_version\">Versione %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s non è in esecuzione</string>\n    <string name=\"home_status_service_is_running\">%1$s è in esecuzione</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Ci sono altre considerazioni, conferma di aver letto prima la guida.</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copia</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Invia</string>\n    <string name=\"home_wireless_adb_title\">Avvia tramite Debug Wireless</string>\n    <string name=\"home_wireless_adb_description\">Su Android 11 o successivi, puoi abilitare il Debug Wireless e avviare Shizuku direttamente dal tuo dispositivo, senza doverti collegare a un computer.&lt;p&gt;Consulta prima la guida passo-passo.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Per le versioni precedenti ad Android 11, è necessario collegarsi ad un computer per abilitare il Debug Wireless.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Guida passo-passo</string>\n    <string name=\"dialog_adb_discovery_message\">Abilita \\\"Debug Wireless\\\" in \\\"Opzioni Sviluppatore\\\". \\\"Debug Wireless\\\" viene automaticamente disabilitato quando la rete cambia.\n\\n\n\\nNota, non disabilitare \\\"Opzioni Sviluppatore\\\" o \\\"Debug USB\\\", altrimenti Shizuku verrà interrotto.</string>\n    <string name=\"dialog_adb_port\">Porta</string>\n    <string name=\"adb_pairing\">Accoppiamento</string>\n    <string name=\"dialog_adb_pairing_title\">Accoppia con il dispositivo</string>\n    <string name=\"dialog_adb_pairing_discovery\">Ricerca del servizio di accoppiamento</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Codice di accoppiamento</string>\n    <string name=\"paring_code_is_wrong\">Il codice di accoppiamento è sbagliato.</string>\n    <string name=\"cannot_connect_port\">Impossibile connettersi al servizio di debug wireless.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Entra prima nella modalità schermo diviso (multi-finestra).</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Il sistema richiede che la finestra di dialogo di accoppiamento sia sempre visibile, l\\'utilizzo della modalità schermo diviso è l\\'unico modo per rendere visibili contemporaneamente l\\'app e la finestra di dialogo di sistema.</string>\n    <string name=\"adb_error_key_store\">Impossibile generare la chiave per il debug wireless.\n\\nCiò potrebbe essere dovuto ad un malfunzionamento del meccanismo di KeyStore di questo dispositivo.</string>\n    <string name=\"adb_pair_required\">Esegui prima la fase di accoppiamento.</string>\n    <string name=\"development_settings\">Modalitá sviluppatore</string>\n    <string name=\"adb_pairing_tutorial_title\">Accoppia Shizuku col tuo dispositivo</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Una notifica da Shizuku ti aiuterà a completare l\\'accoppiamento.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Entra in \\\"Modalità sviluppatore\\\" - \\\"Debug wireless\\\". Seleziona \\\"Accoppia dispositivo con codice di associazione\\\", vedrai un codice a sei cifre.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Inserisci il codice nella notifica per completare l\\'accoppiamento.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Il processo di accoppiamento richiede che tu interagisca con una notifica di Shizuku. Consenti a Shizuku di mostrare notifiche.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Gli utenti MIUI potrebbero dover impostare lo stile di notifica su \\\"Android\\\" da \\\"Notifiche\\\" - \\\"Pannello notifiche\\\" nelle impostazioni di sistema.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Torna a Shizuku e avvia Shizuku.</string>\n    <string name=\"home_root_title\">Avvia (per dispositivi rootati)</string>\n    <string name=\"home_adb_button_view_command\">Visualizza comando</string>\n    <string name=\"dialog_adb_discovery\">Ricerca del servizio di Debug Wireless</string>\n    <string name=\"dialog_adb_invalid_port\">La porta è un numero intero compreso tra 1 e 65535.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Il debug wireless non è abilitato.\n\\nNota, per versioni precedenti ad Android 11, per abilitare il debug wireless, è necessaria la connessione al computer.</string>\n    <string name=\"dialog_adb_pairing_message\">Inizia l\\'accoppiamento con i seguenti passaggi: \\\"Opzioni sviluppatore\\\" - \\\"Debug wireless\\\" - \\\"Accoppiamento del dispositivo tramite codice di associazione\\\".\n\\n\n\\nDopo l\\'avvio del processo di accoppiamento, potrai inserire il codice.</string>\n    <string name=\"notification_settings\">Opzioni di notifica</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Alcuni sistemi (come MIUI) non consentono alle app di accedere alla rete quando queste non sono visibili, anche se l\\'app utilizza il servizio in primo piano come standard. Disattiva le funzioni di ottimizzazione della batteria per Shizuku su tali sistemi.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">In caso contrario, potresti non essere in grado di inserire il codice di accoppiamento dalla notifica.</string>\n    <string name=\"home_root_description\">Inoltre, Shizuku può essere avviato automaticamente all\\'avvio. In caso contrario, controlla se il tuo sistema o l\\'opzione app esterne hanno limitato Shizuku.&lt;br&gt;Puoi fare riferimento a %s.</string>\n    <string name=\"home_root_button_start\">Avvia</string>\n    <string name=\"home_root_description_sui\">Se stai usando Magisk, puoi provare %1$s. Per gli utenti root, alla fine sostituirà Shizuku. Nota, le applicazioni esistenti devono essere leggermente modificate per poter usare %2$s.</string>\n    <string name=\"home_root_button_restart\">Riavvia</string>\n    <string name=\"home_app_management_title\">Gestione dell\\'applicazione</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku ha bisogno di accedere alla rete locale. È controllato dal permesso di rete.</string>\n    <string name=\"terminal_tutorial_1\">Per primo, esporta i files ovunque tu voglia, %1$s e %2$s.</string>\n    <string name=\"terminal_export_files\">Esporta files</string>\n    <string name=\"terminal_tutorial_2\">Poi usa un qualsiasi editore testi per aprire e modificare %1$s.</string>\n    <string name=\"terminal_tutorial_1_description\">Se esistono files con lo stesso nome nella cartella selezionata, saranno cancellati.\n\\n\n\\nLa funzione di esportazione usa SAF (Storage Access Framework). Si segnala che MIUI impedisce la funzione SAF. Se utilizzate MIUI, dovrete probabilmente estrarre il file dall\\'apk Shizuku o scaricarlo da GitHub.</string>\n    <string name=\"home_terminal_description\">Esegui comandi attraverso Shizuku nelle apps terminale che desiderate</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">%d applicazione autorizzata</item>\n        <item quantity=\"many\">%d applicazioni autorizzate</item>\n        <item quantity=\"other\">%d applicazioni autorizzate</item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\">Premere per gestire le app autorizzate</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Il permesso di adb è limitato</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">È molto probabile che il fabbricante del tuo dispositivo limiti i permessi di adb.&lt;p&gt;Ci potrebbe essere una soluzione per il vostro dispositivo in &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;questo documento&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_item_summary_requires_root\">* richiede Shizuku in modalità root</string>\n    <string name=\"home_learn_more_title\">Impara Shizuku</string>\n    <string name=\"home_learn_more_description\">Impara a sviluppare con Shizuku</string>\n    <string name=\"home_terminal_title\">Utilizza Shizuku nell\\'app terminale</string>\n    <string name=\"translation_contributors\">Dany-coder778, xDonatello, cladiotto</string>\n    <string name=\"action_stop\">Interrompi Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; ha il supporto al Shizuku moderno, ma sta richiedendo Shizuku legacy. Questo potrebbe essere perché Shizuku non è in esecuzione, controlla nell\\'app Shizuku.&lt;p&gt;Shizuku legacy è stato deprecato a marzo 2019.</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Apri Shizuku</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Tieni presente che la parte a sinistra dell\\'opzione \\\"Debug wireless\\\" è selezionabile, toccandola si aprirà una nuova pagina. Solo la pressione dell\\'interruttore a destra non è corretta.</string>\n    <string name=\"settings_title\">Impostazioni</string>\n    <string name=\"settings_language\">Lingua</string>\n    <string name=\"settings_black_night_theme_summary\">Usa il tema nero puro se la modalità notte è abilitata</string>\n    <string name=\"settings_translation\">Partecipa alla traduzione</string>\n    <string name=\"settings_translation_summary\">Aiutaci a tradurre %s nella tua lingua</string>\n    <string name=\"settings_start_on_boot_summary\">Per i dispositivi rootati, Shizuku è in grado di avviarsi automaticamente all\\'avvio</string>\n    <string name=\"notification_channel_service_status\">Stato di avvio del servizio</string>\n    <string name=\"grant_dialog_button_allow_always\">Consenti sempre</string>\n    <string name=\"notification_service_starting\">Il servizio Shizuku si sta avviando…</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s sta richiedendo Shizuku legacy</string>\n    <string name=\"permission_warning_template\">Consentire a <b>%1$s</b> di %2$s\\?</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> è stato copiato negli appunti.</string>\n    <string name=\"rish_description\">Con %1$s, in qualsiasi app terminale, puoi connetterti e interagire con la shell eseguita da Shizuku. &lt;p&gt;Per info sull\\'utilizzo dettagliato di %1$s, tocca per visualizzare il documento.</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Ricerca del servizio di accoppiamento</string>\n    <string name=\"terminal_tutorial_2_description\">Ad esempio, se vuoi utilizzare Shizuku in %1$s, devi sostituire %2$s con %3$s (%4$s è il nome del pacchetto di %1$s).</string>\n    <string name=\"terminal_tutorial_3\">Infine, sposta i file in un punto in cui l\\'app del terminale può accedere, così sarai in grado di utilizzare %1$s per eseguire comandi tramite Shizuku.</string>\n    <string name=\"terminal_tutorial_3_description\">Alcuni suggerimenti: concedi il permesso di esecuzione a %1$s e aggiungilo a %2$s, così potrai utilizzare %1$s direttamente.</string>\n    <string name=\"settings_user_interface\">Aspetto</string>\n    <string name=\"settings_black_night_theme\">Tema nero notte</string>\n    <string name=\"settings_startup\">Avvio</string>\n    <string name=\"settings_translation_contributors\">Contributori alla traduzione</string>\n    <string name=\"settings_start_on_boot\">Avvia all\\'accensione (root)</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nè stato copiato negli appunti.</string>\n    <string name=\"settings_use_system_color\">Usa il colore del tema di sistema</string>\n    <string name=\"action_about\">Info</string>\n    <string name=\"about_view_source_code\">Visualizza il codice sorgente a %s</string>\n    <string name=\"dialog_stop_message\">Il servizio Shizuku verrà interrotto.</string>\n    <string name=\"notification_service_start_failed\">Avvio del servizio Shizuku non riuscito.</string>\n    <string name=\"notification_service_start_no_root\">Impossibile richiedere i permessi di root.</string>\n    <string name=\"notification_working\">Esecuzione…</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Ora puoi avviare il servizio Shizuku.</string>\n    <string name=\"notification_adb_pairing_retry\">Riprova</string>\n    <string name=\"permission_label\">accesso Shizuku</string>\n    <string name=\"permission_description\">Consenti all\\'app di usare Shizuku.</string>\n    <string name=\"grant_dialog_button_deny\">Nega</string>\n    <string name=\"starter\">Accensione</string>\n    <string name=\"notification_channel_adb_pairing\">Accoppiamento debug wireless</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Inserire codice di associazione</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Servizio di accoppiamento trovato</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Interrompi la ricerca</string>\n    <string name=\"notification_adb_pairing_working_title\">Accoppiamento in corso</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Accoppiato con successo</string>\n    <string name=\"notification_adb_pairing_failed_title\">Accoppiamento non riuscito</string>\n    <string name=\"start_with_root_failed\">Impossibile avviare il servizio poiché i permessi di root non sono stati concessi o questo dispositivo non è rootato.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Impossibile avviare il browser</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s non supporta il moderno Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\">Shizuku legacy è stato deprecato a marzo 2019. Inoltre, Shizuku legacy non funziona sui sistemi Android più recenti.&lt;p&gt;Chiedi allo sviluppatore&lt;b&gt;%1$s&lt;/b&gt; di aggiornare.</string>\n    <string name=\"home_adb_is_limited_title\">Devi fare un passo in più</string>\n    <string name=\"home_adb_is_limited_description\">Il produttore del dispositivo dispone di autorizzazioni adb limitate e le app che utilizzano Shizuku non funzioneranno correttamente.\n\\n\n\\nDi solito, questa limitazione può essere rimossa regolando alcune opzioni in \\\"Opzioni sviluppatore\\\". Si prega di leggere la guida per i dettagli su come eseguire questa operazione.\n\\n\n\\nPotrebbe essere necessario riavviare Shizuku per rendere effettiva l\\'operazione.</string>\n    <string name=\"home_app_management_empty\">Le app che hanno richiesto o dichiarato Shizuku verranno visualizzate qui</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Prova a disabilitare e abilitare \\\"Debug Wireless\\\" se continua a cercare.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_status_service_version\">Version %2$s, %1$s</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nはクリップボードにコピーされました。</string>\n    <string name=\"toast_copied_to_clipboard_with_text\">&lt;b&gt;%s&lt;/b&gt; はクリップボードにコピーされました。</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Shizukuを開く</string>\n    <string name=\"home_status_service_is_running\">%1$s は実行中</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">コピー</string>\n    <string name=\"home_adb_title\">コンピュータに接続して開始する</string>\n    <string name=\"grant_dialog_button_deny\">許可しない</string>\n    <string name=\"grant_dialog_button_allow_always\">常に許可</string>\n    <string name=\"permission_warning_template\">&lt;b&gt;%1$s&lt;/b&gt; に「%2$s」を許可しますか？</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"other\">承認された %d 個のアプリケーション</item>\n    </plurals>\n    <string name=\"dialog_requesting_legacy_title\">%1$s は古いバージョンのShizukuを要求しています</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt;は最新のShizukuをサポートしていますが、古いバージョンのShizukuを要求しています。これは、Shizukuが実行されていない可能性があります。Shizukuアプリで確認してください。&lt;p&gt;古いバージョンのShizukuは2019年3月から非推奨となっています。</string>\n    <string name=\"terminal_tutorial_3_description\">ヒント: %1$s に実行権限を与え、それを %2$s に追加すると、%1$s を直接使用できるようになります。</string>\n    <string name=\"terminal_tutorial_3\">最後に、ファイルをターミナルアプリがアクセスできる場所に移動させると、%1$sを使ってShizukuでコマンドを実行できるようになります。</string>\n    <string name=\"terminal_tutorial_2_description\">例えば、%1$sでShizukuを使いたい場合は、%2$sを%3$sに置き換えてください（%4$sは%1$sのパッケージ名です）。</string>\n    <string name=\"terminal_tutorial_2\">その後、任意のテキストエディタで%1$sを開いて編集します。</string>\n    <string name=\"terminal_export_files\">ファイルのエクスポート</string>\n    <string name=\"terminal_tutorial_1_description\">選択したフォルダー内に同名のファイルがある場合は、そのファイルは削除されます。\n\\n\n\\nエクスポート機能には、SAF（Storage Access Framework）が使用されています。MIUIではSAFの機能が壊れることが報告されています。MIUIをお使いの方は、Shizukuのapkからファイルを抽出するか、GitHubからダウンロードする必要があるかもしれません。</string>\n    <string name=\"terminal_tutorial_1\">まず、ファイルを任意の場所にエクスポートします。%1$sと%2$sの2つのファイルがあります。</string>\n    <string name=\"home_terminal_title\">ターミナルアプリで「Shizuku」を利用する</string>\n    <string name=\"home_terminal_description\">Shizukuを介して、好きなターミナルアプリでコマンドを実行する</string>\n    <string name=\"home_app_management_title\">アプリケーション管理</string>\n    <string name=\"home_app_management_view_authorized_apps\">タップで許可されたアプリを管理</string>\n    <string name=\"home_learn_more_title\">Shizukuについて学ぶ</string>\n    <string name=\"home_root_button_start\">開始</string>\n    <string name=\"home_root_button_restart\">再起動</string>\n    <string name=\"home_root_description\">また、起動時にShizukuを自動的に起動することもできます。もし、起動しない場合は、システムやサードパーティのツールがShizukuを制限していないか確認してください。&lt;br&gt;一部古い情報ですが%sを参考にしてください。</string>\n    <string name=\"adb_pair_required\">まずはペアリングの手順を行ってください。</string>\n    <string name=\"development_settings\">開発者向けオプション</string>\n    <string name=\"home_root_title\">開始(Root化された端末の場合のみ)</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">システムではペアリングダイアログが常に表示されている必要があり、このアプリとシステムダイアログを同時に表示させるには、分割画面を使用するしかありません。</string>\n    <string name=\"adb_error_key_store\">ワイヤレスデバッグ用のキーを生成できません。\n\\nこれは、お使いのデバイスのキーストアの仕組みが壊れているためと思われます。</string>\n    <string name=\"adb_pairing_requires_multi_window\">最初に分割画面（マルチウィンドウ）モードに入ってください。</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">ワイヤレスデバッグが有効になっていません。\n\\nなお、Android 11以前のバージョンでは、ワイヤレスデバッグを有効化するためには、コンピューターの接続が必要です。</string>\n    <string name=\"dialog_adb_pairing_message\">以下の手順でペアリングを開始してください。「開発者向けオプション」＞「ワイヤレスデバッグ」＞「ペア設定コードによるデバイスのペアの設定」を選択します。\n\\n\n\\nペアリング処理が開始されると、ペアリングコードの入力が可能になります。</string>\n    <string name=\"dialog_adb_pairing_discovery\">ペアリングサービスの検索</string>\n    <string name=\"dialog_adb_pairing_paring_code\">ペアリングコード</string>\n    <string name=\"paring_code_is_wrong\">ペアリングコードが間違っています。</string>\n    <string name=\"cannot_connect_port\">ワイヤレスデバッグサービスに接続することができません。</string>\n    <string name=\"dialog_adb_port\">ポート</string>\n    <string name=\"dialog_adb_invalid_port\">ポートは1から65535までの整数です。</string>\n    <string name=\"adb_pairing\">ペアリング</string>\n    <string name=\"dialog_adb_pairing_title\">デバイスとのペアリング</string>\n    <string name=\"dialog_adb_discovery\">ワイヤレスデバッグサービスの検索</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">送信</string>\n    <string name=\"home_wireless_adb_title\">ワイヤレスデバッグで開始</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* 他にもいくつか注意点がありますので、まずはヘルプを読んで確認してください。</string>\n    <string name=\"home_adb_button_view_help\">ヘルプ</string>\n    <string name=\"home_adb_button_view_command\">コマンドを表示する</string>\n    <string name=\"home_adb_description\">root権限を持たないデバイスの場合、adbを使ってShizukuを起動する必要があります（コンピュータへの接続が必要）。この作業は、端末を再起動するたびに繰り返す必要があります。<b><a href=\"%1$s\">詳しくはヘルプをお読みください</a></b>。</string>\n    <string name=\"home_root_description_sui\">Magiskをお使いの方は、%1$sをお試しください。rootユーザにとっては、最終的にShizukuを置き換えることになるでしょう。なお、%2$sを使用するには、既存のアプリケーションを少し変更する必要があります。</string>\n    <string name=\"dialog_adb_discovery_message\">「開発者向けオプション」で「ワイヤレスデバッグ」を有効にしてください。ネットワークが変更されると、「ワイヤレスデバッグ」は自動的に無効になります。\n\\n\n\\n注意:「開発者向けオプション」や「USBデバッグ」を無効にしないでください。無効にすると、Shizukuが停止してしまいます。</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s は最新の Shizuku をサポートしていません</string>\n    <string name=\"dialog_legacy_not_support_message\">古いバージョンのShizukuは2019年3月より非推奨となりました。また、古いバージョンのShizukuは新しいAndroidシステムでは動作しません。&lt;p&gt;&lt;b&gt;%1$s&lt;/b&gt;の開発者にアップデートを依頼してください。</string>\n    <string name=\"home_status_service_not_running\">%1$s は停止中</string>\n    <string name=\"home_status_service_version_update\">バージョン %2$s, %1$s&lt;br&gt;バージョン %3$s にアップデートするには、再度起動してください</string>\n    <string name=\"translation_contributors\">IMES-mitutti</string>\n    <string name=\"home_learn_more_description\">Shizukuを使った開発方法、Shizukuを使ったアプリの入手方法について学ぶことができます</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">adbの権限が制限されています</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">端末の製造元がadbの権限を制限している可能性が高いです。&lt;p&gt; &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;このドキュメント&lt;/a&gt;&lt;/b&gt;の中に、あなたのシステムに合った解決策があるかもしれません。</string>\n    <string name=\"app_management_item_summary_requires_root\">* root権限でShizukuを実行する必要があります</string>\n    <string name=\"about_view_source_code\">%sでソースコードを見る</string>\n    <string name=\"action_stop\">Shizukuを停止する</string>\n    <string name=\"settings_title\">設定</string>\n    <string name=\"settings_language\">言語</string>\n    <string name=\"settings_black_night_theme\">Black night テーマ</string>\n    <string name=\"settings_user_interface\">外観</string>\n    <string name=\"settings_black_night_theme_summary\">ナイトモードが有効な場合、黒色のテーマを使用します</string>\n    <string name=\"settings_startup\">スタートアップ</string>\n    <string name=\"settings_translation_contributors\">翻訳協力者</string>\n    <string name=\"settings_translation\">翻訳作業に参加</string>\n    <string name=\"settings_translation_summary\">%sをあなたの言語に翻訳するのを手伝ってください</string>\n    <string name=\"settings_start_on_boot\">起動時にスタート（要root)</string>\n    <string name=\"settings_start_on_boot_summary\">root化された端末では、起動時に自動的にShizukuを起動できます</string>\n    <string name=\"action_about\">このアプリについて</string>\n    <string name=\"dialog_stop_message\">Shizukuのサービスを停止します。</string>\n    <string name=\"notification_channel_service_status\">サービス開始状況</string>\n    <string name=\"notification_service_starting\">Shizukuを開始しています…</string>\n    <string name=\"notification_service_start_failed\">Shizukuを開始することができませんでした。</string>\n    <string name=\"notification_service_start_no_root\">root権限の要求に失敗しました。</string>\n    <string name=\"notification_working\">実行中…</string>\n    <string name=\"permission_description\">アプリでShizukuの使用を許可します。</string>\n    <string name=\"start_with_root_failed\">root権限が付与されていないか、端末がroot化されていないため、サービスを開始できません。</string>\n    <string name=\"permission_label\">Shizukuにアクセスする</string>\n    <string name=\"starter\">起動</string>\n    <string name=\"dialog_cannot_open_browser_title\">ブラウザが起動することができません</string>\n    <string name=\"rish_description\">%1$sを使えば、任意のターミナルアプリで、Shizukuが実行するシェルに接続し、対話することができます。&lt;p&gt;詳しい使い方については、%1$sをタップするとドキュメントが表示されます。</string>\n    <string name=\"home_wireless_adb_description\">Android 11以上ではワイヤレスデバッグを有効にして、コンピュータに接続することなくデバイスから直接Shizukuを起動できます。&lt;p&gt;詳しくはガイドをご覧ください。</string>\n    <string name=\"notification_settings\">通知オプション</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Android 11以前では、ワイヤレスデバッグを有効にするためにパソコンとの接続が必要です。</string>\n    <string name=\"home_wireless_adb_view_guide_button\">ガイド</string>\n    <string name=\"notification_adb_pairing_working_title\">ペアリング中</string>\n    <string name=\"notification_adb_pairing_succeed_title\">ペアリングしました</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">「開発者向けオプション」&gt;「ワイヤレスデバック」を選択し、「ペア設定コードによるデバイスのペア設定」をタップすると、6桁のコードが表示されます。</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Shizukuからの通知でペアリングが完了します。</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">通知にコードを入力してペアリングします。</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">MIUIユーザーはシステムの設定から「通知」→「通知のシェード」から通知スタイルを「Android」に変更する必要がある場合があります。</string>\n    <string name=\"notification_channel_adb_pairing\">ワイヤレスデバックペアリング</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">ペアリングコードを入力</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">ペアリングサービスを探しています</string>\n    <string name=\"notification_adb_pairing_stop_searching\">探すことを停止しています</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Shizukuサービスをスタートさせられます。</string>\n    <string name=\"notification_adb_pairing_failed_title\">ペアリングに失敗しました</string>\n    <string name=\"notification_adb_pairing_retry\">再試行</string>\n    <string name=\"adb_pairing_tutorial_title\">お使いのデバイスとShizukuをペアリングする</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">ペアリング手順はShizukuからの通知を操作する必要があります。Shizukuからの通知を許可してください。</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Shizukuに戻り、スタートします。</string>\n    <string name=\"notification_adb_pairing_service_found_title\">ペアリングサービスを見つけました</string>\n    <string name=\"settings_use_system_color\">システムテーマカラー</string>\n    <string name=\"home_adb_is_limited_title\">もう一段階行う必要がある</string>\n    <string name=\"home_app_management_empty\">Shizukuを権限をリクエストしたアプリはここに表示されます。</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">一部のシステム（MIUIなど）では、アプリが標準でフォアグラウンドサービスを使用していても、アプリが表示されていないときはネットワークにアクセスすることを許可しないようになっています。そのようなシステムでは、Shizukuのバッテリー最適化機能を無効にしてください。</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizukuはローカルネットワークにアクセスする必要があります。ネットワーク権限で管理されています。</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">なお、「ワイヤレスデバッグ」オプションの左側はクリック可能で、タップすると新しいページが表示されます。右側のスイッチだけをオンにするのは誤りです。</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">場合によっては、通知からペアリングコードを入力できないことがあります。</string>\n    <string name=\"home_adb_is_limited_description\">お使いの端末製造元は adb 権限を制限しており､ Shizuku を使用するアプリは正しく動作しません。\n\\n\n\\n通常､ この制限は「開発者向けオプション」のいくつかの項目を調整することで解除できます。これを行う方法の詳細については､ ヘルプをお読みください。\n\\n\n\\n操作を有効にするために､ Shizukuを再起動する必要がある場合があります。</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">検索され続ける場合は、「ワイヤレスデバッグ」の無効化と有効化をしてみてください。</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ka/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_adb_button_view_command\">ბრძანების ნახვა</string>\n    <string name=\"home_adb_button_view_help\">წაიკითხეთ დახმარება</string>\n    <string name=\"home_adb_description\">არა დარუთული მოწყობილობებისთვის, Shizuku რომ ჩართო შენ გჭირდება ადბ-ს გამოყენება(საჭიროებს კომპიუტერთან კავშირს). ეს პროცესი უნდა გაიმეოროთ თქვენი მოწყობილობის ყოველ გადატვირთვაზე. გთხოვთ <b><a href=\"%1$s\">წაიკითხოთ დახმარება</a></b>.</string>\n    <string name=\"home_adb_title\">დაიწყე კომპიუტერთან დაკავშირებით</string>\n    <string name=\"home_status_service_version_update\">ვერსია %2$, %1$&lt;br&gt;თავიდან ჩართე, რომ განაახლო %3$s ვერსიაზე</string>\n    <string name=\"home_status_service_version\">ვერსია</string>\n    <string name=\"home_status_service_not_running\">არ მუშაობს</string>\n    <string name=\"home_status_service_is_running\">მთავარი-სტატუსი</string>\n    <string name=\"translation_contributors\">მთარგმნელები</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-kk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-km/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-kn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_adb_pairing_message\">\\\"개발자 옵션\\\" - \\\"무선 디버깅\\\" - \\\"페어링 코드로 기기 페어링\\\" 순으로 페어링을 시작해주세요.\n\\n\n\\n페어링이 시작되면, 페어링 코드를 입력할 수 있습니다.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">시스템에서 페어링 대화 상자를 항상 표시하도록 해야합니다. 화면 분할을 사용하는 것이 앱과 시스템 대화 상자를 동시에 표시할 수 있는 유일한 방법입니다.</string>\n    <string name=\"home_status_service_not_running\">%1$s가 실행 중이 아닙니다</string>\n    <string name=\"translation_contributors\">&lt;a href=https://github.com/Kimjio&gt;Kimjio&lt;/a&gt;</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* 몇 가지 다른 참고 사항이 있으므로, 도움말을 먼저 확인하세요.</string>\n    <string name=\"home_adb_button_view_help\">도움말 읽기</string>\n    <string name=\"home_adb_button_view_command\">명령어 보기</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">복사</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">보내기</string>\n    <string name=\"home_wireless_adb_title\">무선 디버깅으로 시작</string>\n    <string name=\"dialog_adb_discovery\">무선 디버깅 서비스 검색 중</string>\n    <string name=\"adb_pairing_requires_multi_window\">먼저 화면 분할 (멀티 윈도우) 모드로 진입하세요.</string>\n    <string name=\"adb_error_key_store\">무선 디버깅을 위한 키를 생성할 수 없습니다.\n\\n기기의 KeyStore 메커니즘 손상이 원인일 수 있습니다.</string>\n    <string name=\"dialog_adb_port\">포트 번호</string>\n    <string name=\"dialog_adb_invalid_port\">포트 번호는 1에서 65535 사이의 정수입니다.</string>\n    <string name=\"adb_pairing\">페어링</string>\n    <string name=\"dialog_adb_pairing_title\">기기와 페어링</string>\n    <string name=\"dialog_adb_pairing_paring_code\">페어링 코드</string>\n    <string name=\"paring_code_is_wrong\">페어링 코드가 올바르지 않습니다.</string>\n    <string name=\"cannot_connect_port\">무선 디버깅 서비스에 연결할 수 없습니다.</string>\n    <string name=\"dialog_adb_pairing_discovery\">페어링 서비스 검색 중</string>\n    <string name=\"adb_pair_required\">페어링 단계를 먼저 진행하세요.</string>\n    <string name=\"development_settings\">개발자 옵션</string>\n    <string name=\"home_root_title\">시작 (루팅된 기기용)</string>\n    <string name=\"home_root_description\">Shizuku는 부팅 시 자동으로 시작됩니다. 그렇지 않을 경우, 시스템 또는 제 3자 도구에서 Shizuku를 제한하고 있는지 확인하세요.&lt;br&gt;%s를 참조할 수 있습니다.</string>\n    <string name=\"home_root_button_start\">시작</string>\n    <string name=\"home_root_button_restart\">재시작</string>\n    <string name=\"home_app_management_title\">어플리케이션 관리</string>\n    <string name=\"home_app_management_view_authorized_apps\">탭하여 인증된 앱 관리</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"other\">%d개 앱 인증됨</item>\n    </plurals>\n    <string name=\"home_learn_more_title\">Shizuku 알아보기</string>\n    <string name=\"settings_title\">설정</string>\n    <string name=\"home_learn_more_description\">Shizuku로 개발하는 방법 알아보기</string>\n    <string name=\"app_management_item_summary_requires_root\">* 루트 권한으로 실행된 Shizuku 필요</string>\n    <string name=\"notification_working\">진행 중…</string>\n    <string name=\"settings_startup\">시작</string>\n    <string name=\"settings_translation_contributors\">번역 기여자</string>\n    <string name=\"settings_translation\">번역 참여</string>\n    <string name=\"action_about\">정보</string>\n    <string name=\"about_view_source_code\">%s에서 소스코드 보기</string>\n    <string name=\"action_stop\">Shizuku 중지</string>\n    <string name=\"dialog_stop_message\">Shizuku 서비스가 중지됩니다.</string>\n    <string name=\"notification_channel_service_status\">서비스 시작 상태</string>\n    <string name=\"notification_service_starting\">Shizuku 서비스가 시작 중입니다…</string>\n    <string name=\"settings_user_interface\">화면</string>\n    <string name=\"permission_label\">Shizuku에 접근</string>\n    <string name=\"notification_service_start_no_root\">루트 권한을 요청하지 못했습니다.</string>\n    <string name=\"settings_start_on_boot\">부팅 시 시작 (루팅)</string>\n    <string name=\"settings_start_on_boot_summary\">루팅된 기기의 경우, Shizuku는 부팅 시 자동으로 시작할 수 있습니다</string>\n    <string name=\"settings_translation_summary\">%s를 당신의 언어로 번역할 수 있도록 도와주세요</string>\n    <string name=\"start_with_root_failed\">루트 권한이 부여되지 않았거나 이 기기가 루팅되지 않아서 서비스를 시작할 수 없습니다.</string>\n    <string name=\"dialog_cannot_open_browser_title\">브라우저를 실행할 수 없음</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\n클립보드로 복사됨.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\">&lt;b&gt;%s&lt;/b&gt;가 클립보드로 복사되었습니다.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s가 구형 Shizuku를 요청하고 있음</string>\n    <string name=\"settings_black_night_theme\">검은 테마</string>\n    <string name=\"starter\">실행기</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Shizuku 열기</string>\n    <string name=\"home_status_service_is_running\">%1$s가 실행 중입니다</string>\n    <string name=\"home_adb_title\">컴퓨터에 연결하여 시작</string>\n    <string name=\"dialog_adb_discovery_message\">\\\"개발자 옵션\\\"에서 \\\"무선 디버깅\\\"을 사용으로 설정하세요. \\\"무선 디버깅\\\"은 네트워크가 변경될 때 자동으로 사용 안 함으로 변경됩니다.\n\\n\n\\n\\\"개발자 옵션\\\"이나 \\\"USB 디버깅\\\"을 사용 안 함으로 하면 Shizuku가 중지됩니다.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">무선 디버깅을 사용하고 있지 않습니다.\n\\n안드로이드 11 이전은 무선 디버깅을 사용하기 위해서 컴퓨터 연결을 필수로 해야 합니다.</string>\n    <string name=\"settings_language\">언어</string>\n    <string name=\"settings_black_night_theme_summary\">어두운 테마가 사용될 때 검은 테마를 사용</string>\n    <string name=\"notification_service_start_failed\">Shizuku 서비스를 시작할 수 없습니다.</string>\n    <string name=\"home_status_service_version\">%1$s, 버전 %2$s</string>\n    <string name=\"home_adb_description\">루링 없이 Shizuku를 시작하기 위해 adb가 필요합니다. (컴퓨터 연결 필수) 이 작업은 다시 시작 시 마다 필요로 합니다. 자세한 정보는 <b><a href=\"%1$s\">도움말</a></b>을 확인하세요.</string>\n    <string name=\"home_status_service_version_update\">%1$s, 버전 %2$s&lt;br&gt;다시 시작하여 버전 %3$s로 업데이트</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">ADB의 권한이 제한됨</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">기기 제조사에서 ADB의 권한을 제한하고 있을 가능성이 높습니다.&lt;p&gt;&lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;이 문서&lt;/a&gt;&lt;/b&gt;에 시스템에 대한 해결 방안이 있을 수 있습니다.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s는 최신 Shizuku를 지원하지 않음</string>\n    <string name=\"dialog_legacy_not_support_message\">구형 Shizuku는 2019년 3월에 지원이 중단되었습니다. 또한, 구형 Shizuku는 새로운 안드로이드 시스템에서 동작하지 않습니다.&lt;p&gt;&lt;b&gt;%1$s&lt;/b&gt; 개발자에게 업데이트를 문의하세요.</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt;가 최신 Shizuku를 지원하지만, 구형 Shizuku를 요청하고 있습니다. Shizuku가 실행 중이지 않아서 발생할 수 있으니 Shizuku 앱에서 확인하세요.&lt;p&gt;구형 Shizuku는 2019년 3월 부터 지원이 중단되었습니다.</string>\n    <string name=\"grant_dialog_button_allow_always\">항상 허용</string>\n    <string name=\"grant_dialog_button_deny\">거부</string>\n    <string name=\"permission_warning_template\"><b>%1$s</b>을(를) %2$s에 허용하시겠습니까\\?</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Shizuku의 알림이 페어링을 완료하는 데 도움이 될 수도 있습니다.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">알림에 코드를 입력하면 페어링이 완료됩니다.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">MIUI 사용자는 시스템 설정의 \\\"알림\\\" - \\\"알림 창\\\"에서 알림 스타일을 \\\"Android\\\"로 전환해야 합니다.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">그렇지 않으면 알림에서 페어링 코드를 입력하지 못할 수 있습니다.</string>\n    <string name=\"terminal_tutorial_1_description\">선택한 폴더에 같은 이름의 파일이 있으면 삭제됩니다.\n\\n\n\\n내보내기 기능은 SAF(Storage Access Framework)를 사용합니다. MIUI가 SAF의 기능을 중단시키는 것으로 보고되었습니다. MIUI를 사용하는 경우 Shizuku의 apk에서 파일을 추출하거나 GitHub에서 다운로드해야 할 수 있습니다.</string>\n    <string name=\"terminal_export_files\">파일 내보내기</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">페어링 서비스 검색중</string>\n    <string name=\"notification_adb_pairing_failed_title\">페어링 실패</string>\n    <string name=\"permission_description\">앱이 Shizuku를 사용하도록 허용합니다.</string>\n    <string name=\"terminal_tutorial_2_description\">예를 들어, %1$s에서 Shizuku를 사용하려면 %2$s를 %3$s로 바꿔야 합니다(%4$s는 %1$s의 패키지 이름입니다).</string>\n    <string name=\"rish_description\">%1$s를 사용하면 모든 터미널 앱에서 Shizuku가 실행하는 셸에 연결하고 상호 작용할 수 있습니다. &lt;p&gt;자세한 사용법 %1$s에 대해 문서를 보려면 탭하세요.</string>\n    <string name=\"terminal_tutorial_2\">그런 다음 텍스트 편집기를 사용하여 %1$s을 열고 편집하십시오.</string>\n    <string name=\"terminal_tutorial_3\">마지막으로 터미널 앱이 액세스할 수 있는 위치로 파일을 이동하면 %1$s를 사용하여 Shizuku를 통해 명령을 실행할 수 있습니다.</string>\n    <string name=\"terminal_tutorial_3_description\">몇 가지 팁: %1$s에 실행 권한을 부여하고 %2$s에 추가하면 %1$s를 직접 사용할 수 있습니다.</string>\n    <string name=\"notification_channel_adb_pairing\">무선 디버깅 페어링</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">페어링 코드 입력</string>\n    <string name=\"adb_pairing_tutorial_title\">기기와 Shizuku 페어링</string>\n    <string name=\"notification_adb_pairing_working_title\">페어링 진행 중</string>\n    <string name=\"notification_adb_pairing_succeed_title\">페어링 성공</string>\n    <string name=\"notification_adb_pairing_succeed_text\">지금 Shizuku 서비스를 시작할 수 있습니다.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">\\\"개발자 옵션\\\" - \\\"무선 디버깅\\\"을 선택합니다. \\\"페어링 코드로 장치 페어링\\\"을 탭하면 6자리 코드가 표시됩니다.</string>\n    <string name=\"home_wireless_adb_description\">Android 11 또는 그 이상 버전에서는 컴퓨터에 연결하지 않아도 무선 디버깅을 활성화하하여 기기에서 직접 Shizuku를 시작할 수 있습니다.&lt;p&gt;단계별 가이드를 먼저 확인하세요.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Android 11 이전에서는 무선 디버깅을 활성화하기 위해 컴퓨터에 연결해야 합니다.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">단계별 가이드</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Shizuku로 돌아가서 Shizuku를 시작하세요.</string>\n    <string name=\"notification_adb_pairing_service_found_title\">페어링 서비스를 찾았습니다</string>\n    <string name=\"notification_adb_pairing_stop_searching\">검색 중지</string>\n    <string name=\"notification_adb_pairing_retry\">재시도</string>\n    <string name=\"notification_settings\">알림 옵션</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">페어링 프로세스에서는 Shizuku의 알림과 상호 작용해야 합니다. Shizuku가 알림을 게시하도록 허용하십시오.</string>\n    <string name=\"home_root_description_sui\">Magisk를 사용하는 경우 %1$s 을 사용해 볼 수 있습니다. 루팅 사용자의 경우 결국 Shizuku를 대체하게 됩니다. %2$s를 사용하려면 기존 어플리케이션을 약간 변경해야 합니다.</string>\n    <string name=\"home_terminal_title\">터미널에서 Shizuku 사용</string>\n    <string name=\"home_terminal_description\">좋아하는 터미널 앱에서 Shizuku를 통해 명령 실행</string>\n    <string name=\"terminal_tutorial_1\">먼저 원하는 곳으로 파일을 내보냅니다. %1$s 및 %2$s의 두 파일을 찾을 수 있습니다.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">\\\"무선 디버깅\\\" 옵션의 왼쪽 부분을 클릭할 수 있으며, 탭하면 새 페이지가 열립니다. 오른쪽의 스위치를 켜는 것만으로는 올바르지 않습니다.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku는 로컬 네트워크에 액세스해야 합니다. 네트워크 권한에 의해 제어됩니다.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">일부 시스템(예: MIUI)은 앱이 포그라운드 서비스를 표준으로 사용하더라도 앱이 보이지 않을 때 네트워크에 액세스하는 것을 허용하지 않습니다. 이러한 시스템에서 Shizuku의 배터리 최적화 기능을 비활성화하세요.</string>\n    <string name=\"home_adb_is_limited_description\">디바이스 제조업체에서 ADB 권한을 제한하여 Shizuku를 사용하는 앱이 제대로 작동하지 않습니다.\n\\n\n\\n일반적으로 \\'개발자 옵션\\'에서 일부 옵션을 조정하여 이 제한을 해제할 수 있습니다. 자세한 방법은 도움말을 참조하세요.\n\\n\n\\n작업을 적용하려면 Shizuku를 다시 시작해야 할 수도 있습니다.</string>\n    <string name=\"settings_use_system_color\">시스템 테마 색상 사용</string>\n    <string name=\"home_adb_is_limited_title\">추가 단계를 진행해야 합니다</string>\n    <string name=\"home_app_management_empty\">Shizuku에 요청 또는 선언한 앱들이 여기에 표시됩니다.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">\\\"무선 디버깅\\\"이 검색중으로 유지된다면 비활성화했다가 다시 활성화해 보세요.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-lb/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-lv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-mk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-ml/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-ms/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_status_service_version\">Versi %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s tidak berjalan</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Sistem memerlukan dialog berpasangan sentiasa kelihatan, menggunakan mod skrin pisah ialah satu-satunya cara untuk membolehkan apl dan dialog sistem ini kelihatan serentak.</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Hantar</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Salin</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-my/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-night/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"AppTheme\" parent=\"Theme\"/>\n\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-nl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_status_service_version\">Versie %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s is niet actief</string>\n    <string name=\"home_status_service_is_running\">%1$s is actief</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-or/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-pl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_adb_title\">Uruchom poprzez podłączenie do komputera</string>\n    <string name=\"home_status_service_version_update\">Wersja %2$s, %1$s&lt;br&gt;Uruchom ponownie aby uaktualnić do wersji %3$s</string>\n    <string name=\"home_status_service_version\">Wersja %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s nie działa</string>\n    <string name=\"home_status_service_is_running\">%1$s działa</string>\n    <string name=\"home_adb_button_view_command\">Zobacz komendę</string>\n    <string name=\"home_adb_description\">Dla urządzeń bez roota musisz użyć adb aby uruchomić Shizuku (wymaga podłączenia do komputera). Ten proces musi być powtarzany za każdym razem kiedy urządzenie jest uruchamiane ponownie. <b><a href=\"%1$s\">Przeczytaj o tym artykuł</a></b>.</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"home_wireless_adb_title\">Uruchom przez debugowanie bezprzewodowe</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Wyślij</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopiuj</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Debugowanie bezprzewodowe jest wyłączone.\n\\nPrzed Android 11 żeby włączyć debugowanie bezprzewodowe musisz mieć polączenie z komputerem.</string>\n    <string name=\"notification_service_starting\">Usługa Shizuku się uruchamia…</string>\n    <string name=\"action_stop\">Zatrzymaj Shizuku</string>\n    <string name=\"action_about\">O aplikacji</string>\n    <string name=\"settings_start_on_boot\">Uruchom przy starcie systemu (tylko dla urządzeń z rootem)</string>\n    <string name=\"settings_black_night_theme\">Motyw ciemny</string>\n    <string name=\"settings_black_night_theme_summary\">Użyj czysto-czarnego motywu gdy tryb nnocny jest włączony</string>\n    <string name=\"settings_language\">Język</string>\n    <string name=\"settings_title\">Ustawienia</string>\n    <string name=\"home_root_title\">Start (dla urządzeń zrootowanych)</string>\n    <string name=\"development_settings\">Opcje developerskie</string>\n    <string name=\"adb_pair_required\">Najpierw przejdż przez krok parowania.</string>\n    <string name=\"cannot_connect_port\">Nie można połączyć usługi bezprzewodowego debugowania.</string>\n    <string name=\"paring_code_is_wrong\">Kod parowania jest błędny.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Kod parowania</string>\n    <string name=\"dialog_adb_pairing_discovery\">Szukanie usługi parowania</string>\n    <string name=\"dialog_adb_pairing_title\">Sparuj z urządzeniem</string>\n    <string name=\"adb_pairing\">Parowanie</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Otwórz Shizuku</string>\n    <string name=\"dialog_cannot_open_browser_title\">Nie można uruchomić przeglądarki</string>\n    <string name=\"start_with_root_failed\">Nie można uruchomić usługi ponieważ nie przyznano uprawnień root lub urządzenie nie jest zrootowane.</string>\n    <string name=\"home_app_management_view_authorized_apps\">Kliknij aby zarządzać autoryzowanymi aplikacjami</string>\n    <string name=\"home_app_management_title\">Zarządzanie aplikacjami</string>\n    <string name=\"home_root_button_restart\">Restart</string>\n    <string name=\"home_root_button_start\">Start</string>\n    <string name=\"translation_contributors\">Gabriel Markowski, Piotr Pietrzak (YT:IeFHC233)</string>\n    <string name=\"dialog_adb_discovery\">Szukanie usługi bezprzewodowego debugowania</string>\n    <string name=\"home_adb_button_view_help\">Przeczytaj pomoc</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nzostał skopiowany do schowka.</string>\n    <string name=\"notification_working\">Działa…</string>\n    <string name=\"notification_service_start_failed\">Błąd przy starcie usługi Shizuku.</string>\n    <string name=\"settings_startup\">Rozruch</string>\n    <string name=\"app_management_item_summary_requires_root\">* wymaga by Shizuku działało z rootem</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Uprawnienia adb są ograniczone</string>\n    <string name=\"home_learn_more_title\">Dowiedz się więcej o Shizuku</string>\n    <string name=\"dialog_adb_discovery_message\">Proszę włączyć \\\"Debugowanie bezprzewodowe\\\" w \\\"Ustawieniach developerskich\\\". Debugowanie bezprzewodowe jest automatycznie wyłączane gdy przełączasz się między sieciami.\n\\n\n\\nNIE wyłączaj \\\"Ustawień developerskich\\\" lub \\\" Debugowania USB\\\" ponieważ jest wymagane do prawidłowego działania Shizuku.</string>\n    <string name=\"permission_label\">Dostęp Shizuku</string>\n    <string name=\"grant_dialog_button_allow_always\">Zawsze zezwalaj</string>\n    <string name=\"grant_dialog_button_deny\">Odmów</string>\n    <string name=\"permission_warning_template\">Zezwolić aplikacji <b>%1$s</b> na %2$s\\?</string>\n    <string name=\"dialog_adb_invalid_port\">Port to liczba całkowita z zakresu od 1 do 65535.</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;*Jest jeszcze kilka innych kwestii. Potwierdź, że najpierw przeczytałeś pomoc.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">System wymaga ciągle otwartego okna parowania, używanie trybu podzielonego ekranu jest jedyną opcją aby korzystać z aplikacji i okna parowania w jednej chwili.</string>\n    <string name=\"terminal_export_files\">Eksportuj pliki</string>\n    <string name=\"dialog_adb_pairing_message\">Proszę rozpocznij parowanie podejmując następujące czynności: \\\"Opcje dla programistów\\\" - \\\"Bezprzewodowe debugowanie\\\" - \\\"Sparuj urządzenie używając kodu parowania\\\".\n\\n\n\\nPo rozpoczęciu procesu parowania będziesz w stanie wpisać kod parowania.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Proszę, uruchom najpierw tryb podzielonego ekranu.</string>\n    <string name=\"settings_user_interface\">Wygląd</string>\n    <string name=\"home_root_description_sui\">Jeśli używasz Magisk, możesz spróbować %1$s. Dla użytkowników roota, zamieni to Shizuku. Uwaga, istniejące aplikację muszą się dostosować by używać %2$s.</string>\n    <string name=\"home_terminal_title\">Używaj Shizuku w aplikacjach terminala</string>\n    <string name=\"home_terminal_description\">Uruchamiaj komendy przez Shizuku w aplikacjach terminala jakie lubisz</string>\n    <string name=\"home_learn_more_description\">Dowiedz się, jak programować za pomocą Shizuku</string>\n    <string name=\"terminal_tutorial_1\">Po pierwsze, Wyeksportuj pliki gdzie chcesz. Znajdziesz tam dwa pliki, %1$s i %2$s.</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Autoryzowano aplikację %d</item>\n        <item quantity=\"few\">Autoryzowano aplikacje: %d</item>\n        <item quantity=\"many\">Aktualizowano aplikacje: %d</item>\n        <item quantity=\"other\">Aktualizowano aplikacje: %d</item>\n    </plurals>\n    <string name=\"terminal_tutorial_1_description\">Jeśli są tam pliki o takich samych nazwach, zostaną one usunięte.\n\\n\n\\nFunkcja eksportowania używa SAF (Storage Access Framework). Wiemy, że MIUI psuje funkcje SAF. Jeśli używasz MIUI, lepiej będzie, gdy wypakujesz pliki z pliku APK Shizuku, lub pobierzesz je z GitHuba.</string>\n    <string name=\"terminal_tutorial_2\">Wtedy, użyj edytora tekstu, by otworzyć i wyedytować %1$s.</string>\n    <string name=\"terminal_tutorial_2_description\">Na przykład, jeśli chcesz używać Shizuku w %1$s, musisz podmienić %2$s na %3$s (%4$s jest nazwą pakietu %1$s).</string>\n    <string name=\"terminal_tutorial_3\">Na koniec, przenieś pliki gdzieś, gdzie aplikacja terminala może się dostać, będziesz mógł użyć %1$s by uruchamiać komendy przez Shizuku.</string>\n    <string name=\"terminal_tutorial_3_description\">Wskazówka: nadaj pozwolenie uruchamiania %1$s i dodaj do %2$s, mędziesz móg używać %1$s bezpośrednio.</string>\n    <string name=\"settings_translation_contributors\">Pomogli w tłumaczeniu</string>\n    <string name=\"settings_translation_summary\">Pomóż nam tłumaczyć %s na Twój język</string>\n    <string name=\"dialog_stop_message\">Usługa Shizuku zostanie zatrzymana.</string>\n    <string name=\"notification_channel_service_status\">Stan uruchomienia usługi</string>\n    <string name=\"permission_description\">Pozwól aplikacji używać Shizuku.</string>\n    <string name=\"notification_service_start_no_root\">Nie udało się uzyskać uprawnień roota.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s nie wspiera nowego Shizuku</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s żąda starego Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; ma wsparcie dla nowego Shizuku, ale żąda starego Shizuku. Może to być spowodowane tym, że Shizuku nie działa. Prosimy o sprawdzenie w aplikacji.&lt;p&gt;Stare Shizuku nie jest wspierane od marca 2019.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> został skopiowany do schowka.</string>\n    <string name=\"starter\">Uruchamiacz</string>\n    <string name=\"home_root_description\">W dodatku, Shizuku może wystartować automatycznie przy starcie systemu. Jeśli nie, sprawdź czy system lub inne narzędzia zablokowały Shizuku.&lt;br&gt;Możesz odwołać się do%s.</string>\n    <string name=\"settings_translation\">Przyłącz się do tłumaczenia</string>\n    <string name=\"settings_start_on_boot_summary\">W urządzeniach zrootowanych, Shizuku może się uruchamiać automatycznie</string>\n    <string name=\"about_view_source_code\">Zobacz kod źródłowy na %s</string>\n    <string name=\"adb_error_key_store\">Nie można wygenerować klucza debugowania bezprzewodowego.\n\\nMoże to być spowodowane tym, że mechanizm KeyStore urządzenia jest zepsuty.</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Jest duże prawdopodobieństwo, że producent urządzenia ogranicza możliwości ADB.&lt;p&gt;Może być rozwiązanie dla twojego systemu w &lt;b&gt; &lt;a href=\\\"%1$s\\\"&gt;tym dokumencie&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"rish_description\">Z %1$s, w każdej aplikacji terminala, będziesz mógł połączyć się i wykonywać interakcje z shellem działającym w Shizuku.&lt;p&gt;O szczegółowym użyciu %1$s, dotknij by pokazać dokument.</string>\n    <string name=\"dialog_legacy_not_support_message\">Stare Shizuku utraciło wsparcie w marcu 2019 roku. Oraz stare Shizuku nie działa na nowszych wersjach Androida.&lt;p&gt;Poproś developera &lt;b&gt;%1$s&lt;/b&gt; o aktualizację.</string>\n    <string name=\"home_wireless_adb_description\">Od systemu Android w wersji 11 możesz używać debugowania za pomocą sieci Wifi i za pomocą tego uruchamiać Shizuku bezpośrednio z urządzenia, bez potrzeby podłączania do komputera.&lt;p&gt;Przejrzyj instrukcje krok po kroku żeby dowiedzieć się jak to skonfigurować.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Dla systemów Android w wersji 10 i starszej wymagane jest podłączenie do komputera w celu uruchomienia debugowania za pomocą sieci Wifi.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Użytkownicy MIUI mogą potrzebować zmiany stylu powiadomień na \\\"Android\\\". Zmiana ta jest możliwa w menu ustawień systemu \\\"Powiadomienia\\\" - \\\"Styl powiadomień\\\".</string>\n    <string name=\"notification_channel_adb_pairing\">Parowanie debugowania bezprzewodowego</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Wprowadź kod parowania</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Wprowadź kod parowania w okienku powiadomienia aby ukończyć parowanie.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Powiadomienie od Shizuku pomoże w dokończeniu parowania.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Wejdź w menu \\\"Opcje programistyczne\\\" - \\\"Debugowanie bezprzewodowe\\\". Tapnij \\\"Sparuj urządzenie przy pomocy kodu parowania\\\" i zobaczysz 6-cio cyfrowy kod parowania.</string>\n    <string name=\"notification_adb_pairing_retry\">Ponów</string>\n    <string name=\"notification_adb_pairing_failed_title\">Parowanie nie powiodło się</string>\n    <string name=\"adb_pairing_tutorial_title\">Sparuj Shizuku ze swoim urządzeniem</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Instrukcja krok po kroku</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Wróć do aplikacji Shizuku i uruchom Shizuku.</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Wyszukiwanie usługi parowania</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Znaleziono usługę parowania</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Przestań szukać</string>\n    <string name=\"notification_adb_pairing_working_title\">Parowanie w trakcie</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Parowanie przebiegło pomyślnie</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Możesz teraz wystartować usługę Shizuku.</string>\n    <string name=\"notification_settings\">Ustawienia powiadomień</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Proces parowania wymaga twojej interakcji z powiadomieniem od Shizuku. Zezwol Shizuku na wyświetlanie powiadomień.</string>\n    <string name=\"home_adb_is_limited_description\">Producent Twojego urządzenia ograniczył uprawnienia adb, a aplikacje korzystające z Shizuku nie będą działać poprawnie.\n\\n\n\\nZwykle to ograniczenie można znieść, dostosowując niektóre opcje w „Opcjach programisty”. Przeczytaj pomoc, aby dowiedzieć się, jak to zrobić.\n\\n\n\\nMoże być konieczne ponowne uruchomienie Shizuku, aby operacja zaczęła obowiązywać.</string>\n    <string name=\"home_adb_is_limited_title\">Musisz zrobić dodatkowy krok</string>\n    <string name=\"home_app_management_empty\">Tutaj pojawią się aplikacje, które zażądały lub zadeklarowały Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Niektóre systemy (takie jak MIUI) nie zezwalają aplikacjom na dostęp do sieci, gdy nie są one widoczne, nawet jeśli aplikacja standardowo korzysta z usługi pierwszego planu. Proszę wyłączyć funkcje optymalizacji baterii dla Shizuku w takich systemach.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku potrzebuje dostęp do sieci lokalnej. Jest kontrolowany przez pozwolenie sieciowe.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Należy pamiętać, że lewą część opcji „Debugowanie sieci bezprzewodowej” można kliknąć, dotknięcie jej spowoduje otwarcie nowej strony. Jedynie włączenie przełącznika po prawej stronie jest nieprawidłowe.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">W przeciwnym razie wprowadzenie kodu parowania z powiadomienia może nie być możliwe.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Proszę spróbować wyłączyć i włączyć ponownie \\\"Debugowanie bezprzewodowe\\\" jeśli nadal szuka.</string>\n    <string name=\"settings_use_system_color\">Użyj systemowego motywu kolorystycznego</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"terminal_tutorial_1_description\">Se houver arquivos com o mesmo nome na pasta selecionada, eles serão excluídos.\n\\n\n\\nA função de exportação usa SAF (Storage Access Framework). É relatado que o MIUI quebra as funções do SAF. Se você estiver usando o MIUI, talvez seja necessário extrair o arquivo do Shizuku em apk para download no Github.</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Abrir Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; tem suporte moderno para Shizuku, mas está solicitando Shizuku legado. Isso pode acontecer porque o Shizuku não está em execução. Verifique no aplicativo Shizuku.&lt;p&gt;O uso do Shizuku legado foi suspenso desde março de 2019.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s está solicitando Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\">O Shizuku legado está obsoleto desde março de 2019. Além disso, o Shizuku legado não funciona em sistemas Android mais recentes.&lt;p&gt;Peça ao desenvolvedor de &lt;b&gt;%1$s&lt;/b&gt; para atualizar.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s não é compatível com Shizuku</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> foi copiado para a área de transferência.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nfoi copiado para a área de transferência.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Não é possível iniciar o navegador</string>\n    <string name=\"start_with_root_failed\">Não é possível iniciar o serviço porque a permissão de root não foi concedida ou este dispositivo não está enraizado.</string>\n    <string name=\"starter\">Iniciante</string>\n    <string name=\"grant_dialog_button_deny\">Negar</string>\n    <string name=\"grant_dialog_button_allow_always\">Permitir o tempo todo</string>\n    <string name=\"permission_warning_template\">Permitir <b>%1$s</b> a %2$s\\?</string>\n    <string name=\"permission_description\">Permita que o aplicativo use o Shizuku.</string>\n    <string name=\"permission_label\">Acessar Shizuku</string>\n    <string name=\"notification_adb_pairing_retry\">Repetir</string>\n    <string name=\"notification_adb_pairing_failed_title\">Pareamento falhou</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Você pode iniciar o serviço Shizuku agora.</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Pareamento bem sucedido</string>\n    <string name=\"notification_adb_pairing_working_title\">Emparelhamento em progresso</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Parar pesquisa</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Serviço de emparelhamento encontrado</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Procurando serviço de pareamento</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Digite o código de pareamento</string>\n    <string name=\"notification_channel_adb_pairing\">Emparelhamento de depuração sem fio</string>\n    <string name=\"notification_working\">Trabalhando…</string>\n    <string name=\"notification_service_start_no_root\">Falha ao solicitar permissão de root.</string>\n    <string name=\"notification_service_start_failed\">Falha ao iniciar o serviço Shizuku.</string>\n    <string name=\"notification_service_starting\">O serviço de Shizuku está começando…</string>\n    <string name=\"notification_channel_service_status\">Status de início do serviço</string>\n    <string name=\"dialog_stop_message\">O serviço de Shizuku será interrompido.</string>\n    <string name=\"action_stop\">Parar Shizuku</string>\n    <string name=\"about_view_source_code\">Veja o código-fonte em %s</string>\n    <string name=\"action_about\">Sobre</string>\n    <string name=\"settings_use_system_color\">Use o tema do sistema</string>\n    <string name=\"settings_start_on_boot_summary\">Para dispositivos com root, o Shizuku pode iniciar automaticamente na inicialização</string>\n    <string name=\"settings_start_on_boot\">Iniciar na inicialização (root)</string>\n    <string name=\"settings_translation_summary\">Ajude-nos a traduzir %s para o seu idioma</string>\n    <string name=\"settings_translation\">Participe da tradução</string>\n    <string name=\"settings_translation_contributors\">Colaboradores de tradução</string>\n    <string name=\"settings_startup\">Comece</string>\n    <string name=\"settings_black_night_theme_summary\">Use o tema preto puro se o modo noturno estiver ativado</string>\n    <string name=\"settings_black_night_theme\">Tema escuro</string>\n    <string name=\"settings_user_interface\">Aparência</string>\n    <string name=\"settings_language\">Idioma</string>\n    <string name=\"settings_title\">Configurações</string>\n    <string name=\"rish_description\">Com %1$s, em qualquer aplicativo de terminal, você pode se conectar e interagir com o shell executado pelo Shizuku. &lt;p&gt;Sobre o uso detalhado %1$s, toque para visualizar o documento.</string>\n    <string name=\"terminal_tutorial_3_description\">Algumas dicas: conceda permissão de execução para %1$s e adicione-a a %2$s, você poderá usar %1$s diretamente.</string>\n    <string name=\"terminal_tutorial_3\">Finalmente, mova os arquivos para algum lugar onde seu aplicativo de terminal possa acessar, você poderá usar %1$s para executar comandos através do Shizuku.</string>\n    <string name=\"terminal_tutorial_2_description\">Por exemplo, se você quiser usar Shizuku em %1$s, você deve substituir %2$s por %3$s (%4$s é o nome do pacote de %1$s).</string>\n    <string name=\"terminal_tutorial_2\">Em seguida, use qualquer editor de texto para abrir e editar %1$s.</string>\n    <string name=\"terminal_export_files\">Exportar arquivos</string>\n    <string name=\"terminal_tutorial_1\">Primeiro, exporte os arquivos para onde quiser. Você encontrará dois arquivos, %1$s e %2$s.</string>\n    <string name=\"home_terminal_description\">Execute comandos através do Shizuku em aplicativos de terminal que você queira</string>\n    <string name=\"home_terminal_title\">Use Shizuku em aplicativos de terminal</string>\n    <string name=\"app_management_item_summary_requires_root\">* requer que o Shizuku seja executado com root</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">É altamente possível que o fabricante do seu dispositivo limite a permissão do adb.&lt;p&gt;Pode haver uma solução para o seu sistema &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;neste documento&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">A permissão do adb é limitada</string>\n    <string name=\"home_learn_more_description\">Aprenda a desenvolver com Shizuku</string>\n    <string name=\"home_learn_more_title\">Aprender sobre Shizuku</string>\n    <string name=\"home_app_management_view_authorized_apps\">Toque para gerenciar aplicativos autorizados</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">%d aplicativo autorizado</item>\n        <item quantity=\"many\">%d aplicativos autorizados</item>\n        <item quantity=\"other\">%d aplicativos autorizados</item>\n    </plurals>\n    <string name=\"home_app_management_title\">Gerenciamento de aplicativos</string>\n    <string name=\"home_root_button_restart\">Reiniciar</string>\n    <string name=\"home_root_button_start\">Iniciar</string>\n    <string name=\"home_root_description_sui\">Se você estiver usando Magisk, você pode tentar %1$s. Para usuários root, ele substituirá o Shizuku. Observe que os aplicativos existentes precisam mudar um pouco para usar %2$s.</string>\n    <string name=\"home_root_description\">Além disso, o Shizuku pode ser iniciado automaticamente na inicialização. Caso contrário, verifique se o seu sistema ou ferramentas de terceiros restringiram o Shizuku.&lt;br&gt;Você pode consultar %s.</string>\n    <string name=\"home_root_title\">Iniciar (para dispositivos com root)</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Alguns sistemas (como o MIUI) não permitem que aplicativos acessem a rede quando não estiverem visíveis, mesmo que o aplicativo use o serviço em primeiro plano como padrão. Desative os recursos de otimização de bateria para Shizuku sistemas.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku precisa acessar a rede local. É controlado pela permissão de rede.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Volte ao Shizuku e inicie o Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Observe que a parte esquerda da opção \\\"Depuração sem fio\\\" é clicável, tocar nela abrirá uma nova página. Apenas ligar o interruptor à direita está incorreto.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Caso contrário, talvez você não consiga inserir o código de pareamento da notificação.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Os usuários do MIUI podem precisar mudar o estilo de notificação para \\\"Android\\\" de \\\"Notificação\\\" - \\\"Sombra de notificação\\\" nas configurações do sistema.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">O processo de emparelhamento precisa que você interaja com uma notificação de Shizuku. Por favor, permita que Shizuku mostre notificações.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Digite o código na notificação para concluir o emparelhamento.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Digite \\\"Opções do desenvolvedor\\\" - \\\"Depuração sem fio\\\". Toque em \\\"Emparelhar dispositivo com código de emparelhamento\\\", você verá um código de seis dígitos.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Uma notificação de Shizuku ajudará você a concluir o emparelhamento.</string>\n    <string name=\"adb_pairing_tutorial_title\">Emparelhe Shizuku com seu dispositivo</string>\n    <string name=\"notification_settings\">Opções de notificação</string>\n    <string name=\"development_settings\">Opções do desenvolvedor</string>\n    <string name=\"adb_pair_required\">Por favor, passe primeiro pela etapa de emparelhamento.</string>\n    <string name=\"adb_error_key_store\">Não é possível gerar a chave para depuração sem fio.\n\\nIsso pode ser porque o mecanismo KeyStore deste dispositivo está quebrado.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">O sistema requer a caixa de diálogo de emparelhamento sempre visível, usando o modo de tela dividida é a única maneira de deixar este aplicativo e a caixa de diálogo do sistema visíveis ao mesmo tempo.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Por favor, entre primeiro no modo de tela dividida (várias janelas).</string>\n    <string name=\"dialog_adb_pairing_message\">Inicie o emparelhamento seguindo as seguintes etapas: \\\"Opções do desenvolvedor\\\" - \\\"Depuração sem fio\\\" - \\\"Emparelhando o dispositivo usando o código de emparelhamento\\\".\n\\n\n\\nApós o início do processo de emparelhamento, você poderá inserir o código de emparelhamento.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">A depuração sem fio não está habilitada.\n\\nObserve que, antes do Android 11, para habilitar a depuração sem fio, a conexão com o computador é obrigatória.</string>\n    <string name=\"cannot_connect_port\">Não é possível conectar ao serviço de depuração sem fio.</string>\n    <string name=\"paring_code_is_wrong\">O código de emparelhamento está errado.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Código de pareamento</string>\n    <string name=\"dialog_adb_pairing_discovery\">Procurando serviço de pareamento</string>\n    <string name=\"dialog_adb_pairing_title\">Emparelhar com dispositivo</string>\n    <string name=\"adb_pairing\">Emparelhamento</string>\n    <string name=\"dialog_adb_invalid_port\">Porta é um número inteiro que varia de 1 a 65535.</string>\n    <string name=\"dialog_adb_port\">Porta</string>\n    <string name=\"dialog_adb_discovery_message\">Ative \\\"Depuração sem fio\\\" em \\\"Opções do desenvolvedor\\\". A \\\"depuração sem fio\\\" é desabilitada automaticamente quando a rede muda.\n\\n\n\\nObserve que não desative \\\"Opções do desenvolvedor\\\" ou \\\"Depuração USB\\\" ou Shizuku será parado.</string>\n    <string name=\"dialog_adb_discovery\">Procurando serviço de depuração sem fio</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Guia passo a passo</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Antes do Android 11, é necessário conectar-se a um computador para ativar a depuração sem fio.</string>\n    <string name=\"home_wireless_adb_description\">No Android 11 ou superior, você pode ativar a depuração sem fio e iniciar o Shizuku diretamente do seu dispositivo, sem conectar a um computador.&lt;p&gt;Veja o guia passo a passo primeiro.</string>\n    <string name=\"home_wireless_adb_title\">Iniciar via depuração sem fio</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Mandar</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copiar</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Existem algumas outras considerações, por favor confirme que você leu a ajuda primeiro.</string>\n    <string name=\"home_adb_button_view_command\">Ver o comando</string>\n    <string name=\"home_adb_button_view_help\">Leia a ajuda</string>\n    <string name=\"home_adb_description\">Para dispositivos sem root, você precisa usar o adb para iniciar o Shizuku (requer conexão com o computador). Esse processo precisa ser repetido toda vez que o dispositivo for reiniciado. Por favor, <b><a href=\"%1$s\">leia o Ajuda</a></b>.</string>\n    <string name=\"home_adb_title\">Comece conectando-se a um computador</string>\n    <string name=\"home_status_service_version_update\">Versão %2$s, %1$s&lt;br&gt;Comece novamente para atualizar para a versão %3$s</string>\n    <string name=\"home_status_service_version\">Versão %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s não está em execução</string>\n    <string name=\"home_status_service_is_running\">%1$s está em execução</string>\n    <string name=\"translation_contributors\">Arcent</string>\n    <string name=\"home_adb_is_limited_description\">O fabricante do dispositivo restringiu as permissões adb e os aplicativos que usam Shizuku não funcionarão corretamente.\n\\n\n\\nNormalmente, essa limitação pode ser contornada habilitando algumas opções em \\\"Opções do desenvolvedor\\\". Leia a ajuda para obter detalhes sobre como fazer isso.\n\\n\n\\nPode ser necessário reiniciar o Shizuku para que a operação entre em vigor.</string>\n    <string name=\"home_adb_is_limited_title\">Você precisa dar um passo extra</string>\n    <string name=\"home_app_management_empty\">Os aplicativos que solicitaram ou declararem Shizuku serão exibidos aqui.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Por favor, tente desabilitar e habilitar \\\"Depuração sem fio\\\" se continuar procurando.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_status_service_version_update\">Versão %2$s, %1$s&lt;br&gt;Reinicie para atualizar para a versão %3$s</string>\n    <string name=\"home_status_service_version\">Versão %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s não está em execução</string>\n    <string name=\"home_status_service_is_running\">%1$s em execução</string>\n    <string name=\"translation_contributors\">Marcio de Andrade</string>\n    <string name=\"grant_dialog_button_deny\">Negar</string>\n    <string name=\"grant_dialog_button_allow_always\">Permitir o tempo todo</string>\n    <string name=\"permission_warning_template\">Permitir que o app &lt;b&gt;%1$s&lt;/b&gt; %2$s\\?</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Abrir Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; tem suporte a Shizuku moderno, mas está solicitando o Shizuku legado. Isso pode acontecer porque o Shizuku não está funcionando, verifique no aplicativo Shizuku.&lt;p&gt;O Shizuku legado foi descontinuado desde março de 2019.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s está pedindo o Shizuku legado</string>\n    <string name=\"dialog_legacy_not_support_message\">O Shizuku legado está obsoleto desde março de 2019. Além disso, o Shizuku legado não funciona em sistemas Android mais recentes.&lt;p&gt;Peça ao desenvolvedor de &lt;b&gt;%1$s&lt;/b&gt; para atualizar.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s não suporta as versões novas do Shizuku</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> copiado com sucesso.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nfoi copiado com sucesso.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Não consigo iniciar o navegador</string>\n    <string name=\"start_with_root_failed\">Não é possível iniciar o serviço porque a permissão de root não foi concedida ou este aparelho não está rooteado.</string>\n    <string name=\"starter\">Iniciante</string>\n    <string name=\"permission_description\">Permita que o aplicativo use o Shizuku.</string>\n    <string name=\"permission_label\">acessar Shizuku</string>\n    <string name=\"notification_working\">Em andamento…</string>\n    <string name=\"notification_service_start_no_root\">Falha ao solicitar acesso ao root.</string>\n    <string name=\"notification_service_start_failed\">Falha ao iniciar o serviço do Shizuku.</string>\n    <string name=\"notification_service_starting\">O serviço do Shizuku está iniciando…</string>\n    <string name=\"notification_channel_service_status\">Status de início do serviço</string>\n    <string name=\"dialog_stop_message\">O serviço do Shizuku será interrompido.</string>\n    <string name=\"action_stop\">Parar o Shizuku</string>\n    <string name=\"about_view_source_code\">Ver o código-fonte no %s</string>\n    <string name=\"action_about\">Sobre</string>\n    <string name=\"settings_start_on_boot_summary\">Para dispositivos com acesso root, o Shizuku é capaz de abrir automaticamente na inicialização do sistema</string>\n    <string name=\"settings_start_on_boot\">Iniciar APP no boot (apenas com root)</string>\n    <string name=\"settings_translation_summary\">Ajude-nos à traduzir %s para o seu idioma</string>\n    <string name=\"settings_translation\">Contribua com a tradução</string>\n    <string name=\"settings_translation_contributors\">Tradutores deste APP</string>\n    <string name=\"settings_startup\">Inicialização</string>\n    <string name=\"settings_black_night_theme_summary\">Use o tema preto puro se o modo escuro estiver habilitado. Em telas AMOLED, economiza bateria</string>\n    <string name=\"settings_black_night_theme\">Tema preto AMOLED</string>\n    <string name=\"settings_user_interface\">Aparência</string>\n    <string name=\"settings_language\">Idioma</string>\n    <string name=\"settings_title\">Configurações</string>\n    <string name=\"app_management_item_summary_requires_root\">* precisa do Shizuku executado com privilégios de root</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">É bem provável que o fabricante do seu dispositivo limite a permissão do ADB.&lt;p&gt;Pode haver uma solução para seu sistema &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;neste documento&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">A permissão do ADB é limitada</string>\n    <string name=\"home_learn_more_description\">Aprenda a desenvolver com Shizuku</string>\n    <string name=\"home_learn_more_title\">Aprenda sobre Shizuku</string>\n    <string name=\"home_app_management_view_authorized_apps\">Toque para gerenciar os aplicativos autorizados</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">%d aplicativo autorizado</item>\n        <item quantity=\"other\">%d aplicativos autorizados</item>\n    </plurals>\n    <string name=\"home_app_management_title\">Gerenciador de aplicativos</string>\n    <string name=\"home_root_button_restart\">Reiniciar</string>\n    <string name=\"home_root_button_start\">Começar</string>\n    <string name=\"home_root_description_sui\">Se você estiver usando Magisk, você pode tentar %1$s. Para usuários rooteados, ele eventualmente substituirá Shizuku. Observe: os aplicativos existentes precisam mudar um pouco para usar %2$s.</string>\n    <string name=\"home_root_description\">Além disso, o Shizuku pode ser iniciado automaticamente ao ligar o aparelho. Caso contrário, verifique se o seu sistema ou ferramentas de terceiros restringem Shizuku.&lt;br&gt;Você pode se referir a %s.</string>\n    <string name=\"home_root_title\">Começar (para aparelhos rooteados)</string>\n    <string name=\"development_settings\">Opções do Desenvolvedor</string>\n    <string name=\"adb_pair_required\">Execute o primeiro passo de pareamento.</string>\n    <string name=\"adb_error_key_store\">Incapaz de gerar a chave para a Depuração via Wireless.\n\\nIsso pode ocorrer porque o mecanismo que armazena as chaves deste aparelho está quebrado.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">O sistema necessita da caixa de diálogo de pareamento sempre visível. Usar o modo de tela dividida é a única maneira de deixar este aplicativo e a caixa de diálogo do sistema visíveis ao mesmo tempo.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Primeiramente, ative o modo de janela dividida, por favor.</string>\n    <string name=\"dialog_adb_pairing_message\">Comece o pareamento seguindo às etapas: \\\"Opções do Desenvolvedor\\\" → \\\"Depuração por Wi-Fi\\\" → \\\"Parear aparelho usando um código de pareamento\\\".\n\\n\n\\nApós o início do pareamento, você poderá colocar o código de pareamento gerado.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">A Depuração via Wireless não está ativada.\n\\nObserve que, antes do Android 11, para habilitar a Depuração via Wireless a conexão com um computador é obrigatória.</string>\n    <string name=\"cannot_connect_port\">Não é possível conectar ao serviço de Depuração via Wireless.</string>\n    <string name=\"paring_code_is_wrong\">O código de pareamento está errado.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Código de pareamento</string>\n    <string name=\"dialog_adb_pairing_discovery\">Procurando o serviço de pareamento</string>\n    <string name=\"dialog_adb_pairing_title\">Parear com o dispositivo</string>\n    <string name=\"adb_pairing\">Pareamento</string>\n    <string name=\"dialog_adb_port\">Porta</string>\n    <string name=\"dialog_adb_invalid_port\">A porta é um número inteiro que varia de 1 a 65535.</string>\n    <string name=\"dialog_adb_discovery_message\">Por favor, ative \\\"Depuração via Wireless\\\" ou \\\"Depuração via Wi-Fi\\\" nas \\\"Opções do Desenvolvedor\\\". A Depuração via Wireless é, automaticamente, desativada ao trocar de rede.\n\\n\n\\nObserve, não desative \\\"Opções do Desenvolvedor\\\" ou \\\"Depuração via USB\\\", ou o Shizuku será interrompido.</string>\n    <string name=\"dialog_adb_discovery\">Procurando o serviço de Depuração via Wireless</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Existem algumas outras considerações, por favor confirme se você leu o documento de ajuda primeiro.</string>\n    <string name=\"home_wireless_adb_title\">Começar pela Depuração via Wireless</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Enviar</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copiar</string>\n    <string name=\"home_adb_button_view_command\">Ver o comando</string>\n    <string name=\"home_adb_button_view_help\">Ler a ajuda</string>\n    <string name=\"home_adb_description\">Para aparelhos sem ROOT, será necessário usar o ADB para iniciar o Shizuku (requer conexão ao computador). Este processo precisa ser repetido sempre que o aparelho for reiniciado. Por favor <b><a href=\"%1$s\">leia a ajuda</a></b>.</string>\n    <string name=\"home_adb_title\">Comece conectando-se a um computador</string>\n    <string name=\"terminal_tutorial_3\">Finalmente, mova os arquivos para algum lugar onde seu aplicativo terminal possa acessar, você poderá usar %1$s para executar comandos através do Shizuku.</string>\n    <string name=\"terminal_tutorial_3_description\">Algumas dicas: conceda permissão de execução a %1$s e adicione-a a %2$s, você poderá usar %1$s diretamente.</string>\n    <string name=\"terminal_tutorial_2_description\">Por exemplo, se quiser usar o Shizuku em %1$s, você deve substituir %2$s por %3$s (%4$s é o nome de pacote de %1$s).</string>\n    <string name=\"terminal_tutorial_2\">Agora, use algum editor de texto para abrir e editar %1$s.</string>\n    <string name=\"terminal_export_files\">Exportar arquivos</string>\n    <string name=\"terminal_tutorial_1_description\">Se houver arquivos com o mesmo nome na pasta selecionada, eles serão excluídos.\n\\n\n\\nA função de exportação usa SAF (Storage Access Framework). É relatado que a MIUI quebra as funções do SAF. Se você estiver usando a MIUI, você pode ter que extrair o arquivo do apk do Shizuku ou baixar do GitHub.</string>\n    <string name=\"home_terminal_description\">Executar comandos pelo Shizuku no seu app de terminal preferido</string>\n    <string name=\"terminal_tutorial_1\">Primeiro, exporte os arquivos para onde quiser. Serão dois arquivos: %1$s e %2$s.</string>\n    <string name=\"home_terminal_title\">Usar o Shizuku em apps de terminal</string>\n    <string name=\"rish_description\">Com %1$s, em qualquer aplicativo de terminal, você pode se conectar e interagir com o shell executado pelo Shizuku. &lt;p&gt; Sobre o uso detalhado %1$s, toque para ver o documento.</string>\n    <string name=\"notification_adb_pairing_failed_title\">Falha no pareamento</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Os usuários da MIUI podem precisar mudar o estilo de notificação de \\\"MIUI\\\" para \\\"Android\\\". Para isso, acesse \\\"Configurações\\\", em seguida toque em \\\"Notificações\\\", em seguida toque em \\\"Área de Notificação\\\". Se você não usa MIUI, ignore isso.</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Pareamento concluído</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Acesse as \\\"Opções do desenvolvedor\\\", em seguida \\\"Depuração por Wi-Fi\\\". Toque em \\\"Parear o dispositivo com código de pareamento\\\", você verá um código de seis dígitos.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Digite o código de 6 dígitos na notificação para concluir o pareamento.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Uma notificação do Shizuku ajudará você a concluir o pareamento.</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Serviço de pareamento encontrado</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Parar de procurar</string>\n    <string name=\"notification_adb_pairing_working_title\">Processando pareamento</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Agora, você pode iniciar o serviço do Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_title\">Parear Shizuku com seu dispositivo</string>\n    <string name=\"home_wireless_adb_description\">No Android 11 ou superior, você pode ativar a Depuração via Wireless e iniciar o Shizuku diretamente do seu dispositivo, sem se conectar a um computador. &lt;p&gt; Primeiro, consulte esse guia passo a passo.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Antes do Android 11, é necessário conectar-se a um computador para habilitar a Depuração via Wireless.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Guia passo a passo</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Volte para Shizuku e inicie o Shizuku.</string>\n    <string name=\"notification_settings\">Opções de notificações</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">O processo de pareamento precisa que você interaja com uma notificação do Shizuku. Por favor, permita que o Shizuku envie notificações.</string>\n    <string name=\"notification_channel_adb_pairing\">Pareamento da Depuração via Wireless</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Digite o código de pareamento</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Procurando serviço de pareamento</string>\n    <string name=\"notification_adb_pairing_retry\">Tentar novamente</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">‎Alguns sistemas (como a MIUI) não permitem que aplicativos acessem a rede quando não estão visíveis, mesmo que o aplicativo use o serviço em primeiro plano como padrão. Por favor, desabilitar os recursos de otimização da bateria para o Shizuku em tais sistemas.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">‎Por favor, note que a parte esquerda da opção \\\"Depuração sem fio\\\" é clicável, tocando nela abrirá uma nova página. Apenas ligar o interruptor à direita está incorreto.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">‎Caso contrário, você pode não conseguir inserir o código de paring a partir da notificação.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku precisa acessar a rede local. É controlado pela permissão da rede.</string>\n    <string name=\"settings_use_system_color\">Usar tema do sistema</string>\n    <string name=\"home_adb_is_limited_title\">Você precisa de um passo adicional</string>\n    <string name=\"home_app_management_empty\">Apps que solicitaram ou declararam acesso ao Shizuku aparecerão aqui.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Por favor, tente desativar e reativar a \\\"Depuração por Wi-Fi\\\" se não parar de ficar procurando.</string>\n    <string name=\"home_adb_is_limited_description\">O fabricante do seu dispositivo restringiu as permissões ADB e os apps que usam o Shizuku não funcionarão corretamente.\n\\n\n\\nNormalmente, essa limitação pode ser eliminada ajustando algumas opções nas “Opções do desenvolvedor”. Por favor, leia a ajuda para obter detalhes sobre como fazer isso.\n\\n\n\\nPode ser necessário reiniciar o Shizuku para que a operação tenha efeito.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ro/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_status_service_is_running\">%1$s rulează</string>\n    <string name=\"home_status_service_not_running\">%1$s nu rulează</string>\n    <string name=\"home_status_service_version_update\">Versiune %2$s, %1$s&lt;br&gt;Pornește din nou pentru a actualiza la versiunea %3$s</string>\n    <string name=\"home_adb_title\">Începe prin a te conecta la un computer</string>\n    <string name=\"home_adb_button_view_help\">Citește ajutorul</string>\n    <string name=\"home_adb_button_view_command\">Vizualizare comandă</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Există și alte considerații, mai întâi confirmă că ai citit ajutorul.</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Copiere</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Trimitere</string>\n    <string name=\"home_wireless_adb_title\">Pornește prin depanare fără fir</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Înainte de Android 11, este necesară conectarea la un computer pentru a activa depanarea fără fir.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Ghidul pas cu pas</string>\n    <string name=\"dialog_adb_discovery\">Se caută serviciul de depanare fără fir</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_invalid_port\">Portul este un număr întreg cuprins între 1 și 65535.</string>\n    <string name=\"dialog_adb_pairing_title\">Asociază cu dispozitivul</string>\n    <string name=\"dialog_adb_pairing_discovery\">Se caută serviciul de asociere</string>\n    <string name=\"paring_code_is_wrong\">Codul de asociere este greșit.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Cod de asociere</string>\n    <string name=\"adb_pairing\">Asociere</string>\n    <string name=\"cannot_connect_port\">Nu se poate conecta la serviciul de depanare wireless.</string>\n    <string name=\"adb_error_key_store\">Nu se poate genera cheia pentru depanarea wireless.\n\\nAcest lucru se poate datora faptului că mecanismul KeyStore al acestui dispozitiv este defect.</string>\n    <string name=\"adb_pair_required\">Parcurge mai întâi procesul de asociere.</string>\n    <string name=\"development_settings\">Opțiuni dezvoltator</string>\n    <string name=\"notification_settings\">Opțiuni de notificare</string>\n    <string name=\"adb_pairing_tutorial_title\">Asociază Shizuku cu acest dispozitiv</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">O notificare de la Shizuku te va ajuta să finalizezi asocierea.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Este posibil ca utilizatorii MIUI să fie nevoiți să schimbe stilul de notificare la „Android” în „Notificări” - „Panou de notificare” în setările sistemului.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">În caz contrar, este posibil să nu poți introduce codul de asociere din notificare.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Înapoi la Shizuku și pornește Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku trebuie să acceseze rețeaua locală. Este controlat de permisiunea de rețea.</string>\n    <string name=\"home_root_title\">Pornire (pentru dispozitive root-ate)</string>\n    <string name=\"home_root_description\">În plus, Shizuku poate fi pornit automat la pornire. Dacă nu, verifică dacă sistemul sau instrumente terțe au restricționat Shizuku.&lt;br&gt;Poți consulta %s.</string>\n    <string name=\"home_root_description_sui\">Dacă utilizezi Magisk, poți încerca %1$s. Pentru utilizatorii root, acesta va înlocui în cele din urmă Shizuku. Reține că aplicațiile existente trebuie să se modifice puțin pentru a fi utilizate %2$s.</string>\n    <string name=\"home_root_button_start\">Pornire</string>\n    <string name=\"home_root_button_restart\">Repornire</string>\n    <string name=\"home_app_management_title\">Gestionare aplicație</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">%d aplicație autorizată</item>\n        <item quantity=\"few\">%d aplicații autorizate</item>\n        <item quantity=\"other\">%d aplicații autorizate</item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\">Atinge pentru a gestiona aplicațiile autorizate</string>\n    <string name=\"home_learn_more_title\">Învață Shizuku</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Permisiunea adb este limitată</string>\n    <string name=\"app_management_item_summary_requires_root\">* necesită Shizuku să rulează cu root</string>\n    <string name=\"home_terminal_title\">Utilizează Shizuku în aplicații terminale</string>\n    <string name=\"home_terminal_description\">Rulează comenzi prin Shizuku în aplicațiile terminale care îți plac</string>\n    <string name=\"terminal_tutorial_1\">Mai întâi exportă fișierele oriunde dorești. Vei găsi două fișiere, %1$s și %2$s.</string>\n    <string name=\"terminal_export_files\">Export fișiere</string>\n    <string name=\"terminal_tutorial_2\">Apoi, utilizează orice editor de text pentru a deschide și edita %1$s.</string>\n    <string name=\"terminal_tutorial_2_description\">De exemplu, dacă vrei să folosești Shizuku în %1$s, ar trebui să înlocuiești %2$s cu %3$s (%4$s este numele pachetului al %1$s).</string>\n    <string name=\"settings_title\">Setări</string>\n    <string name=\"settings_language\">Limba</string>\n    <string name=\"settings_user_interface\">Aspect</string>\n    <string name=\"settings_black_night_theme\">Tema de noapte întunecată</string>\n    <string name=\"settings_black_night_theme_summary\">Folosește tema negru pur dacă modul noapte este activat</string>\n    <string name=\"settings_startup\">Lansare</string>\n    <string name=\"settings_translation\">Participă la traducere</string>\n    <string name=\"settings_translation_summary\">Ajută-ne să traducem %s în limba ta</string>\n    <string name=\"settings_start_on_boot\">Start la pornire (root)</string>\n    <string name=\"settings_use_system_color\">Utilizează culoarea temei de sistem</string>\n    <string name=\"action_about\">Despre</string>\n    <string name=\"about_view_source_code\">Vizualizează codul sursă la %s</string>\n    <string name=\"action_stop\">Oprire Shizuku</string>\n    <string name=\"dialog_stop_message\">Serviciul Shizuku va fi oprit.</string>\n    <string name=\"notification_channel_service_status\">Starea de pornire a serviciului</string>\n    <string name=\"notification_service_starting\">Serviciul Shizuku pornește…</string>\n    <string name=\"notification_service_start_failed\">Pornirea serviciului Shizuku a eșuat.</string>\n    <string name=\"notification_service_start_no_root\">Nu s-a putut solicita permisiunea root.</string>\n    <string name=\"notification_working\">Se lucrează…</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Introdu codul de asociere</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Se caută serviciul de asociere</string>\n    <string name=\"notification_adb_pairing_service_found_title\">S-a găsit serviciul de asociere</string>\n    <string name=\"notification_adb_pairing_working_title\">Asociere în curs</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Asociere reușită</string>\n    <string name=\"notification_adb_pairing_failed_title\">Asocierea eșuată</string>\n    <string name=\"notification_adb_pairing_retry\">Încearcă din nou</string>\n    <string name=\"permission_label\">accesare Shizuku</string>\n    <string name=\"permission_description\">Permite aplicației să folosească Shizuku.</string>\n    <string name=\"permission_warning_template\">Permiți <b>%1$s</b> să %2$s\\?</string>\n    <string name=\"grant_dialog_button_allow_always\">Permite tot timpul</string>\n    <string name=\"grant_dialog_button_deny\">Refuz</string>\n    <string name=\"starter\">Începător</string>\n    <string name=\"dialog_cannot_open_browser_title\">Nu se poate porni browser-ul</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\na fost copiat în clipboard.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> a fost copiat în clipboard.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s nu suportă Shizuku modern</string>\n    <string name=\"dialog_legacy_not_support_message\">Vechea versiune Shizuku a fost retrasă din martie 2019. De asemenea, vechea versiune Shizuku nu funcționează pe sisteme Android mai noi.&lt;p&gt;Cere dezvoltatorului &lt;b&gt;%1$s&lt;/b&gt; să actualizeze.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s solicită Shizuku vechi</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; are suport Shizuku modern, dar solicită Shizuku vechi. Acest lucru se poate datora faptului că Shizuku nu rulează, verifică în aplicația Shizuku.&lt;p&gt;Versiunea veche a Shizuku a fost retrasă din martie 2019.</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Deschide Shizuku</string>\n    <string name=\"translation_contributors\">Igor</string>\n    <string name=\"home_status_service_version\">Versiune %2$s, %1$s</string>\n    <string name=\"home_adb_description\">Pentru dispozitivele fără root, trebuie să utilizezi adb pentru a porni Shizuku (necesită conexiune la computer). Acest proces trebuie repetat de fiecare dată când dispozitivul este repornit. <b><a href=\"%1$s\">Citește ajutorul</a></b>.</string>\n    <string name=\"home_wireless_adb_description\">Pe Android 11 sau o versiune ulterioară, poți activa depanarea wireless și poți porni Shizuku direct de pe dispozitiv, fără a te conecta la un computer.&lt;p&gt;Mai întâi consultă ghidul pas cu pas.</string>\n    <string name=\"dialog_adb_discovery_message\">Activează „Depanare wireless” în „Opțiuni dezvoltator”. „Depanarea wireless” se dezactivează automat când se schimbă rețeaua.\n\\n\n\\nReține, nu dezactiva „Opțiuni dezvoltator” sau „Depanare USB”, altfel Shizuku va fi oprit.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Depanarea wireless nu este activată.\n\\nReține că înainte de Android 11, pentru a activa depanarea wireless, conexiunea la computer este o necesitate.</string>\n    <string name=\"dialog_adb_pairing_message\">Începe asocierea prin următorii pași: „Opțiuni dezvoltator” - „Depanare wireless” - „Asocierea dispozitivului folosind codul de asociere”.\n\\n\n\\nDupă începerea procesului de asociere, vei putea introduce codul de asociere.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Intră mai întâi în modul ecran divizat (ferestre multiple).</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Sistemul necesită dialogul de asociere întotdeauna vizibil, utilizarea modului ecran divizat este singura modalitate de a lăsa această aplicație și dialogul de sistem vizibile în același timp.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Accesează „Opțiuni dezvoltator” - „Depanare wireless”. Atinge „Asociere dispozitiv cu codul de asociere”, vei vedea un cod din șase cifre.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Introdu codul în notificare pentru a finaliza asocierea.</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Procesul de asociere necesită să interacționarea cu o notificare de la Shizuku. Permite lui Shizuku să afișeze notificări.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Unele sisteme (cum ar fi MIUI) nu permit aplicațiilor să acceseze rețeaua atunci când nu sunt vizibile, chiar dacă aplicația folosește serviciul din prim-plan ca standard. Dezactivarea funcțiilor de optimizare a bateriei pentru Shizuku pe astfel de sisteme este necesară.</string>\n    <string name=\"home_learn_more_description\">Află cum să dezvolți cu Shizuku</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Este foarte posibil ca producătorul dispozitivului să limiteze permisiunea adb.&lt;p&gt;Este posibil să existe o soluție pentru acest sistem în &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;acest document&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"terminal_tutorial_1_description\">Dacă există fișiere cu același nume în dosarul selectat, acestea vor fi șterse.\n\\n\n\\nFuncția de export folosește SAF (Storage Access Framework). A fost raportat că MIUI întrerupe funcțiile SAF. Dacă utilizezi MIUI, poate fi necesar să extragi fișierul din apk-ul lui Shizuku sau să-l descarci de pe GitHub.</string>\n    <string name=\"terminal_tutorial_3\">În cele din urmă, mută fișierele într-un loc unde aplicația de terminal le poate accesa, vei putea folosi %1$s pentru a rula comenzi prin Shizuku.</string>\n    <string name=\"terminal_tutorial_3_description\">Câteva sfaturi: acordă permisiunea de execuție pentru %1$s și adaugă la %2$s, vei putea folosi %1$s direct.</string>\n    <string name=\"rish_description\">Cu %1$s, în orice aplicație de terminal, vei putea conecta și interacționa cu shell-urile rulate de Shizuku. &lt;p&gt;Despre utilizarea detaliată %1$s, atinge pentru a vizualiza documentul.</string>\n    <string name=\"settings_translation_contributors\">Colaboratori de traduceri</string>\n    <string name=\"settings_start_on_boot_summary\">Pentru dispozitivele root-ate, Shizuku poate porni automat la pornire</string>\n    <string name=\"notification_channel_adb_pairing\">Asociere prin depanare fără fir</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Oprire căutare</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Poți porni serviciul Shizuku acum.</string>\n    <string name=\"start_with_root_failed\">Nu se poate porni serviciul deoarece permisiunea root nu este acordată sau acest dispozitiv nu este root-at.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Reține că partea din stânga a opțiunii \\\"Depanare fără fir\\\" este click-abilă, apăsarea acesteia va deschide o pagina nouă. Este incorect să pornești doar comutatorul din dreapta.</string>\n    <string name=\"home_app_management_empty\">Aplicațiile care au solicitat sau au declarat Shizuku se vor afișa aici.</string>\n    <string name=\"home_adb_is_limited_description\">Producătorul dispozitivului are permisiuni adb limitate, iar aplicațiile care folosesc Shizuku nu vor funcționa corect. \n\\n\n\\nDe obicei, această limitare poate fi ridicată prin ajustarea unor opțiuni din „Opțiuni pentru dezvoltatori”. Citește ajutorul pentru detalii despre cum să faci acest lucru.\n\\n\n\\nPoate fi necesar să repornești Shizuku pentru ca operațiunea să intre în vigoare.</string>\n    <string name=\"home_adb_is_limited_title\">Trebuie să faci un pas suplimentar</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Încearcă să dezactivezi și să activezi „Depanare fără fir” dacă caută în continuare.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Открыть Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; имеет поддержку актуального Shizuku, но запрашивает его устаревшую версию. Возможно это происходит оттого, что Shizuku не запущен, пожалуйста, перепроверьте в приложении Shizuku.&lt;p&gt;Изначальная версия Shizuku признана устаревшей ещё в марте 2019 года.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s запрашивает устаревшую версию Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\">Изначальная версия Shizuku устарела с марта 2019 года. Кроме того, она не работает на новых системах Android.&lt;p&gt;Пожалуйста, попросите разработчика &lt;b&gt;%1$s&lt;/b&gt; внести поправки.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s не поддерживает актуальную версию Shizuku</string>\n    <string name=\"toast_copied_to_clipboard_with_text\">&lt;b&gt;%s&lt;/b&gt; было скопировано в буфер обмена.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nбыло скопировано в буфер обмена.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Не удается запустить браузер</string>\n    <string name=\"start_with_root_failed\">Не удалось запустить службу. Root права не выданы или они недоступны на устройстве.</string>\n    <string name=\"starter\">Запуск</string>\n    <string name=\"permission_label\">доступ Shizuku</string>\n    <string name=\"notification_working\">Работает…</string>\n    <string name=\"notification_service_start_no_root\">Не удалось запросить root права.</string>\n    <string name=\"notification_service_start_failed\">Не удалось запустить службу Shizuku.</string>\n    <string name=\"notification_service_starting\">Служба Shizuku запускается…</string>\n    <string name=\"notification_channel_service_status\">Состояние работы службы</string>\n    <string name=\"dialog_stop_message\">Служба Shizuku будет остановлена.</string>\n    <string name=\"action_stop\">Остановить Shizuku</string>\n    <string name=\"about_view_source_code\">Исходный код доступен на %s</string>\n    <string name=\"action_about\">О приложении</string>\n    <string name=\"settings_translation_summary\">Помогите перевести %s на ваш язык</string>\n    <string name=\"settings_translation\">Участвуйте в переводе</string>\n    <string name=\"settings_translation_contributors\">Авторы перевода</string>\n    <string name=\"settings_startup\">Запуск при включении устройства</string>\n    <string name=\"settings_black_night_theme_summary\">Глубокий черный цвет фона при работе темной темы</string>\n    <string name=\"settings_black_night_theme\">Черная тема</string>\n    <string name=\"settings_user_interface\">Внешний вид</string>\n    <string name=\"settings_language\">Язык</string>\n    <string name=\"settings_title\">Настройки</string>\n    <string name=\"app_management_item_summary_requires_root\">* требуется Shizuku, запущенный с root правами</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Возможно, что производитель вашего устройства ограничивает доступ к adb.&lt;p&gt;Решение для вашей системы может быть описано &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;здесь&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Доступ к adb ограничен</string>\n    <string name=\"home_learn_more_description\">Узнайте, как начать разрабатывать с Shizuku</string>\n    <string name=\"home_learn_more_title\">Узнать больше о Shizuku</string>\n    <string name=\"home_app_management_view_authorized_apps\">Нажмите для управления списком допущенных приложений</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Доступно для %d приложения</item>\n        <item quantity=\"few\">Доступно для %d приложений</item>\n        <item quantity=\"many\">Доступно для %d приложений</item>\n        <item quantity=\"other\">Доступно для %d приложений</item>\n    </plurals>\n    <string name=\"home_app_management_title\">Управление приложениями</string>\n    <string name=\"home_root_button_restart\">Перезапустить</string>\n    <string name=\"home_root_button_start\">Запустить</string>\n    <string name=\"home_root_description\">В дополнение, Shizuku может запускаться сразу после загрузки системы. Если этого не происходит, проверьте, нет ли ограничений со стороны вашей системы или сторонних инструментов.&lt;br&gt;Вы можете обратиться в %s.</string>\n    <string name=\"home_root_title\">Запуск (для устройств с root правами)</string>\n    <string name=\"development_settings\">Параметры разработчика</string>\n    <string name=\"adb_pair_required\">Пожалуйста, сперва пройдите процедуру сопряжения.</string>\n    <string name=\"adb_error_key_store\">Не удалось сгенерировать ключ для отладки по Wi-Fi.\n\\nВозможно, что механизм KeyStore у данного устройства нерабочий.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Системе нужно постоянно видеть диалоговое окно сопряжения, и многооконный режим – это единственный способ вывести на экран и это приложение, и системное окно одновременно.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Пожалуйста, сначала активируйте режим разделения экрана (многооконный режим).</string>\n    <string name=\"dialog_adb_pairing_message\">Пожалуйста, для подключения выполните следующие шаги: «Для разработчиков» – «Отладка по Wi-Fi» – «Подключиться к устройству, используя код».\n\\n\n\\nПосле начала процесса вы сможете ввести код подключения.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Отладка по Wi-Fi не включена.\n\\nВнимание: на системах старше Android 11 для включения этой отладки необходимо соединение с компьютером.</string>\n    <string name=\"cannot_connect_port\">Не удается подключиться к службе отладки по Wi-Fi.</string>\n    <string name=\"paring_code_is_wrong\">Неверный код сопряжения.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Код сопряжения</string>\n    <string name=\"dialog_adb_pairing_discovery\">Поиск службы соединения</string>\n    <string name=\"dialog_adb_pairing_title\">Сопряжение с устройством</string>\n    <string name=\"adb_pairing\">Сопряжение</string>\n    <string name=\"dialog_adb_invalid_port\">Порт – это целое число в диапазоне от 1 до 65535.</string>\n    <string name=\"dialog_adb_port\">Порт</string>\n    <string name=\"dialog_adb_discovery_message\">Пожалуйста, включите пункт «Отладка по Wi-Fi» в меню «Для разработчиков». «Отладка по Wi-Fi» автоматически отключается при изменении сети.\n\\n\n\\nВнимание: не отключайте пункт «Для разработчиков» или «Отладка по USB», иначе Shizuku остановит работу.</string>\n    <string name=\"dialog_adb_discovery\">Ожидание службы отладки по Wi-Fi</string>\n    <string name=\"home_wireless_adb_title\">Запуск через отладку по Wi-Fi</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Отправить</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Скопировать</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Есть и другие способы; сначала убедитесь, что сперва прочли справку.</string>\n    <string name=\"home_adb_button_view_command\">Просмотр команды</string>\n    <string name=\"home_adb_button_view_help\">Читать справку</string>\n    <string name=\"home_adb_description\">Для устройств без root прав потребуется обращаться к adb для запуска Shizuku (не обойтись без соединения с компьютером). Этот процесс нужно повторять каждый раз, когда устройство перезагружается. Пожалуйста, <b><a href=\"%1$s\">прочтите справку</a></b>.</string>\n    <string name=\"home_adb_title\">Запуск через соединение с ПК</string>\n    <string name=\"home_status_service_version_update\">Версия %2$s, %1$s&lt;br&gt;Запустите снова что бы обновиться до версии %3$s</string>\n    <string name=\"home_status_service_version\">Версия %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s не запущен</string>\n    <string name=\"home_status_service_is_running\">%1$s запущен</string>\n    <string name=\"translation_contributors\">sermart1234, ruvlad</string>\n    <string name=\"settings_start_on_boot_summary\">На устройствах с root правами Shizuku может автоматически запускаться после загрузки системы</string>\n    <string name=\"settings_start_on_boot\">Автозапуск (с root правами)</string>\n    <string name=\"grant_dialog_button_allow_always\">Разрешить всегда</string>\n    <string name=\"grant_dialog_button_deny\">Запретить</string>\n    <string name=\"permission_warning_template\">Разрешить <b>%1$s</b> следующее: %2$s\\?</string>\n    <string name=\"home_root_description_sui\">Если вы пользуетесь Magisk, можете попробовать %1$s. Для пользователей с root правами он в конечном итоге заменит Shizuku. Обратите внимание, что в уже вышедшие приложения должны внести небольшие изменения, чтобы они заработали с %2$s.</string>\n    <string name=\"permission_description\">Разрешить приложению использовать Shizuku.</string>\n    <string name=\"terminal_tutorial_3_description\">Небольшой совет: выдайте %1$s права на выполнение и пропишите в %2$s, чтобы обращаться к %1$s напрямую.</string>\n    <string name=\"terminal_tutorial_3\">И последнее: переместите файлы туда, куда сможет обращаться ваше приложение-терминал, и отныне станет возможным запускать команды через Shizuku посредством %1$s.</string>\n    <string name=\"terminal_tutorial_2_description\">К примеру: если вы захотите использовать Shizuku внутри %1$s, нужно заменить %2$s на %3$s (%4$s – это имя пакета эмулятора терминала %1$s).</string>\n    <string name=\"terminal_tutorial_2\">Затем откройте и отредактируйте %1$s любым текстовым редактором.</string>\n    <string name=\"terminal_export_files\">Экспорт файлов</string>\n    <string name=\"terminal_tutorial_1_description\">Если в выбранной папке уже есть файлы с такими же именами, они будут удалены.\n\\n\n\\nДля работы функции экспорта используется SAF (Storage Access Framework). Сообщается, что на MIUI сломаны механизмы SAF, поэтому там может понадобиться вручную извлечь файл из .apk Shizuku или скачать его с GitHub.</string>\n    <string name=\"terminal_tutorial_1\">Сначала экспортируйте файлы в любое место на свое усмотрение. Там появятся два файла: %1$s и %2$s.</string>\n    <string name=\"home_terminal_description\">Запуск команд через Shizuku прямиком из любимых приложений-терминалов</string>\n    <string name=\"home_terminal_title\">Применение Shizuku в эмуляторах терминала</string>\n    <string name=\"home_wireless_adb_description\">На Android 11 или выше Вы можете включить отладку по Wi-Fi без дополнительного ПО, без подключения к компьютеру. Пожалуйста, сперва просмотрите инструкцию</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">На оболочке MIUI может потребоваться сменить параметр в пункте системных настроек «Уведомления» – «Стиль уведомлений» на «Android».</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Перейдите в «Параметры разработчика» – «Отладка по Wi-Fi». Нажмите на «Сопряжение устройства с помощью кода сопряжения» и увидите шестизначный код.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Введите код в уведомление для завершения процедуры сопряжения.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Уведомление от Shizuku поможет завершить процедуру сопряжения.</string>\n    <string name=\"rish_description\">Посредством %1$s из любого приложения-терминала можно подключаться и взаимодействовать с shell, запущенной Shizuku. &lt;p&gt;Нажмите здесь для просмотра инструкции по работе с %1$s.</string>\n    <string name=\"notification_adb_pairing_working_title\">Выполняется сопряжение</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Сопряжение выполнено</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Теперь можете запустить службу Shizuku.</string>\n    <string name=\"notification_adb_pairing_failed_title\">Не удалось выполнить сопряжение</string>\n    <string name=\"notification_adb_pairing_retry\">Повторить попытку</string>\n    <string name=\"adb_pairing_tutorial_title\">Сопряжение Shizuku с вашим устройством</string>\n    <string name=\"home_wireless_adb_description_pre_11\">\"Для отладки по Wi-Fi в Android до 11 версии  потребуется соединения с компьютером.\"</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Пошаговая инструкция</string>\n    <string name=\"notification_settings\">Настройки уведомлений</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Процедура сопряжения подразумевает взаимодействие с уведомлением от Shizuku. Для продолжения выдайте Shizuku разрешение на показ уведомлений.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Вернитесь в приложение Shizuku и запустите его.</string>\n    <string name=\"notification_channel_adb_pairing\">Сопряжение с отладкой по Wi-Fi</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Введите код подключения</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Ожидание службы сопряжения</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Служба найдена</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Прекратить поиск</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Иначе вы, вероятнее всего, не сможете ввести код сопряжения из уведомления.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku требуется доступ к локальной сети. Он управляется сетевым разрешением.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Некоторые системы (та же MIUI) не разрешают приложениям доступ к сети, когда они не на экране, даже если те в основе задействуют службу переднего плана. Пожалуйста, добавьте Shizuku в исключения алгоритмов оптимизации заряда батареи на таких системах.</string>\n    <string name=\"settings_use_system_color\">Палитра цветов из системы</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Обратите внимание, что левая часть опции \\\"Беспроводная отладка\\\" является кликабельной, нажатие на нее открывает новую страницу. Нажатие только на переключатель (справа) является неправильным.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Попробуй выключить и снова включить \\\"Отладка по Wi-Fi\\\", если поиск продолжается.</string>\n    <string name=\"home_app_management_empty\">Приложения, которые запросили или задекларировали использование Shizuku будут отображаться здесь.</string>\n    <string name=\"home_adb_is_limited_description\">Производитель вашего устройства ограничил права ADB, приложения использующие Shizuku будут работать не корректно.\n\\n\n\\nОбычно эти ограничения можно снять в настройках для разработчиков. Пожалуйста, прочитай раздел помощи, чтобы узнать как это сделать.\n\\n\n\\nВозможно Вам понадобится перезапустить Shizuku для применения изменений.</string>\n    <string name=\"home_adb_is_limited_title\">Нужен дополнительный шаг</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-sk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-sl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"notification_adb_pairing_succeed_title\">Seznanitev uspešna</string>\n    <string name=\"notification_adb_pairing_working_title\">Seznanitev v teku</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Ustavi iskanje</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Storitev za seznanjanje najdena</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Iskanje storitve za seznanjanje</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Vnesite seznantitveno kodo</string>\n    <string name=\"notification_channel_adb_pairing\">Seznanjanje brezžičnega razhroščevanja</string>\n    <string name=\"notification_working\">V teku…</string>\n    <string name=\"notification_service_start_no_root\">Neuspešna zahteva za root dovoljenje.</string>\n    <string name=\"notification_service_start_failed\">Zagon storitve Shizuku ni uspel.</string>\n    <string name=\"notification_service_starting\">Storitev Shizuku se zaganja…</string>\n    <string name=\"notification_channel_service_status\">Status zagona storitve</string>\n    <string name=\"dialog_stop_message\">Storitev Shizuku bo bila ustavljena.</string>\n    <string name=\"action_stop\">Ustavi Shizuku</string>\n    <string name=\"about_view_source_code\">Poglej izvorno kodo na %s</string>\n    <string name=\"action_about\">O</string>\n    <string name=\"settings_use_system_color\">Uporabi sistemsko barvo teme</string>\n    <string name=\"settings_start_on_boot_summary\">Za naprave z rootom, se lahko Shizuku zažene avtomatsko na zagonu</string>\n    <string name=\"settings_start_on_boot\">Zaženi na zagonu (root)</string>\n    <string name=\"settings_translation_summary\">Pomagajte nam prevajati %s v vaš jezik</string>\n    <string name=\"dialog_adb_pairing_message\">Prosimo, začnite z seznanitvijo po teh korakih: \\\"Nastavitve za razvijalce\\\" - \\\"Seznanjanje naprave z seznantitveno kodo\\\".\n\\n\n\\nKo se proces seznanjanja začne, boste lahko vnesli kodo za seznanitev.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Brezžično razhroščevanje ni omogočeno.\n\\nPozor! Pred Androidom 11, je za omogočanje brezžičnega razhroščevanja potreben računalnik.</string>\n    <string name=\"cannot_connect_port\">Povezava z storitvijo za brezžično razhroščevanje se ne more vzpostaviti.</string>\n    <string name=\"paring_code_is_wrong\">Koda za seznanitev je napačna.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Koda za seznanitev</string>\n    <string name=\"dialog_adb_pairing_discovery\">Iskanje storitve za seznanjanje</string>\n    <string name=\"dialog_adb_pairing_title\">Seznani z napravo</string>\n    <string name=\"adb_pairing\">Seznanjanje</string>\n    <string name=\"dialog_adb_invalid_port\">Vrata so število v obsegu od 1 do 65535.</string>\n    <string name=\"home_adb_description\">Za naprave brez root-a, potrebujete adb, da zaženete Shizuku (potrebna je računalniška povezava). Ta proces je potrebno ponoviti vsakič, ko se naprava ponovno zažene. Prosimo <b><a href=\"%1$s\">preberite pomoč</a></b>.</string>\n    <string name=\"dialog_adb_port\">Vrata</string>\n    <string name=\"dialog_adb_discovery_message\">Prosimo omogočite \\\"Brezžično razhroščevanje\\\" v \\\"Nastavitvah za razvijalce\\\". \\\"Brezžično razhroščevanje\\\" je avtomatsko onemogočeno, ko se spremeni omrežje.\n\\n\n\\nPozor! Ne onemogočajte \\\"Nastavitev za razvijalce\\\" ali \\\"USB razhroščevanja\\\", drugače bo Shizuku ustavljen.</string>\n    <string name=\"dialog_adb_discovery\">Iskanje storitve za Brezžično razhroščevanje</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Vodnik po korakih</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Pred Androidom 11, je povezava z računalnikom potrebna, da omogočite Brezžično razhroščevanje.</string>\n    <string name=\"home_wireless_adb_description\">Na Androidu 11 ali več, lahko vklopite Brezžično razhroščevanje in začnete Shizuku direktno iz vaše naprave, brez povezovanja na računalnik.&lt;p&gt;Prosimo, najprej poglejte vodnik po korakih.</string>\n    <string name=\"home_wireless_adb_title\">Začni preko Brezžičnega razhroščevanja</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Pošlji</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopiraj</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Obstaja nekaj premislekov. Prosimo, potrdite, da ste najprej prebrali pomoč.</string>\n    <string name=\"home_adb_button_view_command\">Pokaži ukaz</string>\n    <string name=\"home_adb_button_view_help\">Preberite pomoč</string>\n    <string name=\"home_adb_title\">Začni z povezovanjem na računalnik</string>\n    <string name=\"home_status_service_version_update\">Verzija %2$s, %1$s&lt;br&gt;Začni znova za posodobitev na verzijo %3$s</string>\n    <string name=\"home_status_service_version\">Verzija %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s ne teče</string>\n    <string name=\"home_status_service_is_running\">%1$s teče</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-sr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_discovery_message\">\"Molimo Vas omogućite rad režima \\\"Bežično otklanjanje  grešaka\\\" u sekciji \\\"Opcije programera\\\". Režim  \\\"Bežično otklanjanje grešaka\\\" se automatski onemogućava pri svakoj promeni mrežne konekcije..\n\\n\n\\nPrimetićete, onemogućavanjem sekcije \\\"Opcije programera\\\" ili režima \\\"USB otklanjanje grešaka\\\", proces rada aplikacije Shizuku se prekida.\"</string>\n    <string name=\"dialog_adb_discovery\">Traženje servisa Bežično otklanjanje grešaka</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Vodič Korak-po-korak</string>\n    <string name=\"home_wireless_adb_description_pre_11\">\"Pre Android verzije softvera 11, konekcija sa računarom bila je neophodna  u cilju omogućavanja rada režima Bežično otklanjanja grešaka.\"</string>\n    <string name=\"home_wireless_adb_description\">\"Za Android verziju softvera 11 i više, možete omogućavanjem rada režima Bežičnog otklanjanja grešaka pokrenuti Shizuku aplikaciju direktno sa Vašeg  telefona, zaobilazeći konekciju sa računarom.&lt;p&gt; Molimo Vas, najpre pogledajte vodič Korak-po-korak.\"</string>\n    <string name=\"home_wireless_adb_title\">Pokreni preko Bežičnog otklanjanja grešaka</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Pošalji</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopiraj</string>\n    <string name=\"home_adb_button_view_command\">Pregled komande</string>\n    <string name=\"home_adb_button_view_help\">Pročitajte pomoć</string>\n    <string name=\"home_adb_description\">Za uređaje koji nisu root-ovani, potrebno je izvršiti adb komandu radi pokretanja Shizuku aplikacije (zahteva konekciju sa računarom). Ovaj proces je neophodno svaki put ponoviti nakon restarta uređaja. Molim Vas <b><a href=\"%1$s\">pročitajte pomoć </a></b>.</string>\n    <string name=\"home_adb_title\">Pokreni uz pomoć konekcije preko računara</string>\n    <string name=\"home_status_service_version_update\">Verzija %2$s, %1$s&lt;br&gt;Počni ispočetka zbog ažuriranja na verziju%3$s</string>\n    <string name=\"home_status_service_version\">Verzija %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s se ne izvršava</string>\n    <string name=\"home_status_service_is_running\">%1$s se izvršava</string>\n    <string name=\"dialog_adb_pairing_title\">Upari sa uređajem</string>\n    <string name=\"dialog_adb_pairing_discovery\">Traženje uređaja za uparivanje</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Kód za uparivanje</string>\n    <string name=\"paring_code_is_wrong\">Kód za uparivanje je pogrešan.</string>\n    <string name=\"cannot_connect_port\">Nemoguće je povezivanje sa uslugom bežičnog otklanjanje grešaka.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Bežično otklanjanje grešaka nije omogućeno.\n\\nPrimedba: Pre Android-a 11, omogućavanje bežičnog otklanjanja grešaka bilo je uslovljeno postojanjem konekcije sa računarom.</string>\n    <string name=\"dialog_adb_pairing_message\">\"Molim Vas, započnite proces uparivanja prateći sledeće korake: \\\"Razvojne opcije programera\\\" - \\\"Bežično otklanjanje grešaka\\\" - \\\"Uparivanje  uređaja pomoću kóda za uparivanje\\\".\n\\n\n\\nNakon uspešno izvršenog početka procesa uparivanja, moći ćete da unesete kód za uparivanje.\"</string>\n    <string name=\"adb_pairing_requires_multi_window\">Molim Vas, najpre izaberite režim podeljenog ekrana, odnosno režim više prozora.</string>\n    <string name=\"adb_error_key_store\">Neuspešno generisanje ključa za bežično otklanjanje grešaka.\n\\nOvo je možda iz razloga što je mehanizam skladišta ključeva ovog uređaja neispravan.</string>\n    <string name=\"adb_pair_required\">Molim Vas, najpre prođite kroz korake za uparivanje uređaja.</string>\n    <string name=\"development_settings\">Razvojne opcije programera</string>\n    <string name=\"notification_settings\">Opcije obaveštenja</string>\n    <string name=\"adb_pairing_tutorial_title\">Uparite Shizuku sa Vašim uređajem</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Notifikacija iz Shizuku aplikacije će Vam pomoći da dovršite uparivanje.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Otvorite sekciju \\\"Razvojne opcije programera\\\" - \\\"Bežično otklanjanje grešaka\\\". Dodirnite \\\"Uparivanje uređaja pomoću kóda za uparivanje\\\" i pojaviće Vam se 6-cifreni kód.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-sv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-sw600dp/bools.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"is_tablet\">true</bool>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-sw600dp/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"list_padding\">24dp</dimen>\n\n    <dimen name=\"home_padding\">8dp</dimen>\n\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-sw600dp/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_layout_manager\" translatable=\"false\">androidx.recyclerview.widget.StaggeredGridLayoutManager</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ta/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_adb_button_view_command\">கட்டளையைக் காட்டு</string>\n    <string name=\"home_adb_button_view_help\">உதவி பக்கத்தை திற</string>\n    <string name=\"home_adb_description\">Root அணுகல் இல்லாத பட்சத்தில், adb பயன்படுத்தி Shizuku வை தொடங்க வேண்டும் (கணினி இணைப்பு தேவை). ஒவ்வொரு முறை திறன்பேசி மறுதொடக்கம் ஆகும்போதும் இச்செயலை செய்ய வேண்டும். <b><a href=\"%1$s\">உதவி பக்கத்தை படிக்கவும்</a></b></string>\n    <string name=\"home_adb_title\">முதலில், திறன்பேசியை கணினியுடன் இணைக்கவும்</string>\n    <string name=\"home_status_service_version_update\">பதிப்பு %2$s, %1$s&lt;br&gt;%3$s பதிப்புக்கு மேம்படுத்த செயலியை மறுதொடக்கம் செய்யவும்</string>\n    <string name=\"home_status_service_version\">பதிப்பு %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s செயல்நிலையில் இல்லை</string>\n    <string name=\"home_status_service_is_running\">%1$s செயல்நிலையில் உள்ளது</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-te/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-th/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_requesting_legacy_title\">%1$s กำลังขอร้อง Shizuku รุ่นเก่า</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">เปิด Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; รองรับ Shizuku รุ่นใหม่ แต่กำลังขอร้อง Shizuku รุ่นเก่า นี่อาจเป็นเพราะ Shizuku ไม่ทำงาน โปรดตรวจสอบในแอป Shizuku &lt;p&gt;Shizuku รุ่นเก่าได้ถูกเลิกใช้ไปแล้วตั้งแต่เดือนมีนาคมปี 2019</string>\n    <string name=\"dialog_legacy_not_support_message\">Shizuku รุ่นเก่าได้ถูกเลิกใช้ไปแล้วตั้งแต่เดือนมีนาคม 2019 นอกจากนี้ Shizuku รุ่นเก่ายังใช้งานไม่ได้กับระบบ Android ที่ใหม่กว่า &lt;p&gt;โปรดติดต่อผู้พัฒนาของ &lt;b&gt;%1$s&lt;/b&gt; เพื่ออัปเดตเป็นเวอร์ชันใหม่</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s ไม่รองรับ Shizuku รุ่นใหม่</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nได้ถูกคัดลอกไปยังคลิปบอร์ด</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> ได้ถูกคัดลอกไปยังคลิปบอร์ด</string>\n    <string name=\"dialog_cannot_open_browser_title\">ไม่สามารถเปิดบราวเซอร์</string>\n    <string name=\"start_with_root_failed\">ไม่สามารถเริ่มบริการเนื่องจากไม่ได้รับการอนุญาตรูทหรืออุปกรณ์ไม่ได้ถูกรูท</string>\n    <string name=\"starter\">ตัวเริ่ม</string>\n    <string name=\"grant_dialog_button_deny\">ปฏิเสธ</string>\n    <string name=\"grant_dialog_button_allow_always\">อนุญาตเสมอ</string>\n    <string name=\"permission_warning_template\">อนุญาต <b>%1$s</b> ให้ %2$s ไหม\\?</string>\n    <string name=\"permission_description\">อนุญาตให้แอปใช้งาน Shizuku</string>\n    <string name=\"permission_label\">เข้าถึง Shizuku</string>\n    <string name=\"notification_adb_pairing_retry\">ลองใหม่</string>\n    <string name=\"notification_adb_pairing_failed_title\">การจับคู่ล้มเหลว</string>\n    <string name=\"notification_adb_pairing_succeed_text\">สามารถเริ่มบริการ Shizuku ได้ทันที</string>\n    <string name=\"notification_adb_pairing_succeed_title\">การจับคู่สำเร็จ</string>\n    <string name=\"notification_adb_pairing_working_title\">กำลังจับคู่</string>\n    <string name=\"notification_adb_pairing_stop_searching\">หยุดค้นหา</string>\n    <string name=\"notification_adb_pairing_service_found_title\">พบบริการการจับคู่</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">กำลังค้นหาบริการการจับคู่</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">ป้อนรหัสการจับคู่</string>\n    <string name=\"notification_channel_adb_pairing\">การจับคู่การแก้ไขข้อบกพร่องผ่าน Wi-Fi</string>\n    <string name=\"notification_working\">กำลังทำงาน…</string>\n    <string name=\"notification_service_start_no_root\">ล้มเหลวในการขอการอนุญาตรูท</string>\n    <string name=\"notification_service_start_failed\">ล้มเหลวในการเริ่มบริการ Shizuku</string>\n    <string name=\"notification_service_starting\">บริการ Shizuku กำลังเริ่มต้น…</string>\n    <string name=\"notification_channel_service_status\">สถานะการเริ่มบริการ</string>\n    <string name=\"action_stop\">หยุดทำงาน Shizuku</string>\n    <string name=\"dialog_stop_message\">บริการ Shizuku จะถูกหยุดทำงาน</string>\n    <string name=\"about_view_source_code\">ดูซอร์สโค้ดใน %s</string>\n    <string name=\"action_about\">เกี่ยวกับ</string>\n    <string name=\"settings_use_system_color\">ใช้สีของธีมระบบ</string>\n    <string name=\"settings_start_on_boot_summary\">สำหรับอุปกรณ์ที่รูทแล้ว Shizuku จะสามารถเริ่มได้โดยอัตโนมัติเมื่อเปิดเครื่อง</string>\n    <string name=\"settings_start_on_boot\">เริ่มเมื่อเปิดเครื่อง (รูท)</string>\n    <string name=\"settings_translation_summary\">ช่วยเราแปล %s เป็นภาษาของคุณ</string>\n    <string name=\"settings_translation\">มีส่วนร่วมในการแปล</string>\n    <string name=\"settings_translation_contributors\">ผู้มีส่วนร่วมในการแปลภาษา</string>\n    <string name=\"settings_startup\">เมื่อเริ่มต้น</string>\n    <string name=\"settings_black_night_theme_summary\">ใช้ธีมสีดำสนิทหากธีมมืดถูกเปิดอยู่</string>\n    <string name=\"settings_black_night_theme\">ธีมมืดมิด</string>\n    <string name=\"settings_user_interface\">ลักษณะ</string>\n    <string name=\"settings_language\">ภาษา</string>\n    <string name=\"settings_title\">การตั้งค่า</string>\n    <string name=\"rish_description\">ด้วย %1$s ในแอปเทอร์มินอลใด ๆ คุณจะสามารถเชื่อมต่อและดำเนินการกับ shell ที่รันโดย Shizuku &lt;p&gt;รายละเอียดอื่น ๆ ในการใช้ %1$s แตะเพื่อดูเอกสาร</string>\n    <string name=\"terminal_tutorial_3_description\">แนะนำนิดหน่อย: ให้การอนุญาตดำเนิดการแก่ %1$s และเพิ่มเข้าไปใน %2$s ก็จะสามารถใช้ %1$s ได้โดยตรง</string>\n    <string name=\"terminal_tutorial_3\">สุดท้าย ย้ายไฟล์ไปสักที่ที่แอปเทอร์มินอลของคุณสามารถเข้าถึงได้ ทีนี้คุณก็จะสามารถใช้ %1$s เพื่อสั่งคำสั่งผ่าน Shizuku</string>\n    <string name=\"terminal_tutorial_2_description\">ยกตัวอย่างเช่น ถ้าคุณต้องการใช้ Shizuku ใน %1$s คุณจะต้องแทนที่ %2$s ด้วย %3$s (%4$s คือชื่อแพ็กเกจของ %1$s)</string>\n    <string name=\"terminal_tutorial_2\">จากนั้น ใช้ตัวแก้ไขไฟล์เปิดและแก้ไข %1$s</string>\n    <string name=\"terminal_export_files\">ส่งออกไฟล์</string>\n    <string name=\"terminal_tutorial_1_description\">หากมีไฟล์ที่มีชื่อเดียวกันในโฟลเดอร์ที่เลือก ไฟล์เหล่านั้นจะถูกลบออก\n\\n\n\\nใช้ฟังก์ชันการส่งออก SAF (Storage Access Framework) มีรายงานว่า MIUI ทำลายฟังก์ชันของ SAF หากคุณใช้ MIUI คุณอาจจะต้องแตกไฟล์จาก apk ของ Shizuku หรือดาวน์โหลดจาก GitHub</string>\n    <string name=\"terminal_tutorial_1\">ก่อนอื่น ส่งออกไฟล์ไปยังที่ใดก็ได้ จะมีอยู่สองไฟล์ %1$s และ %2$s</string>\n    <string name=\"home_terminal_description\">สั่งคำสั่งผ่าน Shizuku ในแอปเทอร์มินอลที่คุณเลือก</string>\n    <string name=\"home_terminal_title\">ใช้ Shizuku ในแอปเทอร์มินอล</string>\n    <string name=\"app_management_item_summary_requires_root\">* จำเป็นต้องให้ Shizuku ทำงานผ่านรูท</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">เป็นไปได้สูงที่ผู้ผลิตอุปกรณ์ของคุณจะจำกัดการอนุญาตของ adb &lt;p&gt;อาจมีวิธีแก้ไขสำหรับอุปกรณ์ของคุณใน&lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;เอกสารนี้&lt;/a&gt;&lt;/b&gt;</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">การอนุญาตของ adb นั้นจำกัด</string>\n    <string name=\"home_learn_more_description\">เรียนรู้การพัฒนาเพื่อใช้ร่วมกันกับ Shizuku</string>\n    <string name=\"home_learn_more_title\">เรียนรู้ Shizuku</string>\n    <string name=\"home_app_management_view_authorized_apps\">แตะเพื่อจัดการแอปที่ได้รับอนุญาต</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"other\">อนุญาตแล้ว %d แอปพลิเคชัน</item>\n    </plurals>\n    <string name=\"home_app_management_title\">การจัดการแอปพลิเคชัน</string>\n    <string name=\"home_root_button_restart\">เริ่มใหม่</string>\n    <string name=\"home_root_button_start\">เริ่ม</string>\n    <string name=\"home_root_description_sui\">หากคุณกำลังใช้ Magisk สามารถลองใช้ %1$s สำหรับผู้ใช้งานรูท จะเป็นตัวที่ใช้แทนที่ Shizuku แต่โปรดทราบว่า แอปพลิเคชันที่มีอยู่จำเป็นต้องเปลี่ยนเล็กน้อยให้ไปใช้ %2$s</string>\n    <string name=\"home_root_description\">นอกจากนี้ Shizuku ยังสามารถเริ่มอัตโนมัติเมื่ออุปกรณ์ถูกเปิด หากไม่ โปรดตรวจสอบอุปกรณ์หรือเครื่องมือภายนอกที่จำกัดการเข้าถึงของ Shizuku&lt;br&gt;หรือดูตาม %s</string>\n    <string name=\"home_root_title\">เริ่ม (สำหรับอุปกรณ์ที่รูทแล้ว)</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">บางระบบ (เช่น MIUI) จะไม่อนุญาตให้แอปเข้าถึงเครือข่ายเมื่อไม่แสดง แม้แอปจะใช้บริการเบื้องหน้าตามปกติ โปรดเปิดใช้งานการเพิ่มประสิทธิภาพแบตเตอรี่ของ Shizuku บนระบบที่เป็นเช่นนั้น</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku จำเป็นต้องเข้าถึงเครือข่ายท้องถิ่น ซึ่งกำลังควบคุมอยู่โดยการอนุญาตเครือข่าย</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">กลับไปที่ Shizuku เพื่อเริ่ม Shizuku</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">โปรดให้ทราบว่า ส่วนด้านซ้ายของตัวเลือก \\\"การแก้ไขข้อบกพร่องผ่าน Wi-Fi\\\" สามารถกดได้ เมื่อแตะแล้วจะเปิดหน้าใหม่ขึ้นมา การแค่เปิดสวิตช์ที่ด้านขวาอย่างเดียวนั้นไม่ถูกต้อง</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">ไม่เช่นนั้นจะไม่สามารถป้อนรหัสการจับคู่ลงในการแจ้งเตือน</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">ผู้ใช้ MIUI อาจจำเป็นต้องเปลี่ยนสไตล์การแจ้งเตือนเป็น \\\"Android\\\" ใน \\\"การแจ้งเตือน\\\" -\\\"เฉดการแจ้งเตือน\\\" ในการตั้งค่าของระบบ</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">กระบวนการจับคู่จำเป็นต้องมีการป้อนข้อมูลลงในการแจ้งเตือนของ Shizuku โปรดอนุญาตให้ Shizuku ส่งการแจ้งเตือน</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">ป้อนรหัสลงไปในการแจ้งเตือนเพื่อเสร็จสิ้นการจับคู่</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">เข้าไปยัง \\\"ตัวเลือกสำหรับนักพัฒนาแอป\\\" - \\\"การแก้ไขข้อบกพร่องผ่าน Wi-Fi\\\" แตะ \\\"จับคู่อุปกรณ์ผ่านรหัสการจับคู่\\\" ก็จะพบกับรหัสหกตัว</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">การแจ้งเตือนจาก Shizuku จะช่วยให้เสร็จสิ้นกระบวนการจับคู่</string>\n    <string name=\"adb_pairing_tutorial_title\">จับคู่ Shizuku กับอุปกรณ์</string>\n    <string name=\"notification_settings\">ตัวเลือกการแจ้งเตือน</string>\n    <string name=\"development_settings\">ตัวเลือกสำหรับนักพัฒนาแอป</string>\n    <string name=\"adb_pair_required\">โปรดทำขั้นตอนการจับคู่ก่อน</string>\n    <string name=\"adb_error_key_store\">ไม่สามารถสร้างรหัสเพื่อเชื่อมต่อการแก้ไขข้อบกพร่องผ่าน Wi-Fi\n\\nอาจเป็นเพราะกลไกการจัดเก็บรหัสของอุปกรณ์เสียหาย</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">ระบบจำเป็นจะต้องให้มีหน้าต่างรหัสการจับคู่แสดงอยู่ตลอดเวลา ใช้โหมดแนกหน้าจอเป็นหนทางเดียวที่จะปล่อยแอปและหน้าต่างของระบบแสดงพร้อมกันในเวลาเดียวกัน</string>\n    <string name=\"adb_pairing_requires_multi_window\">โปรดเข้าสู่โหมดแยกหน้าจอ (หลายหน้าต่าง) ก่อน</string>\n    <string name=\"paring_code_is_wrong\">รหัสการจับคู่ไม่ถูกต้อง</string>\n    <string name=\"dialog_adb_pairing_paring_code\">รหัสการจับคู่</string>\n    <string name=\"dialog_adb_pairing_message\">โปรดเริ่มจับคู่ตามขั้นตอนนี้: \\\"ตัวเลือกสำหรับนักพัฒนาแอป\\\" - \\\"การแก้ไขข้อบกพร่องผ่าน Wi-Fi\\\" - \\\"จับคู่อุปกรณ์ด้วยรหัสการจับคู่\\\"\n\\n\n\\nหลังจากเริ่มกระบวนการจับคู่ จะสามารถป้อนรหัสการจับคู่</string>\n    <string name=\"home_wireless_adb_description_pre_11\">หาก Android เป็นรุ่นที่เก่ากว่า 11 นั้นจำเป็นต้องเชื่อมต่อกับคอมพิวเตอร์เพื่อเปิดใช้งานการแก้ไขข้อบกพร่องผ่าน Wi-Fi</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">การแก้ไขข้อบกพร่องผ่าน Wi-Fi ไม่ถูกเปิดไว้\n\\nหมายเหตุ หาก Android เป็นรุ่นที่เก่ากว่า 11 การจะเปิดการแก้ไขข้อบกพร่องผ่าน Wi-Fi จำเป็นต้องมีการเชื่อมต่อกับคอมพิวเตอร์</string>\n    <string name=\"cannot_connect_port\">ไม่สามารถเชื่อมต่อกับบริการการแก้ไขข้อบกพร่องผ่าน Wi-Fi</string>\n    <string name=\"dialog_adb_pairing_discovery\">กำลังค้นหาบริการจับคู่</string>\n    <string name=\"dialog_adb_pairing_title\">จับคู่กับอุปกรณ์</string>\n    <string name=\"adb_pairing\">จับคู่</string>\n    <string name=\"dialog_adb_invalid_port\">พอร์ตคือเลขจำนวนเต็ม ค่าตั้งแต่ 1 ถึง 65535</string>\n    <string name=\"dialog_adb_port\">พอร์ต</string>\n    <string name=\"dialog_adb_discovery_message\">โปรดเปิดใช้งาน \\\"การแก้ไขข้อบกพร่องผ่าน Wi-Fi\\\" ใน \\\"ตัวเลือกสำหรับนักพัฒนาแอป\\\" \\\"การแก้ไขข้อบกพร่องผ่าน Wi-Fi\\\" จะถูกปิดโดยอัตโนมัติเมื่อเปลี่ยนเครือข่าย\n\\n\n\\nหมายเหตุ ห้ามปิดใช้งาน \\\"ตัวเลือกสำหรับนักพัฒนาแอป\\\" หรือ \\\"การแก้ไขข้อบกพร่อง USB\\\" ไม่เช่นนั้น Shizuku จะหยุดการทำงาน</string>\n    <string name=\"home_wireless_adb_description\">ตั้งแต่ Android 11 ขึ้นไป สามารถเปิดใช้งานการแก้ไขข้อบกพร่องผ่าน Wi-Fi เพื่อเริ่ม Shizuku ได้โดยตรงผ่านอุปกรณ์ โดยไม่ต้องเชื่อมต่อกับคอมพิวเตอร์ &lt;p&gt;โปรดอ่านคำแนะนำทีละขั้นตอนก่อน</string>\n    <string name=\"home_wireless_adb_title\">เริ่มผ่านการแก้ไขข้อบกพร่องผ่าน Wi-Fi</string>\n    <string name=\"dialog_adb_discovery\">กำลังค้นหาบริการการแก้ไขข้อบกพร่อง</string>\n    <string name=\"home_wireless_adb_view_guide_button\">คำแนะนำทีละขั้นตอน</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">ส่ง</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">คัดลอก</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* มีข้อควรพิจารณาอื่น ๆ โปรดอ่านความช่วยเหลือให้เข้าใจก่อน</string>\n    <string name=\"home_adb_button_view_command\">ดูคำสั่ง</string>\n    <string name=\"home_adb_button_view_help\">อ่านการช่วยเหลือ</string>\n    <string name=\"home_adb_title\">เริ่มโดยเชื่อมต่อกับคอมพิวเตอร์</string>\n    <string name=\"home_status_service_is_running\">%1$s กำลังทำงาน</string>\n    <string name=\"home_adb_description\">สำหรับอุปกรณ์ที่ไม่ได้ติดตั้งรูท จะต้องใช้ adb เพื่อเริ่ม Shizuku (จำเป็นต้องเชื่อมต่อกับคอมพิวเตอร์) กระบวนการนี้จะต้องทำทุกครั้งที่อุปกรณ์ปิดและเปิดใหม่ กรุณา<b><a href=\"%1$s\">อ่านการช่วยเหลือ</a></b></string>\n    <string name=\"home_status_service_version_update\">เวอร์ชัน %2$s, %1$s&lt;br&gt;เริ่มใหม่อีกครั้งเพื่ออัปเดตเป็นเวอร์ชัน %3$s</string>\n    <string name=\"home_status_service_version\">เวอร์ชัน %2$s ผ่าน %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s ไม่ได้กำลังทำงาน</string>\n    <string name=\"translation_contributors\">altinat</string>\n    <string name=\"home_adb_is_limited_description\">ผู้ผลิตอุปกรณ์ของคุณ จำกัดการอนุญาต adb ทำให้แอปที่ใช้ Shizuku จะไม่ทำงานอย่างถูกต้อง\n\\n\n\\nโดยปกติ ข้อจำกัดนี้สามารถจัดการได้โดยการปรับตัวเลือกใน \\\"ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์\\\" โปรดอ่าน การช่วยเหลือสำหรับรายละเอียดวิธีการแก้ไข\n\\n\n\\nคุณอาจต้องรีสตาร์ท Shizuku เพื่อให้การดำเนินการมีผล</string>\n    <string name=\"home_adb_is_limited_title\">คุณต้องทำขั้นตอนเพิ่มเติม</string>\n    <string name=\"home_app_management_empty\">แอปที่ขอร้องหรือขอใช้ Shizuku จะแสดงที่นี่</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">โปรดลองปิดและเปิดใช้งาน \\\"การแก้ไขข้อบกพร่องผ่าน Wi-Fi\\\" ใหม่ หากระบบยังคงค้นหาอยู่</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_wireless_adb_not_enabled\">Kablosuz hata ayıklama etkin değil.\n\\nNot, Android 11’den önce kablosuz hata ayıklamayı etkinleştirmek için bilgisayar bağlantısının şart olduğunu unutmayın.</string>\n    <string name=\"cannot_connect_port\">Kablosuz hata ayıklama hizmeti bağlanamıyor.</string>\n    <string name=\"paring_code_is_wrong\">Eşleme kodu yanlış.</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Eşleşme kodu</string>\n    <string name=\"dialog_adb_pairing_discovery\">Eşleştirme servisi aranıyor</string>\n    <string name=\"dialog_adb_pairing_title\">Cihazla eşleş</string>\n    <string name=\"adb_pairing\">Eşleştiriliyor</string>\n    <string name=\"dialog_adb_invalid_port\">Port 1 ile 65535 arasında değişen bir tamsayıdır.</string>\n    <string name=\"dialog_adb_port\">Port</string>\n    <string name=\"dialog_adb_discovery_message\">Lütfen \\\"Geliştirici seçenekleri\\\"nde \\\"Kablosuz hata ayıklama\\\"yı etkinleştirin. Ağ değiştiğinde \\\"kablosuz hata ayıklama\\\" otomatik olarak devre dışı bırakılır.\n\\n\n\\nNot, \\\"Geliştirici seçenekleri\\\" veya \\\"USB hata ayıklama\\\" devre dışı bırakmayın, Shizuku durdurulur.</string>\n    <string name=\"dialog_adb_discovery\">Kablosuz hata ayıklama hizmeti aranıyor</string>\n    <string name=\"home_wireless_adb_title\">Kablosuz hata ayıklama ile başlat</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Gönder</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Kopyala</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Başka hususlar da var, lütfen önce yardımı okuduğunuzu onaylayın.</string>\n    <string name=\"home_adb_button_view_command\">Komutu görüntüle</string>\n    <string name=\"home_adb_button_view_help\">Yardımı oku</string>\n    <string name=\"home_adb_description\">Rootsuz cihazlar için Shizuku’yu başlatmak için adb kullanmanız gerekir (bilgisayar bağlantısı gerektirir). Bu işlemin cihaz her yeniden başlatıldığında tekrarlanması gerekir. Lütfen <b><a href=\"%1$s\">yardımı okuyun</a></b>.</string>\n    <string name=\"home_adb_title\">Bilgisayara bağlanarak başlatın</string>\n    <string name=\"home_status_service_version_update\">Sürüm %2$s, %1$s&lt;br&gt;Sürüm %3$s, güncelleştirmek için yeniden başlatın</string>\n    <string name=\"home_status_service_version\">Sürüm %2$s, %1$s</string>\n    <string name=\"home_status_service_not_running\">%1$s çalışmıyor</string>\n    <string name=\"home_status_service_is_running\">%1$s çalışıyor</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Yetkilendirilmiş %d tane uygulama</item>\n        <item quantity=\"other\">Yetkilendirilmiş %d tane uygulama</item>\n    </plurals>\n    <string name=\"home_app_management_title\">Uygulama yönetimi</string>\n    <string name=\"home_root_button_restart\">Yeniden başlat</string>\n    <string name=\"home_root_button_start\">Başlat</string>\n    <string name=\"home_root_description\">Buna ek olarak, Shizuku otomatik olarak açılışta başlatılabilir. Aksi durumda ise, lütfen sisteminizin veya üçüncü taraf araçlarınızın Shizuku\\'yu kısıtlayıp kısıtlamadığını kontrol edin. &lt;br&gt;%s \\'ye başvurabilirsiniz.</string>\n    <string name=\"home_root_title\">Başlat (rootlu cihazlar için)</string>\n    <string name=\"development_settings\">Geliştirici seçenekleri</string>\n    <string name=\"adb_pair_required\">Lütfen önce eşleştirme adımını uygulayın.</string>\n    <string name=\"adb_error_key_store\">Kablosuz hata ayıklama için anahtar üretilemiyor.\n\\nBunun nedeni, bu aygıtın KeyStore mekanizmasının bozuk olması olabilir.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Sistem, eşleştirme iletişim kutusunun her zaman görünür olmasını zorunda kılıyor; bölünmüş ekran modunu kullanmak, bu uygulamanın ve sistem iletişim kutusunun aynı anda görünür olmasını sağlamanın tek yoludur.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Lütfen önce bölünmüş ekran (çoklu pencere) moduna girin.</string>\n    <string name=\"dialog_adb_pairing_message\">Lütfen aşağıdaki adımları izleyerek eşleştirme işlemine başlayın: \\\"Geliştirici Seçenekleri\\\" - \\\"Kablosuz hata ayıklama\\\" - \\\"Cihazı eşleme kodu kullanarak eşleştir\\\".\n\\n\n\\nEşleştirme işlemi başladıktan sonra eşleştirme kodunu girebilirsiniz.</string>\n    <string name=\"translation_contributors\">İlker Binzet (ilker.binzet@gmail.com)\n\\nUmut Songur (umutsongur19@gmail.com)\n\\ncroxz900 (croxz.900@gmail.com)</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Shizuku’yu aç</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; yeni Shizuku desteğine sahip ama eski Shizuku talep ediyor. Bu Shizuku çalışmadığı zaman meydana gelir, lütfen Shizuku uygulamasını kontrol edin.&lt;p&gt;Eski Shizuku uygulaması Mart 2019’da kullanımdan kaldırılmıştır.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s, mevcut Shizuku gerektiriyor</string>\n    <string name=\"dialog_legacy_not_support_message\">Eski Shizuku, Mart 2019’dan beri kullanımdan kaldırılmıştır. Ayrıca, eski Shizuku yeni Android sistemlerinde çalışmaz. &lt;p&gt;Lütfen&lt;b&gt;%1$s&lt;/b&gt; geliştiricisinden güncelleme yapmasını isteyin.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s, yeni Shizuku’yu desteklemiyor</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> panoya kopyalandı.</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\npanoya kopyalanmıştır.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Tarayıcı başlatılamıyor</string>\n    <string name=\"start_with_root_failed\">Root izni verilmediği veya bu aygıtın rootlu olmadığı için hizmet başlatılamıyor.</string>\n    <string name=\"starter\">Başlatıcı</string>\n    <string name=\"permission_label\">Shizuku’ya erişim</string>\n    <string name=\"notification_working\">Çalışıyor…</string>\n    <string name=\"notification_service_start_no_root\">Kök izni sağlanamadı.</string>\n    <string name=\"notification_service_start_failed\">Shizuku hizmeti başlatılamadı.</string>\n    <string name=\"notification_service_starting\">Shizuku hizmeti başlıyor…</string>\n    <string name=\"notification_channel_service_status\">Hizmet başlangıç durumu</string>\n    <string name=\"dialog_stop_message\">Shizuku hizmeti durdurulacak.</string>\n    <string name=\"action_stop\">Shizuku’yu durdur</string>\n    <string name=\"about_view_source_code\">%s ’da kaynak kodunu görüntüle</string>\n    <string name=\"action_about\">Hakkında</string>\n    <string name=\"settings_translation_summary\">%s , dilinize çevirmemize yardımcı olun</string>\n    <string name=\"settings_translation\">Çeviriye katılın</string>\n    <string name=\"settings_translation_contributors\">Çeviriye katkıda bulunanlar</string>\n    <string name=\"settings_startup\">Başlangıç</string>\n    <string name=\"settings_black_night_theme_summary\">Gece modu etkinse saf siyah temasını kullanın</string>\n    <string name=\"settings_black_night_theme\">Siyah gece teması</string>\n    <string name=\"settings_user_interface\">Görünüm</string>\n    <string name=\"settings_language\">Dil</string>\n    <string name=\"settings_title\">Ayarlar</string>\n    <string name=\"app_management_item_summary_requires_root\">* Shizuku’nun root ile çalıştırılması gerekli</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Cihaz üreticinizin adb iznini sınırlaması son derece olasıdır. &lt;p&gt;Bu belgede&lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;sisteminiz için bir çözüm olabilir&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">ADB’nin izni sınırlıdır</string>\n    <string name=\"home_learn_more_description\">Shizuku ile nasıl uygulama geliştireceğinizi öğrenin</string>\n    <string name=\"home_learn_more_title\">Daha fazlasını öğren</string>\n    <string name=\"home_app_management_view_authorized_apps\">Yetkilendirilmiş uygulamaları yönetmek için dokunun</string>\n    <string name=\"settings_start_on_boot_summary\">Rootlu cihazlar için, Shizuku sistem açılışı sırasında otomatik olarak başlayabilir</string>\n    <string name=\"settings_start_on_boot\">Sistem açılışında başlat (root)</string>\n    <string name=\"grant_dialog_button_allow_always\">Her zaman izin ver</string>\n    <string name=\"grant_dialog_button_deny\">Reddet</string>\n    <string name=\"permission_warning_template\"><b>%1$s</b> uygulamasına %2$s için izin verilsin mi\\?</string>\n    <string name=\"terminal_tutorial_3_description\">Bazı ipuçları: %1$s’e yürütme izni verin ve %2$s’a ekleyin, %1$s’i doğrudan kullanabileceksiniz.</string>\n    <string name=\"home_wireless_adb_description\">Android 11 ve üzeri sürümlerde, Kablosuz hata ayıklama ve Shizuku\\'yu cihazınızdan bir bilgisayara bağlanmadan direkt aktif edebilirsiniz.&lt;p&gt;Lütfen öncelikle adım adım kılavuz\\'u inceleyin.</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">MIUI kullanıcılarının sistem ayarlarında \\\"Bildirim\\\" - \\\"Bildirim gölgesi\\\"nden bildirim stilini \\\"Android\\\" olarak değiştirmeleri gerekebilir.</string>\n    <string name=\"home_terminal_title\">Shizuku’yu terminal uygulamalarında kullanın</string>\n    <string name=\"home_terminal_description\">Sevdiğiniz terminal uygulamalarında Shizuku aracılığıyla komutları çalıştırın</string>\n    <string name=\"terminal_tutorial_1\">İlk olarak, dosyaları istediğiniz yere dışa aktarın. İki dosya bulacaksınız, %1$s ve %2$s.</string>\n    <string name=\"terminal_tutorial_1_description\">Seçilen klasörde aynı ada sahip dosyalar varsa bunlar silinecektir.\n\\n\n\\nDışa aktarma işlevi SAF’yi (Depolama Erişim Çerçevesi) kullanır. MIUI’ın SAF işlevlerini bozduğu bildirildi. MIUI kullanıyorsanız, dosyayı Shizuku’nun apk’sinden çıkarmanız veya GitHub’dan indirmeniz gerekebilir.</string>\n    <string name=\"terminal_export_files\">Dosyaları dışa aktar</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Shizuku’dan bir bildirim eşleştirmeyi tamamlamanıza yardım edecek.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">\\\"Geliştirici Seçenekleri\\\" - \\\"Kablosuz hata ayıklama\\\" girin. \\\"Cihazı eşleştirme kodu ile eşleştir\\\"e dokunun, altı haneli bir kod göreceksiniz.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Eşleştirmeyi tamamlamak için kodu bildirime girin.</string>\n    <string name=\"rish_description\">%1$s ile herhangi bir terminal uygulamasında Shizuku\\'nun shell run\\'larına bağlanabilir ve bunlarla etkileşim kurabilirsiniz. &lt;p&gt;%1$s ayrıntılı kullanımı hakkında, belgeyi görüntülemek için dokunun.</string>\n    <string name=\"adb_pairing_tutorial_title\">Shizuku’yu cihazınızla eşleştirin</string>\n    <string name=\"home_root_description_sui\">Magisk kullanıyorsanız, %1$s’yi deneyebilirsiniz. Kök kullanıcıları için sonunda Shizuku’nun yerini alacak. %2$s’yi kullanmak için mevcut uygulamaların biraz değişmesi gerektiğini unutmayın.</string>\n    <string name=\"notification_settings\">Bildirim seçenekleri</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Eşleştirme işlemi, Shizuku\\'dan gelen bir bildirimle etkileşim kurmanızı gerektirir. Lütfen Shizuku\\'nun bildirim göndermesine izin verin.</string>\n    <string name=\"terminal_tutorial_2\">Ardından, %1$s’i açıp düzenlemek için herhangi bir metin düzenleyiciyi kullanın.</string>\n    <string name=\"terminal_tutorial_2_description\">Örneğin, Shizuku\\'yu %1$s içinde kullanmak istiyorsanız, %2$s\\'yi %3$s ile değiştirmelisiniz (%4$s, %1$s paketinin adıdır).</string>\n    <string name=\"terminal_tutorial_3\">Son olarak, dosyaları terminal uygulamanızın erişebileceği bir yere taşıyın, Shizuku aracılığıyla komutları çalıştırmak için %1$s kullanabileceksiniz.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Android 11 ve önceki sürümlerde, Kablosuz hata ayıklama’yı aktif etmek için bir bilgisayara bağlanmak gereklidir.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Adım adım kılavuz</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Shizuku\\'ya geri dönün ve Shizuku\\'yu başlatın.</string>\n    <string name=\"notification_channel_adb_pairing\">Kablosuz hata ayıklama eşleştirmesi</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Eşleştirme kodunu girin</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Eşleştirme hizmeti aranıyor</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Eşleştirme hizmeti bulundu</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Aramayı durdur</string>\n    <string name=\"notification_adb_pairing_working_title\">Eşleştirme devam ediyor</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Eşleştirme başarılı</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Shizuku hizmetini şimdi başlatabilirsiniz.</string>\n    <string name=\"notification_adb_pairing_failed_title\">Eşleştirme başarısız</string>\n    <string name=\"notification_adb_pairing_retry\">Yeniden dene</string>\n    <string name=\"permission_description\">Uygulamanın Shizuku’yu kullanmasına izin verin.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Aksi takdirde, bildirimden eşleştirme kodunu giremeyebilirsiniz.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku’nun yerel ağa erişmesi gerekiyor. Ağ izni tarafından kontrol edilir.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Lütfen, \\\"Kablosuz hata ayıklama\\\" seçeneğinin sol kısmının tıklanabilir olduğunu, dokunulduğunda yeni bir sayfa açılacağını unutmayın. Yalnızca sağdaki düğmeyi açmak yanlıştır.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Bazı sistemler (MIUI gibi), uygulama standart olarak ön plan hizmetini kullansa bile, arka planda çalıştıklarında ağa erişmesine izin vermez. Lütfen bu tür sistemlerde Shizuku için pil optimizasyon özelliklerini devre dışı bırakın.</string>\n    <string name=\"settings_use_system_color\">Sistem tema rengini kullan</string>\n    <string name=\"home_adb_is_limited_title\">Fazladan bi adım daha yapmanız gerekiyor</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Eğer sürekli arıyorsa lütfen \\\"Wireless Debugging\\\" ayarını kapatıp açmayı deneyin.</string>\n    <string name=\"home_app_management_empty\">Shizuku iznine ihtiyaç duyan uygulamalar burada gösterilir.</string>\n    <string name=\"home_adb_is_limited_description\">Cihaz üreticiniz adb izinlerini kısıtladığı için Shizuku kullanan uygulamalar düzgün çalışmayacaktır. \n\\n \n\\nGenellikle, bu kısıtlama \\\"Geliştirici seçenekleri\\\"ndeki bazı ayarlar değiştirilerek kaldırılabilir. Bunun nasıl yapılacağına ilişkin ayrıntılar için lütfen yardımı okuyun. \n\\n \n\\nİşlemin etkili olabilmesi için Shizuku yeniden başlatılmalı.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ug/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"action_about\">Про додаток</string>\n    <string name=\"home_adb_button_view_command\">Переглянути adb команду</string>\n    <string name=\"home_adb_button_view_help\">Прочитати онлайн довідку</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Дозвіл на adb обмежений</string>\n    <string name=\"home_app_management_title\">Авторизовані додатки</string>\n    <string name=\"settings_black_night_theme\">Чорна темна тема</string>\n    <string name=\"settings_black_night_theme_summary\">Використовуйте чорну тему, якщо включений нічний режим</string>\n    <string name=\"start_with_root_failed\">Неможливо запустити службу, оскільки не надано дозвіл root або цей пристрій не рутовано.</string>\n    <string name=\"notification_channel_service_status\">Статус запуску серав</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Копіювати</string>\n    <string name=\"dialog_cannot_open_browser_title\">Не вдається запустити браузер</string>\n    <string name=\"home_learn_more_title\">Вивчіть Shizuku</string>\n    <string name=\"home_learn_more_description\">Дізнайтеся, як розробляти з Shizuku</string>\n    <string name=\"notification_service_start_failed\">Помилка запуску служби Shizuku.</string>\n    <string name=\"notification_service_start_no_root\">Помилка запиту на root доступ.</string>\n    <string name=\"notification_service_starting\">Сервіс Shizuku запущено…</string>\n    <string name=\"notification_working\">Працює…</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Відкрити Shizuku</string>\n    <string name=\"home_root_button_restart\">Перезапуск</string>\n    <string name=\"home_status_service_is_running\">%1$s працює</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Відправити</string>\n    <string name=\"settings_language\">Мова</string>\n    <string name=\"home_root_button_start\">Запуск</string>\n    <string name=\"home_status_service_version\">версія %2$s, %1$s</string>\n    <string name=\"settings_user_interface\">Зовнішній вигляд</string>\n    <string name=\"settings_startup\">Стартап</string>\n    <string name=\"home_status_service_version_update\">версія %2$s, %1$s&lt;br&gt;почніть оновлюватися до версії %3$s</string>\n    <string name=\"permission_label\">доступ до Shizuku</string>\n    <string name=\"app_management_item_summary_requires_root\">* потрібен root, щоб запускався Shizuku</string>\n    <string name=\"home_status_service_not_running\">%1$s не працює</string>\n    <string name=\"about_view_source_code\"><![CDATA[Переглянути вихідний код на %s]]></string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Можливо, ваш виробник пристрою лімітує дозвіл adb.&lt;p&gt;Можливо, є рішення для вашої системи у &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;цьому документі&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"home_adb_description\">Для пристроїв без root потрібно використовувати ADB для запуску Shizuku (потрібне підключення до комп’ютера). Цей процес потрібно повторювати кожного разу, коли пристрій перезавантажується. Будь ласка, <b><a href=\"%1$s\">прочитайте довідку</a></b>.</string>\n    <string name=\"home_adb_title\">Почніть з підключення до ПК</string>\n    <string name=\"home_root_title\"><![CDATA[Запустіть службу з root доступом]]></string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> скопійовано в буфер обміну.</string>\n    <string name=\"home_app_management_view_authorized_apps\"><![CDATA[Натисніть для перегляду авторизованих додатків]]></string>\n    <string name=\"home_adb_dialog_view_command_message\"><![CDATA[<font face=\"monospace\">%1$s</font><br><br>* Є деякі інші міркування, будь ласка, підтвердьте, що ви прочитали довідку спочатку.]]></string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nскопійовано в буфер обміну.</string>\n    <string name=\"translation_contributors\">Nederlands, vitalitk</string>\n    <string name=\"grant_dialog_button_allow_always\">Завжди дозволяти</string>\n    <string name=\"grant_dialog_button_deny\">Заборонити</string>\n    <string name=\"permission_warning_template\">Дозволити додатку <b>%1$s</b> таке: %2$s\\?</string>\n    <string name=\"home_wireless_adb_title\">Запуск за допомогою налагоджування через Wi-Fi</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Повідомлення від Shizuku допоможе вам закінчити парування.</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Введіть код в повідомленні щоб завершити парування.</string>\n    <string name=\"adb_pairing_tutorial_title\">Парувати Shizuku з вашим пристроєм</string>\n    <string name=\"notification_settings\">Налаштування повідомлень</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Процес парування потребує, щоб ви взаємодіяли із сповіщенням від Shizuku. Будь ласка, дозвольте Shizuku публікувати сповіщення.</string>\n    <string name=\"home_wireless_adb_description\">Починаючи з Android 11 та вище, ви можете ввімкнути налагодження через WiFi та запустити Shizuku прямо з вашого пристрою, не під\\'єднуючись до комп\\'ютеру.&lt;p&gt;Будь ласка, спочатку перегляньте інструкцію.</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Покрокова інструкція</string>\n    <string name=\"dialog_adb_discovery\">Пошук сервісу бездротового налагодження</string>\n    <string name=\"dialog_adb_discovery_message\">Будь ласка, увімкніть \\\"Налагодження через Wi-Fi\\\" в \\\"Параметрах розробника\\\". \\\"Налагодження через Wi-Fi\\\" автоматично вимикається при зміні мереж.\n\\n\n\\nЗверніть увагу, не вимикайте \\\"Параметри розробника\\\" чи \\\"Налагодження USB\\\", інакше Shizuku буде зупинено.</string>\n    <string name=\"dialog_adb_port\">Порт</string>\n    <string name=\"dialog_adb_invalid_port\">Порт – це ціле число від 1 до 65535.</string>\n    <string name=\"adb_pairing\">Парування</string>\n    <string name=\"dialog_adb_pairing_title\">Спарувати з пристроєм</string>\n    <string name=\"dialog_adb_pairing_discovery\">Пошук сервісу парування</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Код парування</string>\n    <string name=\"paring_code_is_wrong\">Код парування неправильний.</string>\n    <string name=\"cannot_connect_port\">Неможливо під\\'\\'єднатися до сервісу бездротового налагодження.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Налагодження через Wi-Fi не ввімкнено.\n\\nЗверніть увагу, до Android 11, щоб увімкнути налагодження через Wi-Fi, під\\'\\'єднання до ПК обов\\'\\'язкове.</string>\n    <string name=\"dialog_adb_pairing_message\">Будь ласка, почніть парування, виконавши такі кроки: \\\"Параметри розробника\\\" - \\\"Налагодження через Wi-Fi\\\" - \\\"Підключати пристрій за допомогою коду підключення\\\".\n\\n\n\\nПісля початку процесу парування, ви зможете ввести код парування.</string>\n    <string name=\"adb_pairing_requires_multi_window\">Спершу увійдіть в режим розділеного екрана (багатьох вікон).</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Системі потрібно, щоб діалогове вікно парування завжди було видимим. Використання режиму розділеного екрана — єдиний спосіб, щоб ця програма та системне діалогове вікно були видимими одночасно.</string>\n    <string name=\"adb_pair_required\">Будь ласка, спочатку пройдіть етап парування.</string>\n    <string name=\"development_settings\">Параметри розробника</string>\n    <string name=\"adb_error_key_store\">Неможливо генерувати ключ для налагодження через Wi-Fi.\n\\nМожливо, механізм KeyStore цього пристрою зламаний.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Зайдіть в \\\"Параметри розробника\\\" - \\\"Налагодження через Wi-Fi\\\". Натисніть на \\\"Підключати пристрій за допомогою коду підключення\\\", ви побачите шестизначний код.</string>\n    <string name=\"terminal_export_files\">Експортувати файли</string>\n    <string name=\"starter\">Запуск</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Користувачам MIUI, иожливо, доведеться змінити стіль сповіщень на \\\"Android\\\" із \\\"Сповіщення\\\" - \\\"Панель сповіщень\\\" в системних налаштуваннях.</string>\n    <string name=\"settings_title\">Налаштування</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">В іншому випадку, ви, можливо, не зможете увести код парування з повідомлення.</string>\n    <string name=\"home_terminal_title\">Використовувати Shizuku в програмах терміналу</string>\n    <string name=\"home_terminal_description\">Виконуйте команди через Shizuku у програмах терміналу, які вам подобаються</string>\n    <string name=\"terminal_tutorial_2\">Тоді, використайте будь-який текстовий редактор та редагуйте %1$s.</string>\n    <string name=\"terminal_tutorial_3\">Нарешті, перемістіть файли туди, де програма терміналу матиме доступ до них, ви зможете використовувати %1$s для запуску команд через Shizuku.</string>\n    <string name=\"settings_translation\">Беріть участь у перекладі</string>\n    <string name=\"settings_translation_summary\">Допоможіть нам перекласти %s на вашу мову</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Парування успішне</string>\n    <string name=\"terminal_tutorial_1_description\">Файли з такою ж назвою у вибраній папці буде видалено.\n\\n\n\\nФункція експорту використовує SAF (Storage Access Framework). Були скарги на те, що MIUI ламає функції SAF. Якщо ви користуєтесь MIUI, вам потрібно розпакувати файл з apk-файлу Shizuku або завантажити його з GitHub.</string>\n    <string name=\"notification_adb_pairing_retry\">Спробувати ще раз</string>\n    <string name=\"notification_adb_pairing_failed_title\">Парування невдале</string>\n    <string name=\"action_stop\">Зупинити Shizuku</string>\n    <string name=\"dialog_stop_message\">Сервіс Shizuku буде зупинено.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku потрібен доступ до локальної мережі. Це контролюється дозволом мережі.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Деякі системи (наприклад, MIUI) забороняють програмам доступ до мережі коли їх не видно, навіть якщо програма використовує фоновий сервіс за замовчуванням. Будь ласка, вимкніть оптимізацію батареї для Shizuku на таких системах.</string>\n    <string name=\"settings_start_on_boot_summary\">Для рутованих пристроїв, Shizuku має можливість автоматично запускатися при завантаженні системи</string>\n    <string name=\"home_wireless_adb_description_pre_11\">До Android 11, потрібно під\\'єднатися до комп\\'ютеру щоб ввімкнути налагодження через Wi-FI.</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Поверніться до Shizuku та запустіть Shizuku.</string>\n    <string name=\"home_root_description\">В додаток, Shizuku можна автоматично запустити при завантаженні. Якщо цього не трапляється, будь ласка, перевірте чи ваша не обмежили Shizuku система чи сторонні інструменти.&lt;br&gt;Ви можете переглянути більше на %s.</string>\n    <string name=\"home_root_description_sui\">Якщо ви користуєтесь Magisk, ви можете спробувати %1$s. Для користувачів root, він колись замінить Shizuku. Увага, існуючі програми мають трохи змінитися щоб можна було користуватися %2$s.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s не підтримує сучасну версію Shizuku</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s просить стару версію Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; має підтримку нової версії Shizuku, але просить стару версію Shizuku. Це може трапитися тому, що Shizuku не запущено, будь ласка, перевірте у програмі Shizuku.&lt;p&gt;Підтримка старої версії Shizuku завершилася у березні 2019 року.</string>\n    <string name=\"settings_use_system_color\">Використовувати системний колір</string>\n    <string name=\"notification_channel_adb_pairing\">Парування для налагодження по Wi-Fi</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Уведіть код парування</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Пошук пристрою для парування</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Сервіс парування знайдено</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Зупинити пошук</string>\n    <string name=\"notification_adb_pairing_working_title\">Виконується створення пари</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Тепер ви можете запустити сервіс Shizuku.</string>\n    <string name=\"permission_description\">Дозволити програмі використовувати Shizuku.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Зверніть увагу, на ліву частину \\\"Налагодження по Wi-Fi\\\" можна натиснути, при натисканні відкриється нова сторіна. Лише вмикати перемикач справа неправильно.</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"one\">Авторизовано %d програму</item>\n        <item quantity=\"few\">Авторизовано %d програми</item>\n        <item quantity=\"many\">Авторизовано %d програм</item>\n        <item quantity=\"other\">Авторизовано %d програм</item>\n    </plurals>\n    <string name=\"terminal_tutorial_1\">Спочатку, експортуйте файли де вам потрібно. Ви побачите два файли, %1$s та %2$s.</string>\n    <string name=\"terminal_tutorial_2_description\">Наприклад, якщо ви хочете використати Shizuku в %1$s, вам потрібно замінити %2$s на %3$s (%4$s це назва пакету %1$s).</string>\n    <string name=\"terminal_tutorial_3_description\">Деякі поради: надайте %1$s дозвіл на виконання та додайте його в %2$s, ви зможете використовувати %1$s відразу.</string>\n    <string name=\"rish_description\">З %1$s, в будь-якій програмі терміналу, ви зможете під\\'\\'єднатися та взаємодіяти з Shizuku. &lt;p&gt;Ви можете дізнатися більше про використання %1$s, натисніть тут щоб перегляньте документацію.</string>\n    <string name=\"settings_translation_contributors\">Співробітники перекладу</string>\n    <string name=\"settings_start_on_boot\">Запуск при завантаженні системи (root)</string>\n    <string name=\"dialog_legacy_not_support_message\">Підтримка старої версії Shizuku завершилася у березні 2019 року. Також, стара версія Shizuku не працює на нових версіях Android.&lt;p&gt;Будь ласка, попросіть оновитися у розробника &lt;b&gt;%1$s&lt;/b&gt;.</string>\n    <string name=\"home_app_management_empty\">Додатки, що запросили або декларували використання Shizuku будуть відображені тут.</string>\n    <string name=\"home_adb_is_limited_description\">Виробник вашого пристрою обмежив права ADB, додатки що використовую Shizuku будуть працювати некорректно.\n\\n\n\\nЗазвичай ці обмеження можна зняти змінивши налаштування в параметрах розробника. Будь ласка, прочитайте як це зробити в розділі \\\"Допомога\\\".\n\\n\n\\nМожливо потрібно буде перезапустити Shizuku.</string>\n    <string name=\"home_adb_is_limited_title\">Потрібен ще один крок</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Будь ласка, спробуйте вимкнути та увімкнути \\\"Налагодження через Wi-Fi\\\", якщо пошук продовжується.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-ur/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "manager/src/main/res/values-v21/themes_override.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"PrivateResource,UnusedResources\">\n\n    <!-- Add android:colorControlNormal -->\n    <style name=\"Base.ThemeOverlay.AppCompat.ActionBar\" tools:override=\"true\">\n        <item name=\"android:colorControlNormal\">?android:attr/textColorPrimary</item>\n        <item name=\"colorControlNormal\">?android:attr/textColorPrimary</item>\n        <item name=\"searchViewStyle\">@style/Widget.AppCompat.SearchView.ActionBar</item>\n    </style>\n\n    <style name=\"Base.ThemeOverlay.AppCompat.Dark.ActionBar\" tools:override=\"true\">\n        <item name=\"android:colorControlNormal\">?android:attr/textColorPrimary</item>\n        <item name=\"colorControlNormal\">?android:attr/textColorPrimary</item>\n        <item name=\"searchViewStyle\">@style/Widget.AppCompat.SearchView.ActionBar</item>\n    </style>\n\n    <style name=\"Widget.MaterialComponents.CompoundButton.CheckBox\" parent=\"Widget.AppCompat.CompoundButton.CheckBox\" tools:override=\"true\">\n        <item name=\"enforceMaterialTheme\">true</item>\n        <item name=\"useMaterialThemeColors\">true</item>\n    </style>\n\n    <style name=\"Widget.MaterialComponents.CompoundButton.RadioButton\" parent=\"Widget.AppCompat.CompoundButton.RadioButton\" tools:override=\"true\">\n        <item name=\"enforceMaterialTheme\">true</item>\n        <item name=\"useMaterialThemeColors\">true</item>\n    </style>\n\n    <!--<style name=\"PreferenceSummaryTextStyle\" tools:override=\"true\">\n        <item name=\"android:fontFamily\">sans-serif</item>\n        <item name=\"android:textStyle\">normal</item>\n        <item name=\"android:textAllCaps\">false</item>\n        <item name=\"android:textSize\">14sp</item>\n        <item name=\"android:letterSpacing\">0.0178571429</item>\n    </style>\n\n    <style name=\"PreferenceCategoryTitleTextStyle\" tools:override=\"true\">\n        <item name=\"android:fontFamily\">sans-serif-medium</item>\n        <item name=\"android:textAllCaps\">true</item>\n        <item name=\"android:textSize\">11sp</item>\n        &lt;!&ndash; 0.8 Spacing, 0.8/11 = 0.072727273 &ndash;&gt;\n        <item name=\"android:letterSpacing\">0.072727273</item>\n    </style>-->\n\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-v31/themes_overlay.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"ThemeOverlay.DynamicColors.Light\" parent=\"ThemeOverlay.Material3.DynamicColors.Light.Rikka\">\n    </style>\n\n    <style name=\"ThemeOverlay.DynamicColors.Dark\" parent=\"ThemeOverlay.Material3.DynamicColors.Dark.Rikka\">\n    </style>\n</resources>\n"
  },
  {
    "path": "manager/src/main/res/values-vi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"home_status_service_is_running\">%1$s đang chạy</string>\n    <string name=\"home_status_service_not_running\">%1$s đang không chạy</string>\n    <string name=\"home_status_service_version\">Phiên bản %2$s, %1$s</string>\n    <string name=\"home_adb_title\">Bắt đầu bằng cách kết nối với máy tính</string>\n    <string name=\"home_adb_button_view_help\">Đọc trợ giúp</string>\n    <string name=\"home_adb_button_view_command\">Xem lệnh</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">Sao chép</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">Gửi</string>\n    <string name=\"home_wireless_adb_title\">Bắt đầu thông qua Gỡ lỗi không dây</string>\n    <string name=\"dialog_adb_discovery\">Tìm kiếm dịch vụ gỡ lỗi không dây</string>\n    <string name=\"dialog_adb_discovery_message\">Vui lòng bật \\\"Gỡ lỗi không dây\\\" trong \\\"Tùy chọn nhà phát triển\\\". \\\"Gỡ lỗi không dây\\\" tự động bị tắt khi mạng thay đổi.\n\\n\n\\nLưu ý, không vô hiệu hóa \\\"Tùy chọn nhà phát triển\\\" hoặc \\\"Gỡ lỗi USB\\\", nếu không Shizuku sẽ bị dừng.</string>\n    <string name=\"dialog_adb_port\">Cổng</string>\n    <string name=\"dialog_adb_invalid_port\">Cổng là một số nguyên nằm trong khoảng từ 1 đến 65535.</string>\n    <string name=\"dialog_adb_pairing_title\">Ghép nối với thiết bị</string>\n    <string name=\"dialog_adb_pairing_discovery\">Đang tìm kiếm dịch vụ ghép nối</string>\n    <string name=\"dialog_adb_pairing_paring_code\">Mã ghép nối</string>\n    <string name=\"adb_pairing\">Ghép nối</string>\n    <string name=\"adb_pairing_requires_multi_window\">Vui lòng vào chế độ chia đôi màn hình (đa cửa sổ) trước.</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">Hệ thống yêu cầu hộp thoại ghép nối luôn hiển thị, sử dụng chế độ chia đôi màn hình là cách duy nhất để cho phép ứng dụng này và hộp thoại hệ thống hiển thị cùng một lúc.</string>\n    <string name=\"home_root_title\">Bắt đầu (cho các thiết bị đã root)</string>\n    <string name=\"home_root_button_start\">Bắt đầu</string>\n    <string name=\"home_root_button_restart\">Khởi động lại</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"other\">Đã ủy quyền %d ứng dụng</item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\">Nhấn để quản lý các ứng dụng được ủy quyền</string>\n    <string name=\"home_root_description_sui\">Nếu bạn đang sử dụng Magisk, bạn có thể thử %1$s. Đối với người dùng root, nó cuối cùng sẽ thay thế Shizuku. Lưu ý, các ứng dụng hiện có cần thay đổi một chút để sử dụng %2$s.</string>\n    <string name=\"adb_error_key_store\">Không thể tạo khóa để gỡ lỗi không dây.\n\\nĐiều này có thể do cơ chế KeyStore của thiết bị này bị hỏng.</string>\n    <string name=\"adb_pair_required\">Vui lòng thực hiện bước ghép nối trước.</string>\n    <string name=\"development_settings\">Tùy chọn nhà phát triển</string>\n    <string name=\"home_app_management_title\">Quản lí ứng dụng</string>\n    <string name=\"home_learn_more_title\">Tìm hiểu Shizuku</string>\n    <string name=\"home_learn_more_description\">Tìm hiểu cách phát triển với Shizuku hoặc tải ứng dụng bằng Shizuku</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">Quyền của adb bị hạn chế</string>\n    <string name=\"app_management_item_summary_requires_root\">* yêu cầu Shizuku chạy với root</string>\n    <string name=\"home_terminal_title\">Sử dụng Shizuku trong các ứng dụng đầu cuối</string>\n    <string name=\"home_terminal_description\">Chạy lệnh thông qua Shizuku trong các ứng dụng đầu cuối bạn thích</string>\n    <string name=\"terminal_tutorial_1\">Đầu tiên, Xuất tệp sang bất kỳ nơi nào bạn muốn. Bạn sẽ tìm thấy hai tệp, %1$s và %2$s.</string>\n    <string name=\"terminal_export_files\">Xuất tệp</string>\n    <string name=\"terminal_tutorial_2\">Sau đó, sử dụng bất kỳ trình soạn thảo văn bản nào để mở và chỉnh sửa %1$s.</string>\n    <string name=\"settings_language\">Ngôn ngữ</string>\n    <string name=\"settings_black_night_theme\">Chủ đề đen</string>\n    <string name=\"settings_black_night_theme_summary\">Sử dụng chủ đề đen tuyền nếu chế độ ban đêm được bật</string>\n    <string name=\"settings_user_interface\">Hiển thị</string>\n    <string name=\"terminal_tutorial_3\">Cuối cùng, di chuyển các tệp đến một nơi nào đó mà ứng dụng đầu cuối của bạn có thể truy cập, bạn sẽ có thể sử dụng %1$s để chạy các lệnh thông qua Shizuku.</string>\n    <string name=\"rish_description\">Với %1$s, trong bất kỳ ứng dụng đầu cuối nào, bạn có thể kết nối và tương tác với shell do Shizuku điều hành. &lt;p&gt;Về cách sử dụng chi tiết %1$s, nhấn để xem tài liệu.</string>\n    <string name=\"settings_title\">Cài đặt</string>\n    <string name=\"settings_startup\">Khởi động</string>\n    <string name=\"settings_start_on_boot\">Tự khởi động (root)</string>\n    <string name=\"settings_start_on_boot_summary\">Đối với các thiết bị đã root, Shizuku có thể tự khởi động khi thiết bị khởi động</string>\n    <string name=\"notification_channel_service_status\">Trạng thái khởi động dịch vụ</string>\n    <string name=\"notification_service_starting\">Dịch vụ Shizuku đang khởi động…</string>\n    <string name=\"notification_service_start_failed\">Khởi động dịch vụ Shizuku thất bại.</string>\n    <string name=\"notification_service_start_no_root\">Yêu cầu quyền root thất bại.</string>\n    <string name=\"starter\">Trình khởi động</string>\n    <string name=\"start_with_root_failed\">Không thể bắt đầu dịch vụ vì quyền root chưa được cấp hoặc thiết bị này chưa được root.</string>\n    <string name=\"dialog_cannot_open_browser_title\">Không thể khởi động trình duyệt</string>\n    <string name=\"settings_translation_summary\">Giúp chúng tôi dịch %s sang ngôn ngữ của bạn</string>\n    <string name=\"settings_translation\">Tham gia phiên dịch</string>\n    <string name=\"settings_translation_contributors\">Người đóng góp bản dịch</string>\n    <string name=\"action_about\">Giới thiệu</string>\n    <string name=\"dialog_stop_message\">Dịch vụ Shizuku sẽ ngừng hoạt động.</string>\n    <string name=\"about_view_source_code\">Xem mã nguồn tại %s</string>\n    <string name=\"action_stop\">Dừng Shizuku</string>\n    <string name=\"notification_working\">Đang làm việc…</string>\n    <string name=\"permission_label\">truy cập Shizuku</string>\n    <string name=\"permission_description\">Cho phép ứng dụng sử dụng Shizuku.</string>\n    <string name=\"permission_warning_template\">Cho phép <b>%1$s</b> thành %2$s\\?</string>\n    <string name=\"grant_dialog_button_allow_always\">Cho phép mọi lúc</string>\n    <string name=\"grant_dialog_button_deny\">Từ chối</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\nđã được sao chép vào khay nhớ tạm.</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> đã được sao chép vào khay nhớ tạm.</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s không hỗ trợ Shizuku hiện đại</string>\n    <string name=\"dialog_legacy_not_support_message\">Shizuku cũ không được dùng nữa kể từ tháng 3 năm 2019. Ngoài ra, Shizuku cũ không hoạt động trên các hệ thống Android mới hơn.&lt;p&gt;Vui lòng yêu cầu nhà phát triển của &lt;b&gt;%1$s&lt;/b&gt; cập nhật.</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s đang yêu cầu Shizuku cũ</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; có hỗ trợ Shizuku hiện đại, nhưng nó yêu cầu Shizuku cũ. Điều này có thể do Shizuku đang không chạy, vui lòng kiểm tra ứng dụng Shizuku.&lt;p&gt;Shizuku cũ không được dùng nữa kể từ tháng 3 năm 2019.</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">Mở Shizuku</string>\n    <string name=\"translation_contributors\">The Primal Pea, ngatngay</string>\n    <string name=\"home_status_service_version_update\">Phiên bản %2$s, %1$s&lt;br&gt;Bắt đầu lại để cập nhật lên phiên bản %3$s</string>\n    <string name=\"home_adb_description\">Đối với thiết bị không có root, bạn cần sử dụng adb để khởi động Shizuku (yêu cầu kết nối máy tính). Quá trình này cần được lặp lại mỗi khi thiết bị được khởi động lại. Vui lòng <b><a href=\"%1$s\">đọc phần trợ giúp</a></b>.</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* Có một số cân nhắc khác, vui lòng xác nhận rằng bạn đã đọc phần trợ giúp trước.</string>\n    <string name=\"paring_code_is_wrong\">Mã ghép nối sai.</string>\n    <string name=\"cannot_connect_port\">Không thể kết nối với dịch vụ gỡ lỗi không dây.</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">Gỡ lỗi không dây không được kích hoạt.\n\\nLưu ý, trước Android 11, để kích hoạt tính năng gỡ lỗi không dây, kết nối máy tính là điều bắt buộc.</string>\n    <string name=\"dialog_adb_pairing_message\">Vui lòng bắt đầu ghép nối theo các bước sau: \\\"Tùy chọn nhà phát triển\\\" - \\\"Gỡ lỗi không dây\\\" - \\\"Ghép nối thiết bị bằng mã ghép nối\\\".\n\\n\n\\nSau khi quá trình ghép nối bắt đầu, bạn sẽ có thể nhập mã ghép nối.</string>\n    <string name=\"home_root_description\">Ngoài ra, Shizuku có thể được khởi động tự động khi khởi động. Nếu không, vui lòng kiểm tra xem hệ thống của bạn hoặc các công cụ của bên thứ ba có hạn chế Shizuku hay không.&lt;br&gt;Bạn có thể tham khảo %s.</string>\n    <string name=\"terminal_tutorial_1_description\">Nếu có các tệp trùng tên trong thư mục đã chọn, chúng sẽ bị xóa.\n\\n\n\\nChức năng xuất sử dụng SAF (Khung Truy cập Bộ nhớ). Có báo cáo rằng MIUI phá vỡ các chức năng của SAF. Nếu bạn đang sử dụng MIUI, bạn có thể phải giải nén tệp từ apk của Shizuku hoặc tải xuống từ GitHub.</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">Rất có thể nhà sản xuất thiết bị của bạn giới hạn quyền của adb.&lt;p&gt;Có thể có giải pháp cho hệ thống của bạn trong &lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;tài liệu này&lt;/a&gt;&lt;/b&gt;.</string>\n    <string name=\"terminal_tutorial_2_description\">Ví dụ, nếu bạn muốn sử dụng Shizuku trong %1$s, bạn nên thay thế %2$s bằng %3$s (%4$s là tên gói của %1$s).</string>\n    <string name=\"terminal_tutorial_3_description\">Một số mẹo: cấp quyền thực thi cho %1$s và thêm quyền đó vào %2$s, bạn sẽ có thể sử dụng %1$s trực tiếp.</string>\n    <string name=\"home_wireless_adb_description_pre_11\">Trước Android 11, kết nối với máy tính là yêu cầu bắt buộc để bật Gỡ lỗi không dây.</string>\n    <string name=\"notification_adb_pairing_stop_searching\">Dừng tìm kiếm</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">Người dùng MIUI có thể cần chuyển kiểu thông báo sang \\\"Android\\\" từ \\\"Thông báo\\\" - \\\"Bóng thông báo\\\" trong cài đặt hệ thống.</string>\n    <string name=\"notification_adb_pairing_succeed_text\">Bạn có thể khởi động dịch vụ Shizuku ngay bây giờ.</string>\n    <string name=\"notification_adb_pairing_failed_title\">Ghép nối thất bại</string>\n    <string name=\"notification_adb_pairing_retry\">Thử lại</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">Nhập mã vào thông báo để hoàn tất quá trình ghép nối.</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">Một thông báo từ Shizuku sẽ giúp bạn hoàn thành việc ghép nối.</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">Nhập \\\"Tùy chọn nhà phát triển\\\" - \\\"Gỡ lỗi qua Wi-Fi\\\". Nhấn vào \\\"Ghép nối thiết bị bằng mã ghép nối\\\", bạn sẽ thấy một mã gồm sáu chữ số.</string>\n    <string name=\"adb_pairing_tutorial_title\">Ghép nối Shizuku với thiết bị của bạn</string>\n    <string name=\"notification_settings\">Tùy chọn thông báo</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">Quá trình ghép nối cần bạn tương tác với thông báo từ Shizuku. Vui lòng cho phép Shizuku đăng thông báo.</string>\n    <string name=\"notification_channel_adb_pairing\">Ghép nối gỡ lỗi qua Wi-Fi</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">Nhập mã ghép nối</string>\n    <string name=\"home_wireless_adb_view_guide_button\">Hướng dẫn từng bước</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">Quay lại với Shizuku và khởi động Shizuku.</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">Đang tìm kiếm dịch vụ ghép nối</string>\n    <string name=\"notification_adb_pairing_service_found_title\">Đã tìm thấy dịch vụ ghép nối</string>\n    <string name=\"notification_adb_pairing_working_title\">Đang trong quá trình ghép nối</string>\n    <string name=\"notification_adb_pairing_succeed_title\">Ghép nối thành công</string>\n    <string name=\"home_wireless_adb_description\">Trên Android 11 trở lên, bạn có thể bật tính năng Gỡ lỗi không dây và khởi động Shizuku trực tiếp từ thiết bị của mình mà không cần kết nối với máy tính.&lt;p&gt;Vui lòng xem hướng dẫn từng bước trước.</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">Nếu không, bạn có thể không nhập được mã ghép nối từ thông báo.</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">Xin lưu ý, phần bên trái của tùy chọn \\\"Gỡ lỗi không dây\\\" có thể nhấn được, nhấn vào nó sẽ mở ra một trang mới. Chỉ điều chỉnh công tắc ở bên phải là không chính xác.</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku cần truy cập mạng cục bộ. Nó được kiểm soát bởi sự cho phép của mạng.</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">Một số hệ thống (chẳng hạn như MIUI) không cho phép ứng dụng truy cập mạng khi chúng không hiển thị, ngay cả khi ứng dụng sử dụng dịch vụ nền trước làm tiêu chuẩn. Vui lòng tắt các tính năng tối ưu hóa pin cho Shizuku trên các hệ thống như vậy.</string>\n    <string name=\"settings_use_system_color\">Sử dụng màu chủ đề hệ thống</string>\n    <string name=\"home_app_management_empty\">Các ứng dụng đã yêu cầu hoặc khai báo Shizuku sẽ hiển thị ở đây.</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">Vui lòng thử tắt và bật \\\"Gỡ lỗi không dây\\\" nếu nó tiếp tục tìm kiếm.</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"permission_label\">使用 Shizuku</string>\n    <string name=\"permission_description\">允许应用使用 Shizuku。</string>\n    <string name=\"home_status_service_is_running\">%1$s 正在运行</string>\n    <string name=\"home_status_service_version\">版本 %2$s，%1$s</string>\n    <string name=\"home_status_service_version_update\"><![CDATA[版本 %2$s，%1$s<br>再次启动来升级到版本 %3$s]]></string>\n    <string name=\"home_status_service_not_running\">%1$s未运行</string>\n    <string name=\"home_root_button_start\">启动</string>\n    <string name=\"home_root_button_restart\">重新启动</string>\n    <string name=\"home_root_title\"><![CDATA[启动（针对已 root 设备）]]></string>\n    <string name=\"home_adb_title\"><![CDATA[通过连接电脑启动（使用 adb）]]></string>\n    <string name=\"home_adb_description\"><![CDATA[对于没有 root 的设备需要借助 adb 来启动 Shizuku（需要连接电脑）。这个过程每次设备重新启动后需要重新进行。请<b><a href=\\\"%1$s\\\">阅读帮助</a></b>。]]></string>\n    <string name=\"home_root_description\"><![CDATA[另外，Shizuku 可以在开机时自动启动。如果没有，请检查您的系统或是第三方工具是否限制了 Shizuku。<br>你可以参考 %s。]]></string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">复制</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">发送</string>\n    <string name=\"home_adb_button_view_command\">查看指令</string>\n    <string name=\"home_adb_dialog_view_command_message\"><![CDATA[<font face=\"monospace\">%1$s</font><br><br>* 还有一些其他注意事项，请确认你已阅读帮助。]]></string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s 不支持现代 Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\"><![CDATA[旧式 Shizuku 已于 2019 年 3 月被弃用。此外，旧式 Shizuku 无法在较新版本的 Android 系统上工作。<p>请要求 <b>%1$s</b> 的开发者进行更新。]]></string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s 正在请求旧式 Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\"><![CDATA[<b>%1$s</b> 支持现代 Shizuku，但它正在请求旧式 Shizuku。这可能是因为 Shizuku 没有运行，请在 Shizuku 应用内检查。<p>旧式 Shizuku 已于 2019 年 3 月被弃用。]]></string>\n    <string name=\"home_app_management_title\">应用管理</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"other\"><![CDATA[已授权 %d 个应用]]></item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\">点按以管理授权的应用</string>\n    <string name=\"toast_copied_to_clipboard\">%s\\n已被复制到剪贴板。</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">打开 Shizuku</string>\n    <string name=\"action_about\">关于</string>\n    <string name=\"about_view_source_code\"><![CDATA[在 %s 查看源码]]></string>\n    <string name=\"settings_title\">设置</string>\n    <string name=\"start_with_root_failed\">未授予 root 权限或是该设备没有 root，因此无法启动服务。</string>\n    <string name=\"notification_channel_service_status\">服务启动状态</string>\n    <string name=\"notification_service_starting\">Shizuku 服务正在启动…</string>\n    <string name=\"notification_service_start_failed\">启动 Shizuku 服务失败。</string>\n    <string name=\"notification_service_start_no_root\">请求 root 权限失败。</string>\n    <string name=\"notification_working\">工作中…</string>\n    <string name=\"settings_language\">语言</string>\n    <string name=\"settings_user_interface\">界面外观</string>\n    <string name=\"settings_black_night_theme\">黑色夜间主题</string>\n    <string name=\"settings_black_night_theme_summary\">当夜间模式启用时使用纯黑色主题</string>\n    <string name=\"settings_startup\">启动</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">adb 权限受限</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">这极有可能是你的设备制造商限制了 adb 的权限。&lt;p&gt;&lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;此文档&lt;/a&gt;&lt;/b&gt;中可能有针对你的系统的解决方案。</string>\n    <string name=\"home_adb_button_view_help\">阅读帮助</string>\n    <string name=\"dialog_cannot_open_browser_title\">无法启动浏览器</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><![CDATA[<b>%s</b> 已被复制到剪贴板。]]></string>\n    <string name=\"home_learn_more_title\">了解 Shizuku</string>\n    <string name=\"home_learn_more_description\">了解如何使用 Shizuku 开发</string>\n    <string name=\"app_management_item_summary_requires_root\">* 需要以 root 执行的 Shizuku</string>\n    <string name=\"settings_translation_contributors\">翻译贡献者</string>\n    <string name=\"translation_contributors\"/>\n    <string name=\"settings_translation\">参与翻译</string>\n    <string name=\"settings_translation_summary\">帮助我们将 %s 翻译至您的语言</string>\n    <string name=\"dialog_adb_port\">端口号</string>\n    <string name=\"adb_pairing\">配对</string>\n    <string name=\"dialog_adb_pairing_title\">与设备配对</string>\n    <string name=\"dialog_adb_pairing_paring_code\">配对码</string>\n    <string name=\"starter\">启动程序</string>\n    <string name=\"dialog_adb_invalid_port\">端口号是一个 1 至 65535 的整数。</string>\n    <string name=\"home_wireless_adb_title\"><![CDATA[通过无线调试启动]]></string>\n    <string name=\"home_wireless_adb_description\"><![CDATA[在 Android 11 或更高版本上，您可以直接从您的设备启用无线调试并启动 Shizuku，无需连接到计算机。<p>请先查看分步骤指南。]]></string>\n    <string name=\"action_stop\">停止 Shizuku</string>\n    <string name=\"dialog_stop_message\">Shizuku 服务将被停止。</string>\n    <string name=\"paring_code_is_wrong\">配对码错误。</string>\n    <string name=\"cannot_connect_port\">无法连接至无线调试服务。</string>\n    <string name=\"adb_pairing_requires_multi_window\">请先进入分屏（多窗口）模式。</string>\n    <string name=\"adb_error_key_store\">无法为无线调试生成密钥。\\n这可能是因为此设备上的 KeyStore 机制已损坏。</string>\n    <string name=\"adb_pair_required\">请先进行配对步骤。</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">系统要求配对对话框始终可见，使用分屏模式是使此应用和系统对话框同时可见的唯一方法。</string>\n    <string name=\"dialog_adb_discovery\">正在搜索无线调试服务</string>\n    <string name=\"dialog_adb_discovery_message\">请在“开发者选项”中启用“无线调试”功能。当网络变化时“无线调试”会被自动禁用。\n\\n\n\\n注意：请不要禁用“开发者选项”或“USB 调试”，否则 Shizuku 会被停止。</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">如果一直搜索，请尝试禁用并启用“无线调试”。</string>\n    <string name=\"dialog_adb_pairing_discovery\">正在搜索配对服务</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">无线调试未启用。\n\\n请注意，在 Android 11 之前，要启用无线调试必须连接电脑。</string>\n    <string name=\"dialog_adb_pairing_message\">请跟随下面的步骤开始配对：“开发者选项” - “无线调试” - “使用配对码配对设备”。\n\\n\n\\n配对过程开始后，您将能够输入配对码。</string>\n    <string name=\"development_settings\">开发者选项</string>\n    <string name=\"home_root_description_sui\"><![CDATA[如果您正在使用 Magisk，可以尝试 %1$s。对于 root 用户，它将最终取代 Shizuku。注意，已有的应用需要一点点修改来使用 %2$s。]]></string>\n    <string name=\"settings_start_on_boot_summary\">对于已 root 设备，Shizuku 可以开机启动</string>\n    <string name=\"settings_start_on_boot\">开机启动（root）</string>\n    <string name=\"permission_warning_template\"><![CDATA[要允许<b>%1$s</b>%2$s吗？]]></string>\n    <string name=\"grant_dialog_button_allow_always\">始终允许</string>\n    <string name=\"grant_dialog_button_deny\">拒绝</string>\n    <string name=\"home_terminal_title\">在终端应用中使用 Shizuku</string>\n    <string name=\"home_terminal_description\">在您喜欢的终端应用中通过 Shizuku 运行命令</string>\n    <string name=\"terminal_tutorial_1\">首先，将文件导出到任何您想要的位置。您将找到两个文件，%1$s 和 %2$s。</string>\n    <string name=\"terminal_tutorial_1_description\">若选择的文件夹中已有同名文件，它们会被删除。\\n\\n导出功能使用 SAF（Storage Access Framework）。有报告称 MIUI 破坏了 SAF 的功能，如果您使用 MIUI，您可能需要从 Shizuku 的 apk 中提取文件，或是从 GitHub 下载文件。</string>\n    <string name=\"terminal_export_files\">导出文件</string>\n    <string name=\"terminal_tutorial_2\">然后，使用任意文本编辑器打开并编辑 %1$s。</string>\n    <string name=\"terminal_tutorial_2_description\">例如，如果要在 %1$s 中使用 Shizuku，则应将 %2$s 替换为 %3$s（%4$s 是 %1$s 的软件包名称）。</string>\n    <string name=\"terminal_tutorial_3\">最后，将文件移动到终端应用可以访问的位置，您便可使用 %1$s 来通过 Shizuku 运行命令。</string>\n    <string name=\"terminal_tutorial_3_description\">一些技巧：将执行权限授予 %1$s 并将其添加到 %2$s，您将可以直接使用 %1$s。</string>\n    <string name=\"rish_description\"><![CDATA[\n通过 %1$s，您可以在任何终端应用中连接到由 Shizuku 运行的 shell 并与之交互。\n<p>有关 %1$s 的具体使用方式，点按以阅读文档。\n]]></string>\n    <string name=\"adb_pairing_tutorial_title\">将 Shizuku 与您的设备配对</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">进入“开发者选项”-“无线调试”。点按“使用配对码配对设备”，您将看到一个六位数字代码。</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">在通知中输入代码来完成配对。</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">返回到 Shizuku 并启动 Shizuku。</string>\n    <string name=\"notification_channel_adb_pairing\">无线调试配对</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">输入配对码</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">正在搜索配对服务</string>\n    <string name=\"notification_adb_pairing_service_found_title\">已找到配对服务</string>\n    <string name=\"notification_adb_pairing_stop_searching\">停止搜索</string>\n    <string name=\"notification_adb_pairing_working_title\">正在进行配对</string>\n    <string name=\"notification_adb_pairing_succeed_title\">配对成功</string>\n    <string name=\"notification_adb_pairing_succeed_text\">您现在可以启动 Shizuku 服务了。</string>\n    <string name=\"notification_adb_pairing_failed_title\">配对失败</string>\n    <string name=\"notification_adb_pairing_retry\">重试</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">配对过程需要您与 Shizuku 的通知交互。请允许 Shizuku 发布通知。</string>\n    <string name=\"notification_settings\">通知设置</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">MIUI 用户可能需要在系统设置中从“通知管理”-“通知显示设置”将通知样式切换为“原生样式”。</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">否则，您可能会无法从通知输入配对码。</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">一条来自 Shizuku 的通知将帮助您完成配对。</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">请注意，“无线调试”选项的左侧是可点击的，点按它将打开一个新的页面。仅打开右侧的开关是错误的。</string>\n    <string name=\"home_wireless_adb_description_pre_11\"><![CDATA[在 Android 11 之前，需要连接到计算机才能启用无线调试。]]></string>\n    <string name=\"home_wireless_adb_view_guide_button\">分步骤指南</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku 需要访问本地网络。它由网络权限控制。</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">某些系统（例如 MIUI）不允许应用在不可见时访问网络，即使应用已按标准使用前台服务。请在此类系统上为 Shizuku 禁用电池优化功能。</string>\n    <string name=\"settings_use_system_color\">使用系统主题颜色</string>\n    <string name=\"home_app_management_empty\">已请求或声明 Shizuku 的应用程序将显示在此处。</string>\n    <string name=\"home_adb_is_limited_title\">您需要进行额外的步骤</string>\n    <string name=\"home_adb_is_limited_description\">您的设备制造商限制了 adb 的权限，使用 Shizuku 的应用无法正常工作。\\n\\n通常，在“开发者选项”中调整一些选项即可解除此限制。请阅读帮助来了解具体的操作方式。\\n\\n您可能需要重新启动 Shizuku 以使操作生效。</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"permission_label\">使用 Shizuku</string>\n    <string name=\"permission_description\">允許應用程式使用 Shizuku。</string>\n    <string name=\"home_status_service_is_running\">%1$s 正在執行</string>\n    <string name=\"home_status_service_version\">版本 %2$s，%1$s</string>\n    <string name=\"home_status_service_version_update\">版本 %2$s，%1$s&lt;br&gt;再次啟動來升級到版本 %3$s</string>\n    <string name=\"home_status_service_not_running\">%1$s 未在執行</string>\n    <string name=\"home_root_button_start\">啟動</string>\n    <string name=\"home_root_button_restart\">重新啟動</string>\n    <string name=\"home_root_title\">啟動 (針對已 Root 裝置)</string>\n    <string name=\"home_adb_title\">透過與電腦連線來啟動 (使用 ADB)</string>\n    <string name=\"home_adb_description\">沒有 Root 的裝置需藉助 ADB 來啟動 Shizuku (須與電腦連線)。在裝置每次重新啟動後，這項作業皆須重新進行。請<b><a href=\"%1$s\">閱讀說明</a></b>。</string>\n    <string name=\"home_root_description\">另外，Shizuku 可以在開機時自動啟動。如果沒有啟動，請檢查 Shizuku 是否被您的系統或是第三方工具限制。&lt;br&gt;你可以參考 %s。</string>\n    <string name=\"home_adb_dialog_view_command_copy_button\">複製</string>\n    <string name=\"home_adb_dialog_view_command_button_send\">傳送</string>\n    <string name=\"home_adb_button_view_command\">檢視命令</string>\n    <string name=\"home_adb_dialog_view_command_message\">&lt;font face=monospace&gt;%1$s&lt;/font&gt;&lt;br&gt;&lt;br&gt;* 還有一些其他注意事項，請確認你已閱讀說明。</string>\n    <string name=\"dialog_legacy_not_support_title\">%1$s 不支援現代 Shizuku</string>\n    <string name=\"dialog_legacy_not_support_message\">舊式 Shizuku 已於 2019 年 3 月被棄用。此外，舊式 Shizuku 無法在較新版本的 Android 系統上工作。&lt;p&gt;請要求 &lt;b&gt;%1$s&lt;/b&gt; 的開發人員進行更新。</string>\n    <string name=\"dialog_requesting_legacy_title\">%1$s 正在要求舊版 Shizuku</string>\n    <string name=\"dialog_requesting_legacy_message\">&lt;b&gt;%1$s&lt;/b&gt; 支援現代 Shizuku，但它正在要求舊版 Shizuku。這可能是因為 Shizuku 未在執行，請在 Shizuku 應用程式內檢查。&lt;p&gt;舊版 Shizuku 已於 2019 年 3 月被棄用。</string>\n    <string name=\"home_app_management_title\">應用程式管理</string>\n    <plurals name=\"home_app_management_authorized_apps_count\">\n        <item quantity=\"other\">已授權 %d 個應用程式</item>\n    </plurals>\n    <string name=\"home_app_management_view_authorized_apps\">輕觸以管理已授權的應用程式</string>\n    <string name=\"toast_copied_to_clipboard\">%s\n\\n已複製到剪貼簿。</string>\n    <string name=\"dialog_requesting_legacy_button_open_shizuku\">開啟 Shizuku</string>\n    <string name=\"action_about\">關於</string>\n    <string name=\"about_view_source_code\">在 %s 檢視原始碼</string>\n    <string name=\"settings_title\">設定</string>\n    <string name=\"start_with_root_failed\">未授予 Root 權限或是此裝置沒有 Root，因此無法啟動服務。</string>\n    <string name=\"notification_channel_service_status\">服務啟動狀態</string>\n    <string name=\"notification_service_starting\">Shizuku 服務正在啟動…</string>\n    <string name=\"notification_service_start_failed\">啟動 Shizuku 服務時失敗。</string>\n    <string name=\"notification_service_start_no_root\">無法要求 Root 權限。</string>\n    <string name=\"notification_working\">正在處理…</string>\n    <string name=\"settings_language\">語言</string>\n    <string name=\"settings_user_interface\">外觀</string>\n    <string name=\"settings_black_night_theme\">黑色夜間主題</string>\n    <string name=\"settings_black_night_theme_summary\">夜間模式啟用時使用純黑色主題</string>\n    <string name=\"settings_startup\">啟動</string>\n    <string name=\"app_management_dialog_adb_is_limited_title\">ADB 權限受限</string>\n    <string name=\"app_management_dialog_adb_is_limited_message\">這極有可能是你的裝置製造商限制了 ADB 的權限。&lt;p&gt;&lt;b&gt;&lt;a href=\\\"%1$s\\\"&gt;此文件&lt;/a&gt;&lt;/b&gt;中可能有針對你的系統的解決方案。</string>\n    <string name=\"home_adb_button_view_help\">閱讀說明</string>\n    <string name=\"dialog_cannot_open_browser_title\">無法啟動瀏覽器</string>\n    <string name=\"toast_copied_to_clipboard_with_text\"><b>%s</b> 已複製到剪貼簿。</string>\n    <string name=\"home_learn_more_title\">瞭解 Shizuku</string>\n    <string name=\"home_learn_more_description\">瞭解如何使用 Shizuku 開發</string>\n    <string name=\"app_management_item_summary_requires_root\">* 需要以 Root 執行的 Shizuku</string>\n    <string name=\"settings_translation_contributors\">翻譯貢獻者</string>\n    <string name=\"translation_contributors\"/>\n    <string name=\"settings_translation\">參與翻譯</string>\n    <string name=\"settings_translation_summary\">協助我們將 %s 翻譯至您的語言</string>\n    <string name=\"dialog_stop_message\">Shizuku 服務將被停止。</string>\n    <string name=\"dialog_adb_port\">通訊埠</string>\n    <string name=\"dialog_adb_invalid_port\">通訊埠是一個 1 至 65535 的整數。</string>\n    <string name=\"dialog_adb_pairing_paring_code\">配對碼</string>\n    <string name=\"home_wireless_adb_title\">透過無線偵錯啟動</string>\n    <string name=\"home_wireless_adb_description\">在 Android 11 或更高版本上，您可以直接從您的裝置啟用無線偵錯並啟動 Shizuku，無須與電腦連線。&lt;p&gt;請先檢視分步驟指南。</string>\n    <string name=\"dialog_adb_pairing_title\">與裝置配對</string>\n    <string name=\"paring_code_is_wrong\">配對碼錯誤。</string>\n    <string name=\"cannot_connect_port\">無法連線至無線偵錯服務。</string>\n    <string name=\"adb_pairing_requires_multi_window\">請先進入「分割畫面」(多視窗) 模式。</string>\n    <string name=\"adb_error_key_store\">無法為無線偵錯產生金鑰。\n\\n這可能是因為此裝置上的 KeyStore 機制已損壞。</string>\n    <string name=\"adb_pair_required\">請先進行配對步驟。</string>\n    <string name=\"action_stop\">停止 Shizuku</string>\n    <string name=\"adb_pairing\">配對</string>\n    <string name=\"starter\">啟動器</string>\n    <string name=\"dialog_adb_discovery\">正在尋找無線偵錯服務</string>\n    <string name=\"dialog_adb_pairing_discovery\">正在尋找配對服務</string>\n    <string name=\"dialog_adb_discovery_message\">請在「開發人員選項」中啟用「無線偵錯」功能。在切換網路時，「無線偵錯」會自動停用。\n\\n\n\\n注意：請不要停用「開發人員選項」或「USB 偵錯」，否則 Shizuku 會被停止。</string>\n    <string name=\"dialog_adb_discovery_message_toggle_wireless_debugging\">如果一直搜尋，請嘗試停用並啟用「無線偵錯」。</string>\n    <string name=\"dialog_wireless_adb_not_enabled\">無線偵錯未啟用。\n\\n請注意，在 Android 11 之前，要啟用無線偵錯必須先與電腦連線。</string>\n    <string name=\"dialog_adb_pairing_message\">請跟隨下面的步驟開始配對：「開發人員選項」 - 「無線偵錯」- 「使用配對碼配對裝置」。\n\\n\n\\n配對過程開始後，您將能夠輸入配對碼。</string>\n    <string name=\"adb_pairing_requires_multi_window_reason\">系統要求配對對話方塊始終可見，使用「分割畫面」模式是使此應用程式和系統對話方塊同時可見的唯一方法。</string>\n    <string name=\"development_settings\">開發人員選項</string>\n    <string name=\"home_root_description_sui\">如果您正在使用 Magisk，可以嘗試 %1$s。對於 Root 使用者，它將最終取代 Shizuku。注意，已有的應用程式需要一點點修改來使用 %2$s。</string>\n    <string name=\"settings_start_on_boot_summary\">對於已 Root 裝置，Shizuku 可以在開機時自動啟動</string>\n    <string name=\"settings_start_on_boot\">在開機時啟動 (Root)</string>\n    <string name=\"grant_dialog_button_allow_always\">一律允許</string>\n    <string name=\"grant_dialog_button_deny\">拒絕</string>\n    <string name=\"permission_warning_template\">要允許「%1$s」%2$s 嗎？</string>\n    <string name=\"home_terminal_title\">在終端機應用程式中使用 Shizuku</string>\n    <string name=\"home_terminal_description\">在您喜愛的終端機應用程式中透過 Shizuku 執行命令</string>\n    <string name=\"terminal_tutorial_1\">首先，將檔案匯出到任何您想要的位置。您將找到兩個檔案，%1$s 和 %2$s。</string>\n    <string name=\"terminal_tutorial_1_description\">若選擇的資料夾中已有同名檔案，它們會被刪除。\n\\n\n\\n匯出功能使用 SAF (Storage Access Framework)。有報告稱 MIUI 破壞了 SAF 的功能，如果您使用 MIUI，您可能需要從 Shizuku 的 apk 中提取檔案，或是從 GitHub 下載檔案。</string>\n    <string name=\"terminal_export_files\">匯出檔案</string>\n    <string name=\"terminal_tutorial_2\">然後，使用任意文字編輯器開啟並編輯 %1$s。</string>\n    <string name=\"terminal_tutorial_2_description\">例如，如果要在 %1$s 中使用 Shizuku，則應將 %2$s 取代為 %3$s (%4$s 是 %1$s 的套件名稱)。</string>\n    <string name=\"terminal_tutorial_3\">最後，將檔案移至終端機應用程式可以存取的位置，您便可使用 %1$s 來透過 Shizuku 執行命令。</string>\n    <string name=\"terminal_tutorial_3_description\">一些技巧：將執行權限授予 %1$s 並將其新增到 %2$s，您就能直接使用 %1$s。</string>\n    <string name=\"rish_description\">透過 %1$s，您可以在任何終端機應用程式中連線到由 Shizuku 執行的 shell 並與之互動。 &lt;p&gt;有關 %1$s 的具體使用方式，請輕觸以檢視文件。</string>\n    <string name=\"adb_pairing_tutorial_title\">將 Shizuku 與您的裝置配對</string>\n    <string name=\"adb_pairing_tutorial_content_steps\">進入「開發人員選項」-「無線偵錯」。輕觸「使用配對碼配對裝置」，您將看到一個六位數字代碼。</string>\n    <string name=\"adb_pairing_tutorial_content_enter_pairing_code\">在通知中輸入代碼來完成配對。</string>\n    <string name=\"notification_channel_adb_pairing\">無線偵錯配對</string>\n    <string name=\"notification_adb_pairing_input_paring_code\">輸入配對碼</string>\n    <string name=\"notification_adb_pairing_searching_for_service_title\">正在尋找配對服務</string>\n    <string name=\"notification_adb_pairing_service_found_title\">已找到配對服務</string>\n    <string name=\"notification_adb_pairing_stop_searching\">停止尋找</string>\n    <string name=\"notification_adb_pairing_working_title\">正在進行配對</string>\n    <string name=\"notification_adb_pairing_succeed_title\">配對成功</string>\n    <string name=\"notification_adb_pairing_succeed_text\">您現在可以啟動 Shizuku 服務了。</string>\n    <string name=\"notification_adb_pairing_failed_title\">配對失敗</string>\n    <string name=\"notification_adb_pairing_retry\">重試</string>\n    <string name=\"adb_pairing_tutorial_content_notification_blocked\">配對過程需要您與 Shizuku 的通知互動。請允許 Shizuku 發布通知。</string>\n    <string name=\"notification_settings\">通知設定</string>\n    <string name=\"adb_pairing_tutorial_content_miui\">MIUI 使用者可能需要在系統設定中從「通知管理」-「通知顯示設定」將通知樣式切換為「原生樣式」。</string>\n    <string name=\"adb_pairing_tutorial_content_miui_2\">否則，您可能會無法從通知輸入配對碼。</string>\n    <string name=\"adb_pairing_tutorial_content_notification\">一則來自 Shizuku 的通知將協助您完成配對。</string>\n    <string name=\"adb_pairing_tutorial_content_left_is_clickable\">請注意，「無線偵錯」選項的左側是可點選的，輕觸它將開啟一個新的頁面。僅開啟右側的開關是錯誤的。</string>\n    <string name=\"home_wireless_adb_description_pre_11\">在 Android 11 之前，必須與電腦連線才能啟用無線偵錯。</string>\n    <string name=\"home_wireless_adb_view_guide_button\">分步驟指南</string>\n    <string name=\"adb_pairing_tutorial_content_network\">Shizuku 需要存取本機網路。它由網路權限控制。</string>\n    <string name=\"adb_pairing_tutorial_content_network_limation_not_foreground\">某些系統 (例如 MIUI) 不允許應用程式在不可見時存取網路，即使應用程式已按標準使用前景服務。請在此類系統上為 Shizuku 停用電池效能最佳化功能。</string>\n    <string name=\"settings_use_system_color\">使用系統主題色彩</string>\n    <string name=\"adb_pairing_tutorial_content_finish\">回到 Shizuku 並啟動 Shizuku。</string>\n    <string name=\"home_app_management_empty\">已要求或宣告 Shizuku 的應用程式將顯示在此處。</string>\n    <string name=\"home_adb_is_limited_title\">您需要進行額外的步驟</string>\n    <string name=\"home_adb_is_limited_description\">您的裝置製造商限制了 ADB 的權限，使用 Shizuku 的應用程式無法正常運作。\n\\n\n\\n通常，在「開發人員選項」中調整一些選項即可解除此限制。請閱讀說明來瞭解具體的作業方式。\n\\n\n\\n您可能需要重新啟動 Shizuku 以使作業生效。</string>\n</resources>"
  },
  {
    "path": "manager/src/main/res/xml/backup_descriptor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<full-backup-content xmlns:tools=\"http://schemas.android.com/tools\">\n    <include\n        domain=\"sharedpref\"\n        path=\"settings.xml\" />\n</full-backup-content>\n"
  },
  {
    "path": "manager/src/main/res/xml/data_extraction_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<data-extraction-rules>\n    <cloud-backup>\n        <include\n            domain=\"sharedpref\"\n            path=\"settings.xml\" />\n    </cloud-backup>\n    <device-transfer>\n        <include\n            domain=\"sharedpref\"\n            path=\"settings.xml\" />\n    </device-transfer>\n</data-extraction-rules>\n"
  },
  {
    "path": "manager/src/main/res/xml/settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <PreferenceCategory\n        android:key=\"startup\"\n        android:title=\"@string/settings_startup\">\n\n        <rikka.material.preference.MaterialSwitchPreference\n            android:key=\"start_on_boot\"\n            android:summary=\"@string/settings_start_on_boot_summary\"\n            android:title=\"@string/settings_start_on_boot\" />\n\n    </PreferenceCategory>\n\n    <PreferenceCategory android:title=\"@string/settings_language\">\n\n        <rikka.preference.SimpleMenuPreference\n            android:defaultValue=\"SYSTEM\"\n            android:key=\"language\"\n            android:summary=\"%s\"\n            android:title=\"@string/settings_language\" />\n\n        <Preference\n            style=\"?preferenceInformationStyle\"\n            android:key=\"translation_contributors\"\n            android:title=\"@string/settings_translation_contributors\" />\n\n        <Preference\n            android:key=\"translation\"\n            android:title=\"@string/settings_translation\" />\n\n    </PreferenceCategory>\n\n    <PreferenceCategory\n        android:key=\"user_interface\"\n        android:title=\"@string/settings_user_interface\">\n\n        <moe.shizuku.manager.settings.IntegerSimpleMenuPreference\n            android:entries=\"@array/night_mode\"\n            android:entryValues=\"@array/night_mode_value\"\n            android:key=\"night_mode\"\n            android:summary=\"%s\"\n            android:title=\"@string/dark_theme\" />\n\n        <rikka.material.preference.MaterialSwitchPreference\n            android:key=\"black_night_theme\"\n            android:summary=\"@string/settings_black_night_theme_summary\"\n            android:title=\"@string/settings_black_night_theme\" />\n\n        <rikka.material.preference.MaterialSwitchPreference\n            android:key=\"use_system_color\"\n            android:title=\"@string/settings_use_system_color\" />\n\n    </PreferenceCategory>\n\n</PreferenceScreen>\n"
  },
  {
    "path": "server/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "server/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'dev.rikka.tools.refine'\n}\n\nandroid {\n    namespace 'moe.shizuku.server'\n    buildFeatures {\n        buildConfig = false\n    }\n}\n\ndependencies {\n    implementation \"androidx.annotation:annotation:1.3.0\"\n    implementation 'com.google.code.gson:gson:2.13.1'\n    api 'dev.rikka.rikkax.parcelablelist:parcelablelist:2.0.1'\n\n    implementation project(':aidl')\n    implementation project(':common')\n    implementation project(':shared')\n    compileOnly project(':provider')\n    implementation project(':starter')\n    implementation project(':rish')\n    implementation project(':server-shared')\n    implementation libs.hidden.compat\n    compileOnly libs.hidden.stub\n}\n"
  },
  {
    "path": "server/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest />\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/ApkChangedObservers.kt",
    "content": "package rikka.shizuku.server\n\nimport android.os.FileObserver\nimport android.util.Log\nimport java.io.File\nimport java.util.*\n\ninterface ApkChangedListener {\n    fun onApkChanged()\n}\n\nprivate val observers = Collections.synchronizedMap(HashMap<String, ApkChangedObserver>())\n\nobject ApkChangedObservers {\n\n    @JvmStatic\n    fun start(apkPath: String, listener: ApkChangedListener) {\n        // inotify watchs inode, if the there are still processes holds the file, DELTE_SELF will not be triggered\n        // so we need to watch the parent folder\n\n        val path = File(apkPath).parent!!\n        val observer = observers.getOrPut(path) {\n            ApkChangedObserver(path).apply {\n                startWatching()\n            }\n        }\n        observer.addListener(listener)\n    }\n\n    @JvmStatic\n    fun stop(listener: ApkChangedListener) {\n        val pathToRemove = mutableListOf<String>()\n\n        for ((path, observer) in observers) {\n            observer.removeListener(listener)\n\n            if (!observer.hasListeners()) {\n                pathToRemove.add(path)\n            }\n        }\n\n        for (path in pathToRemove) {\n            observers.remove(path)?.stopWatching()\n        }\n    }\n}\n\nclass ApkChangedObserver(private val path: String) : FileObserver(path, DELETE) {\n\n    private val listeners = mutableSetOf<ApkChangedListener>()\n\n    fun addListener(listener: ApkChangedListener): Boolean {\n        return listeners.add(listener)\n    }\n\n    fun removeListener(listener: ApkChangedListener): Boolean {\n        return listeners.remove(listener)\n    }\n\n    fun hasListeners(): Boolean {\n        return listeners.isNotEmpty()\n    }\n\n    override fun onEvent(event: Int, path: String?) {\n        Log.d(\"ShizukuServer\", \"onEvent: ${eventToString(event)} $path\")\n\n        if ((event and 0x00008000 /* IN_IGNORED */) != 0 || path == null) {\n            return\n        }\n\n        if (path == \"base.apk\") {\n            stopWatching()\n            ArrayList(listeners).forEach { it.onApkChanged() }\n        }\n    }\n\n    override fun startWatching() {\n        super.startWatching()\n        Log.d(\"ShizukuServer\", \"start watching $path\")\n    }\n\n    override fun stopWatching() {\n        super.stopWatching()\n        Log.d(\"ShizukuServer\", \"stop watching $path\")\n    }\n}\n\nprivate fun eventToString(event: Int): String {\n    val sb = StringBuilder()\n    if (event and FileObserver.ACCESS == FileObserver.ACCESS) {\n        sb.append(\"ACCESS\").append(\" | \")\n    }\n    if (event and FileObserver.MODIFY == FileObserver.MODIFY) {\n        sb.append(\"MODIFY\").append(\" | \")\n    }\n    if (event and FileObserver.ATTRIB == FileObserver.ATTRIB) {\n        sb.append(\"ATTRIB\").append(\" | \")\n    }\n    if (event and FileObserver.CLOSE_WRITE == FileObserver.CLOSE_WRITE) {\n        sb.append(\"CLOSE_WRITE\").append(\" | \")\n    }\n    if (event and FileObserver.CLOSE_NOWRITE == FileObserver.CLOSE_NOWRITE) {\n        sb.append(\"CLOSE_NOWRITE\").append(\" | \")\n    }\n    if (event and FileObserver.OPEN == FileObserver.OPEN) {\n        sb.append(\"OPEN\").append(\" | \")\n    }\n    if (event and FileObserver.MOVED_FROM == FileObserver.MOVED_FROM) {\n        sb.append(\"MOVED_FROM\").append(\" | \")\n    }\n    if (event and FileObserver.MOVED_TO == FileObserver.MOVED_TO) {\n        sb.append(\"MOVED_TO\").append(\" | \")\n    }\n    if (event and FileObserver.CREATE == FileObserver.CREATE) {\n        sb.append(\"CREATE\").append(\" | \")\n    }\n    if (event and FileObserver.DELETE == FileObserver.DELETE) {\n        sb.append(\"DELETE\").append(\" | \")\n    }\n    if (event and FileObserver.DELETE_SELF == FileObserver.DELETE_SELF) {\n        sb.append(\"DELETE_SELF\").append(\" | \")\n    }\n    if (event and FileObserver.MOVE_SELF == FileObserver.MOVE_SELF) {\n        sb.append(\"MOVE_SELF\").append(\" | \")\n    }\n\n    if (event and 0x00008000 == 0x00008000) {\n        sb.append(\"IN_IGNORED\").append(\" | \")\n    }\n\n    if (event and 0x40000000 == 0x40000000) {\n        sb.append(\"IN_ISDIR\").append(\" | \")\n    }\n\n    return if (sb.isNotEmpty()) {\n        sb.substring(0, sb.length - 3)\n    } else {\n        sb.toString()\n    }\n}\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/BinderSender.java",
    "content": "package rikka.shizuku.server;\n\nimport static android.app.ActivityManagerHidden.UID_OBSERVER_ACTIVE;\nimport static android.app.ActivityManagerHidden.UID_OBSERVER_CACHED;\nimport static android.app.ActivityManagerHidden.UID_OBSERVER_GONE;\nimport static android.app.ActivityManagerHidden.UID_OBSERVER_IDLE;\n\nimport android.app.ActivityManagerHidden;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.os.Build;\nimport android.os.RemoteException;\nimport android.text.TextUtils;\n\nimport androidx.annotation.RequiresApi;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport kotlin.collections.ArraysKt;\nimport rikka.hidden.compat.ActivityManagerApis;\nimport rikka.hidden.compat.PackageManagerApis;\nimport rikka.hidden.compat.PermissionManagerApis;\nimport rikka.hidden.compat.adapter.ProcessObserverAdapter;\nimport rikka.hidden.compat.adapter.UidObserverAdapter;\nimport rikka.shizuku.server.util.Logger;\n\npublic class BinderSender {\n\n    private static final Logger LOGGER = new Logger(\"BinderSender\");\n\n    private static final String PERMISSION_MANAGER = \"moe.shizuku.manager.permission.MANAGER\";\n    private static final String PERMISSION = \"moe.shizuku.manager.permission.API_V23\";\n\n    private static ShizukuService sShizukuService;\n\n    private static class ProcessObserver extends ProcessObserverAdapter {\n\n        private static final List<Integer> PID_LIST = new ArrayList<>();\n\n        @Override\n        public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) throws RemoteException {\n            LOGGER.d(\"onForegroundActivitiesChanged: pid=%d, uid=%d, foregroundActivities=%s\", pid, uid, foregroundActivities ? \"true\" : \"false\");\n\n            synchronized (PID_LIST) {\n                if (PID_LIST.contains(pid) || !foregroundActivities) {\n                    return;\n                }\n                PID_LIST.add(pid);\n            }\n\n            sendBinder(uid, pid);\n        }\n\n        @Override\n        public void onProcessDied(int pid, int uid) {\n            LOGGER.d(\"onProcessDied: pid=%d, uid=%d\", pid, uid);\n\n            synchronized (PID_LIST) {\n                int index = PID_LIST.indexOf(pid);\n                if (index != -1) {\n                    PID_LIST.remove(index);\n                }\n            }\n        }\n\n        @Override\n        public void onProcessStateChanged(int pid, int uid, int procState) throws RemoteException {\n            LOGGER.d(\"onProcessStateChanged: pid=%d, uid=%d, procState=%d\", pid, uid, procState);\n\n            synchronized (PID_LIST) {\n                if (PID_LIST.contains(pid)) {\n                    return;\n                }\n                PID_LIST.add(pid);\n            }\n\n            sendBinder(uid, pid);\n        }\n    }\n\n    @RequiresApi(api = Build.VERSION_CODES.N)\n    private static class UidObserver extends UidObserverAdapter {\n\n        private static final List<Integer> UID_LIST = new ArrayList<>();\n\n        @Override\n        public void onUidActive(int uid) throws RemoteException {\n            LOGGER.d(\"onUidCachedChanged: uid=%d\", uid);\n\n            uidStarts(uid);\n        }\n\n        @Override\n        public void onUidCachedChanged(int uid, boolean cached) throws RemoteException {\n            LOGGER.d(\"onUidCachedChanged: uid=%d, cached=%s\", uid, Boolean.toString(cached));\n\n            if (!cached) {\n                uidStarts(uid);\n            }\n        }\n\n        @Override\n        public void onUidIdle(int uid, boolean disabled) throws RemoteException {\n            LOGGER.d(\"onUidIdle: uid=%d, disabled=%s\", uid, Boolean.toString(disabled));\n\n            uidStarts(uid);\n        }\n\n        @Override\n        public void onUidGone(int uid, boolean disabled) throws RemoteException {\n            LOGGER.d(\"onUidGone: uid=%d, disabled=%s\", uid, Boolean.toString(disabled));\n\n            uidGone(uid);\n        }\n\n        private void uidStarts(int uid) throws RemoteException {\n            synchronized (UID_LIST) {\n                if (UID_LIST.contains(uid)) {\n                    LOGGER.v(\"Uid %d already starts\", uid);\n                    return;\n                }\n                UID_LIST.add(uid);\n                LOGGER.v(\"Uid %d starts\", uid);\n            }\n\n            sendBinder(uid, -1);\n        }\n\n        private void uidGone(int uid) {\n            synchronized (UID_LIST) {\n                int index = UID_LIST.indexOf(uid);\n                if (index != -1) {\n                    UID_LIST.remove(index);\n                    LOGGER.v(\"Uid %d dead\", uid);\n                }\n            }\n        }\n    }\n\n    private static void sendBinder(int uid, int pid) throws RemoteException {\n        List<String> packages = PackageManagerApis.getPackagesForUidNoThrow(uid);\n        if (packages.isEmpty())\n            return;\n\n        LOGGER.d(\"sendBinder to uid %d: packages=%s\", uid, TextUtils.join(\", \", packages));\n\n        int userId = uid / 100000;\n        for (String packageName : packages) {\n            PackageInfo pi = PackageManagerApis.getPackageInfoNoThrow(packageName, PackageManager.GET_PERMISSIONS, userId);\n            if (pi == null || pi.requestedPermissions == null)\n                continue;\n\n            if (ArraysKt.contains(pi.requestedPermissions, PERMISSION_MANAGER)) {\n                boolean granted;\n                if (pid == -1)\n                    granted = PermissionManagerApis.checkPermission(PERMISSION_MANAGER, uid) == PackageManager.PERMISSION_GRANTED;\n                else\n                    granted = ActivityManagerApis.checkPermission(PERMISSION_MANAGER, pid, uid) == PackageManager.PERMISSION_GRANTED;\n\n                if (granted) {\n                    ShizukuService.sendBinderToManger(sShizukuService, userId);\n                    return;\n                }\n            } else if (ArraysKt.contains(pi.requestedPermissions, PERMISSION)) {\n                ShizukuService.sendBinderToUserApp(sShizukuService, packageName, userId);\n                return;\n            }\n        }\n    }\n\n    public static void register(ShizukuService shizukuService) {\n        sShizukuService = shizukuService;\n\n        try {\n            ActivityManagerApis.registerProcessObserver(new ProcessObserver());\n        } catch (Throwable tr) {\n            LOGGER.e(tr, \"registerProcessObserver\");\n        }\n\n        if (Build.VERSION.SDK_INT >= 26) {\n            int flags = UID_OBSERVER_GONE | UID_OBSERVER_IDLE | UID_OBSERVER_ACTIVE;\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {\n                flags |= UID_OBSERVER_CACHED;\n            }\n            try {\n                ActivityManagerApis.registerUidObserver(new UidObserver(), flags,\n                        ActivityManagerHidden.PROCESS_STATE_UNKNOWN,\n                        null);\n            } catch (Throwable tr) {\n                LOGGER.e(tr, \"registerUidObserver\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/ServerConstants.java",
    "content": "package rikka.shizuku.server;\n\npublic class ServerConstants {\n\n    public static final int MANAGER_APP_NOT_FOUND = 50;\n\n    public static final String PERMISSION = \"moe.shizuku.manager.permission.API_V23\";\n    public static final String MANAGER_APPLICATION_ID = \"moe.shizuku.privileged.api\";\n    public static final String REQUEST_PERMISSION_ACTION = MANAGER_APPLICATION_ID + \".intent.action.REQUEST_PERMISSION\";\n\n    public static final int BINDER_TRANSACTION_getApplications = 10001;\n}\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/ShizukuClientManager.java",
    "content": "package rikka.shizuku.server;\n\npublic class ShizukuClientManager extends ClientManager<ShizukuConfigManager> {\n\n    public ShizukuClientManager(ShizukuConfigManager configManager) {\n        super(configManager);\n    }\n}\n\n\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/ShizukuConfig.java",
    "content": "package rikka.shizuku.server;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.gson.annotations.SerializedName;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class ShizukuConfig {\n\n    public static final int LATEST_VERSION = 2;\n\n    @SerializedName(\"version\")\n    public int version = LATEST_VERSION;\n\n    @SerializedName(\"packages\")\n    public List<PackageEntry> packages = new ArrayList<>();\n\n    public static class PackageEntry extends ConfigPackageEntry {\n\n        @SerializedName(\"uid\")\n        public final int uid;\n\n        @SerializedName(\"flags\")\n        public int flags;\n\n        @SerializedName(\"packages\")\n        public List<String> packages;\n\n        public PackageEntry(int uid, int flags) {\n            this.uid = uid;\n            this.flags = flags;\n            this.packages = new ArrayList<>();\n        }\n\n        @Override\n        public boolean isAllowed() {\n            return (flags & ConfigManager.FLAG_ALLOWED) != 0;\n        }\n\n        @Override\n        public boolean isDenied() {\n            return (flags & ConfigManager.FLAG_DENIED) != 0;\n        }\n    }\n\n    public ShizukuConfig() {\n    }\n\n    public ShizukuConfig(@NonNull List<PackageEntry> packages) {\n        this.version = LATEST_VERSION;\n        this.packages = packages;\n    }\n}\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/ShizukuConfigManager.java",
    "content": "package rikka.shizuku.server;\n\nimport static rikka.shizuku.server.ServerConstants.PERMISSION;\n\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.os.Build;\nimport android.util.AtomicFile;\n\nimport androidx.annotation.Nullable;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.util.ArrayList;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport kotlin.collections.ArraysKt;\nimport rikka.hidden.compat.PackageManagerApis;\nimport rikka.hidden.compat.PermissionManagerApis;\nimport rikka.hidden.compat.UserManagerApis;\nimport rikka.shizuku.server.ktx.HandlerKt;\n\npublic class ShizukuConfigManager extends ConfigManager {\n\n    private static final Gson GSON_IN = new GsonBuilder()\n            .create();\n    private static final Gson GSON_OUT = new GsonBuilder()\n            .setVersion(ShizukuConfig.LATEST_VERSION)\n            .create();\n\n    private static final long WRITE_DELAY = 10 * 1000;\n\n    private static final File FILE = new File(\"/data/user_de/0/com.android.shell/shizuku.json\");\n    private static final AtomicFile ATOMIC_FILE = new AtomicFile(FILE);\n\n    public static ShizukuConfig load() {\n        FileInputStream stream;\n        try {\n            stream = ATOMIC_FILE.openRead();\n        } catch (FileNotFoundException e) {\n            LOGGER.i(\"no existing config file \" + ATOMIC_FILE.getBaseFile() + \"; starting empty\");\n            return new ShizukuConfig();\n        }\n\n        ShizukuConfig config = null;\n        try {\n            config = GSON_IN.fromJson(new InputStreamReader(stream), ShizukuConfig.class);\n        } catch (Throwable tr) {\n            LOGGER.w(tr, \"load config\");\n        } finally {\n            try {\n                stream.close();\n            } catch (IOException e) {\n                LOGGER.w(\"failed to close: \" + e);\n            }\n        }\n        if (config != null) return config;\n        return new ShizukuConfig();\n    }\n\n    public static void write(ShizukuConfig config) {\n        synchronized (ATOMIC_FILE) {\n            FileOutputStream stream;\n            try {\n                stream = ATOMIC_FILE.startWrite();\n            } catch (IOException e) {\n                LOGGER.w(\"failed to write state: \" + e);\n                return;\n            }\n\n            try {\n                String json = GSON_OUT.toJson(config);\n                stream.write(json.getBytes());\n\n                ATOMIC_FILE.finishWrite(stream);\n                LOGGER.v(\"config saved\");\n            } catch (Throwable tr) {\n                LOGGER.w(tr, \"can't save %s, restoring backup.\", ATOMIC_FILE.getBaseFile());\n                ATOMIC_FILE.failWrite(stream);\n            }\n        }\n    }\n\n    private final Runnable mWriteRunner = new Runnable() {\n\n        @Override\n        public void run() {\n            write(config);\n        }\n    };\n\n    private final ShizukuConfig config;\n\n    public ShizukuConfigManager() {\n        this.config = load();\n\n        boolean changed = false;\n\n        if (config.packages == null) {\n            config.packages = new ArrayList<>();\n            changed = true;\n        }\n\n        for (ShizukuConfig.PackageEntry entry : new ArrayList<>(config.packages)) {\n            if (entry.packages == null) {\n                entry.packages = new ArrayList<>();\n            }\n\n            List<String> packages = PackageManagerApis.getPackagesForUidNoThrow(entry.uid);\n            if (packages.isEmpty()) {\n                LOGGER.i(\"remove config for uid %d since it has gone\", entry.uid);\n                config.packages.remove(entry);\n                changed = true;\n                continue;\n            }\n\n            boolean packagesChanged = true;\n\n            for (String packageName : entry.packages) {\n                if (packages.contains(packageName)) {\n                    packagesChanged = false;\n                    break;\n                }\n            }\n\n            final int rawSize = entry.packages.size();\n            Set<String> s = new LinkedHashSet<>(entry.packages);\n            entry.packages.clear();\n            entry.packages.addAll(s);\n            final int shrunkSize = entry.packages.size();\n            if (shrunkSize < rawSize) {\n                LOGGER.w(\"entry.packages has duplicate! Shrunk. (%d -> %d)\", rawSize, shrunkSize);\n            }\n\n            if (packagesChanged) {\n                LOGGER.i(\"remove config for uid %d since the packages for it changed\", entry.uid);\n                config.packages.remove(entry);\n                changed = true;\n            }\n        }\n\n        for (int userId : UserManagerApis.getUserIdsNoThrow()) {\n            for (PackageInfo pi : PackageManagerApis.getInstalledPackagesNoThrow(PackageManager.GET_PERMISSIONS, userId)) {\n                if (pi == null\n                        || pi.applicationInfo == null\n                        || pi.requestedPermissions == null\n                        || !ArraysKt.contains(pi.requestedPermissions, PERMISSION)) {\n                    continue;\n                }\n\n                int uid = pi.applicationInfo.uid;\n                boolean allowed;\n                try {\n                    allowed = PermissionManagerApis.checkPermission(PERMISSION, uid) == PackageManager.PERMISSION_GRANTED;\n                } catch (Throwable e) {\n                    LOGGER.w(\"checkPermission\");\n                    continue;\n                }\n\n                List<String> packages = new ArrayList<>();\n                packages.add(pi.packageName);\n\n                updateLocked(uid, packages, ConfigManager.MASK_PERMISSION, allowed ? ConfigManager.FLAG_ALLOWED : 0);\n                changed = true;\n            }\n        }\n\n        if (changed) {\n            scheduleWriteLocked();\n        }\n    }\n\n    private void scheduleWriteLocked() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n            if (HandlerKt.getWorkerHandler().hasCallbacks(mWriteRunner)) {\n                return;\n            }\n        } else {\n            HandlerKt.getWorkerHandler().removeCallbacks(mWriteRunner);\n        }\n        HandlerKt.getWorkerHandler().postDelayed(mWriteRunner, WRITE_DELAY);\n    }\n\n    private ShizukuConfig.PackageEntry findLocked(int uid) {\n        for (ShizukuConfig.PackageEntry entry : config.packages) {\n            if (uid == entry.uid) {\n                return entry;\n            }\n        }\n        return null;\n    }\n\n    @Nullable\n    public ShizukuConfig.PackageEntry find(int uid) {\n        synchronized (this) {\n            return findLocked(uid);\n        }\n    }\n\n    private void updateLocked(int uid, List<String> packages, int mask, int values) {\n        ShizukuConfig.PackageEntry entry = findLocked(uid);\n        if (entry == null) {\n            entry = new ShizukuConfig.PackageEntry(uid, mask & values);\n            config.packages.add(entry);\n        } else {\n            int newValue = (entry.flags & ~mask) | (mask & values);\n            if (newValue == entry.flags) {\n                return;\n            }\n            entry.flags = newValue;\n        }\n        if (packages != null) {\n            for (String packageName : packages) {\n                if (entry.packages.contains(packageName)) {\n                    continue;\n                }\n                entry.packages.add(packageName);\n            }\n        }\n        scheduleWriteLocked();\n    }\n\n    public void update(int uid, List<String> packages, int mask, int values) {\n        synchronized (this) {\n            updateLocked(uid, packages, mask, values);\n        }\n    }\n\n    private void removeLocked(int uid) {\n        ShizukuConfig.PackageEntry entry = findLocked(uid);\n        if (entry == null) {\n            return;\n        }\n        config.packages.remove(entry);\n        scheduleWriteLocked();\n    }\n\n    public void remove(int uid) {\n        synchronized (this) {\n            removeLocked(uid);\n        }\n    }\n}\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/ShizukuService.java",
    "content": "package rikka.shizuku.server;\n\nimport static android.Manifest.permission.WRITE_SECURE_SETTINGS;\nimport static rikka.shizuku.ShizukuApiConstants.ATTACH_APPLICATION_API_VERSION;\nimport static rikka.shizuku.ShizukuApiConstants.ATTACH_APPLICATION_PACKAGE_NAME;\nimport static rikka.shizuku.ShizukuApiConstants.BIND_APPLICATION_PERMISSION_GRANTED;\nimport static rikka.shizuku.ShizukuApiConstants.BIND_APPLICATION_SERVER_PATCH_VERSION;\nimport static rikka.shizuku.ShizukuApiConstants.BIND_APPLICATION_SERVER_SECONTEXT;\nimport static rikka.shizuku.ShizukuApiConstants.BIND_APPLICATION_SERVER_UID;\nimport static rikka.shizuku.ShizukuApiConstants.BIND_APPLICATION_SERVER_VERSION;\nimport static rikka.shizuku.ShizukuApiConstants.BIND_APPLICATION_SHOULD_SHOW_REQUEST_PERMISSION_RATIONALE;\nimport static rikka.shizuku.ShizukuApiConstants.REQUEST_PERMISSION_REPLY_ALLOWED;\nimport static rikka.shizuku.ShizukuApiConstants.REQUEST_PERMISSION_REPLY_IS_ONETIME;\nimport static rikka.shizuku.server.ServerConstants.MANAGER_APPLICATION_ID;\nimport static rikka.shizuku.server.ServerConstants.PERMISSION;\n\nimport android.content.Context;\nimport android.content.IContentProvider;\nimport android.content.Intent;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.UserInfo;\nimport android.ddm.DdmHandleAppName;\nimport android.os.Binder;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.os.Looper;\nimport android.os.Parcel;\nimport android.os.RemoteException;\nimport android.os.ServiceManager;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\nimport kotlin.collections.ArraysKt;\nimport moe.shizuku.api.BinderContainer;\nimport moe.shizuku.common.util.BuildUtils;\nimport moe.shizuku.common.util.OsUtils;\nimport moe.shizuku.server.IShizukuApplication;\nimport rikka.hidden.compat.ActivityManagerApis;\nimport rikka.hidden.compat.DeviceIdleControllerApis;\nimport rikka.hidden.compat.PackageManagerApis;\nimport rikka.hidden.compat.PermissionManagerApis;\nimport rikka.hidden.compat.UserManagerApis;\nimport rikka.parcelablelist.ParcelableListSlice;\nimport rikka.rish.RishConfig;\nimport rikka.shizuku.ShizukuApiConstants;\nimport rikka.shizuku.server.api.IContentProviderUtils;\nimport rikka.shizuku.server.util.HandlerUtil;\nimport rikka.shizuku.server.util.UserHandleCompat;\n\npublic class ShizukuService extends Service<ShizukuUserServiceManager, ShizukuClientManager, ShizukuConfigManager> {\n\n    public static void main(String[] args) {\n        DdmHandleAppName.setAppName(\"shizuku_server\", 0);\n        RishConfig.setLibraryPath(System.getProperty(\"shizuku.library.path\"));\n\n        Looper.prepareMainLooper();\n        new ShizukuService();\n        Looper.loop();\n    }\n\n    private static void waitSystemService(String name) {\n        while (ServiceManager.getService(name) == null) {\n            try {\n                LOGGER.i(\"service \" + name + \" is not started, wait 1s.\");\n                Thread.sleep(1000);\n            } catch (InterruptedException e) {\n                LOGGER.w(e.getMessage(), e);\n            }\n        }\n    }\n\n    public static ApplicationInfo getManagerApplicationInfo() {\n        return PackageManagerApis.getApplicationInfoNoThrow(MANAGER_APPLICATION_ID, 0, 0);\n    }\n\n    @SuppressWarnings({\"FieldCanBeLocal\"})\n    private final Handler mainHandler = new Handler(Looper.myLooper());\n    //private final Context systemContext = HiddenApiBridge.getSystemContext();\n    private final ShizukuClientManager clientManager;\n    private final ShizukuConfigManager configManager;\n    private final int managerAppId;\n\n    public ShizukuService() {\n        super();\n\n        HandlerUtil.setMainHandler(mainHandler);\n\n        LOGGER.i(\"starting server...\");\n\n        waitSystemService(\"package\");\n        waitSystemService(Context.ACTIVITY_SERVICE);\n        waitSystemService(Context.USER_SERVICE);\n        waitSystemService(Context.APP_OPS_SERVICE);\n\n        ApplicationInfo ai = getManagerApplicationInfo();\n        if (ai == null) {\n            System.exit(ServerConstants.MANAGER_APP_NOT_FOUND);\n        }\n\n        assert ai != null;\n        managerAppId = ai.uid;\n\n        configManager = getConfigManager();\n        clientManager = getClientManager();\n\n        ApkChangedObservers.start(ai.sourceDir, () -> {\n            if (getManagerApplicationInfo() == null) {\n                LOGGER.w(\"manager app is uninstalled in user 0, exiting...\");\n                System.exit(ServerConstants.MANAGER_APP_NOT_FOUND);\n            }\n        });\n\n        BinderSender.register(this);\n\n        mainHandler.post(() -> {\n            sendBinderToClient();\n            sendBinderToManager();\n        });\n    }\n\n    @Override\n    public ShizukuUserServiceManager onCreateUserServiceManager() {\n        return new ShizukuUserServiceManager();\n    }\n\n    @Override\n    public ShizukuClientManager onCreateClientManager() {\n        return new ShizukuClientManager(getConfigManager());\n    }\n\n    @Override\n    public ShizukuConfigManager onCreateConfigManager() {\n        return new ShizukuConfigManager();\n    }\n\n    @Override\n    public boolean checkCallerManagerPermission(String func, int callingUid, int callingPid) {\n        return UserHandleCompat.getAppId(callingUid) == managerAppId;\n    }\n\n    private int checkCallingPermission() {\n        try {\n            return ActivityManagerApis.checkPermission(ServerConstants.PERMISSION,\n                    Binder.getCallingPid(),\n                    Binder.getCallingUid());\n        } catch (Throwable tr) {\n            LOGGER.w(tr, \"checkCallingPermission\");\n            return PackageManager.PERMISSION_DENIED;\n        }\n    }\n\n    @Override\n    public boolean checkCallerPermission(String func, int callingUid, int callingPid, @Nullable ClientRecord clientRecord) {\n        if (UserHandleCompat.getAppId(callingUid) == managerAppId) {\n            return true;\n        }\n        if (clientRecord == null && checkCallingPermission() == PackageManager.PERMISSION_GRANTED) {\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public void exit() {\n        enforceManagerPermission(\"exit\");\n        LOGGER.i(\"exit\");\n        System.exit(0);\n    }\n\n    @Override\n    public void attachUserService(IBinder binder, Bundle options) {\n        enforceManagerPermission(\"func\");\n\n        super.attachUserService(binder, options);\n    }\n\n    @Override\n    public void attachApplication(IShizukuApplication application, Bundle args) {\n        if (application == null || args == null) {\n            return;\n        }\n\n        String requestPackageName = args.getString(ATTACH_APPLICATION_PACKAGE_NAME);\n        if (requestPackageName == null) {\n            return;\n        }\n        int apiVersion = args.getInt(ATTACH_APPLICATION_API_VERSION, -1);\n\n        int callingPid = Binder.getCallingPid();\n        int callingUid = Binder.getCallingUid();\n        boolean isManager;\n        ClientRecord clientRecord = null;\n\n        List<String> packages = PackageManagerApis.getPackagesForUidNoThrow(callingUid);\n        if (!packages.contains(requestPackageName)) {\n            LOGGER.w(\"Request package \" + requestPackageName + \"does not belong to uid \" + callingUid);\n            throw new SecurityException(\"Request package \" + requestPackageName + \"does not belong to uid \" + callingUid);\n        }\n\n        isManager = MANAGER_APPLICATION_ID.equals(requestPackageName);\n\n        if (clientManager.findClient(callingUid, callingPid) == null) {\n            synchronized (this) {\n                clientRecord = clientManager.addClient(callingUid, callingPid, application, requestPackageName, apiVersion);\n            }\n            if (clientRecord == null) {\n                LOGGER.w(\"Add client failed\");\n                return;\n            }\n        }\n\n        LOGGER.d(\"attachApplication: %s %d %d\", requestPackageName, callingUid, callingPid);\n\n        int replyServerVersion = ShizukuApiConstants.SERVER_VERSION;\n        if (apiVersion == -1) {\n            // ShizukuBinderWrapper has adapted API v13 in dev.rikka.shizuku:api 12.2.0, however\n            // attachApplication in 12.2.0 is still old, so that server treat the client as pre 13.\n            // This finally cause transactRemote fails.\n            // So we can pass 12 here to pretend we are v12 server.\n            replyServerVersion = 12;\n        }\n\n        Bundle reply = new Bundle();\n        reply.putInt(BIND_APPLICATION_SERVER_UID, OsUtils.getUid());\n        reply.putInt(BIND_APPLICATION_SERVER_VERSION, replyServerVersion);\n        reply.putString(BIND_APPLICATION_SERVER_SECONTEXT, OsUtils.getSELinuxContext());\n        reply.putInt(BIND_APPLICATION_SERVER_PATCH_VERSION, ShizukuApiConstants.SERVER_PATCH_VERSION);\n        if (!isManager) {\n            reply.putBoolean(BIND_APPLICATION_PERMISSION_GRANTED, Objects.requireNonNull(clientRecord).allowed);\n            reply.putBoolean(BIND_APPLICATION_SHOULD_SHOW_REQUEST_PERMISSION_RATIONALE, false);\n        } else {\n            try {\n                PermissionManagerApis.grantRuntimePermission(MANAGER_APPLICATION_ID,\n                        WRITE_SECURE_SETTINGS, UserHandleCompat.getUserId(callingUid));\n            } catch (RemoteException e) {\n                LOGGER.w(e, \"grant WRITE_SECURE_SETTINGS\");\n            }\n        }\n        try {\n            application.bindApplication(reply);\n        } catch (Throwable e) {\n            LOGGER.w(e, \"attachApplication\");\n        }\n    }\n\n    @Override\n    public void showPermissionConfirmation(int requestCode, @NonNull ClientRecord clientRecord, int callingUid, int callingPid, int userId) {\n        ApplicationInfo ai = PackageManagerApis.getApplicationInfoNoThrow(clientRecord.packageName, 0, userId);\n        if (ai == null) {\n            return;\n        }\n\n        PackageInfo pi = PackageManagerApis.getPackageInfoNoThrow(MANAGER_APPLICATION_ID, 0, userId);\n        UserInfo userInfo = UserManagerApis.getUserInfo(userId);\n        boolean isWorkProfileUser = BuildUtils.atLeast30() ?\n                \"android.os.usertype.profile.MANAGED\".equals(userInfo.userType) :\n                (userInfo.flags & UserInfo.FLAG_MANAGED_PROFILE) != 0;\n        if (pi == null && !isWorkProfileUser) {\n            LOGGER.w(\"Manager not found in non work profile user %d. Revoke permission\", userId);\n            clientRecord.dispatchRequestPermissionResult(requestCode, false);\n            return;\n        }\n\n        Intent intent = new Intent(ServerConstants.REQUEST_PERMISSION_ACTION)\n                .setPackage(MANAGER_APPLICATION_ID)\n                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT)\n                .putExtra(\"uid\", callingUid)\n                .putExtra(\"pid\", callingPid)\n                .putExtra(\"requestCode\", requestCode)\n                .putExtra(\"applicationInfo\", ai);\n        ActivityManagerApis.startActivityNoThrow(intent, null, isWorkProfileUser ? 0 : userId);\n    }\n\n    @Override\n    public void dispatchPermissionConfirmationResult(int requestUid, int requestPid, int requestCode, Bundle data) throws RemoteException {\n        if (UserHandleCompat.getAppId(Binder.getCallingUid()) != managerAppId) {\n            LOGGER.w(\"dispatchPermissionConfirmationResult called not from the manager package\");\n            return;\n        }\n\n        if (data == null) {\n            return;\n        }\n\n        boolean allowed = data.getBoolean(REQUEST_PERMISSION_REPLY_ALLOWED);\n        boolean onetime = data.getBoolean(REQUEST_PERMISSION_REPLY_IS_ONETIME);\n\n        LOGGER.i(\"dispatchPermissionConfirmationResult: uid=%d, pid=%d, requestCode=%d, allowed=%s, onetime=%s\",\n                requestUid, requestPid, requestCode, Boolean.toString(allowed), Boolean.toString(onetime));\n\n        List<ClientRecord> records = clientManager.findClients(requestUid);\n        List<String> packages = new ArrayList<>();\n        if (records.isEmpty()) {\n            LOGGER.w(\"dispatchPermissionConfirmationResult: no client for uid %d was found\", requestUid);\n        } else {\n            for (ClientRecord record : records) {\n                packages.add(record.packageName);\n                record.allowed = allowed;\n                if (record.pid == requestPid) {\n                    record.dispatchRequestPermissionResult(requestCode, allowed);\n                }\n            }\n        }\n\n        if (!onetime) {\n            configManager.update(requestUid, packages, ConfigManager.MASK_PERMISSION, allowed ? ConfigManager.FLAG_ALLOWED : ConfigManager.FLAG_DENIED);\n        }\n\n        if (!onetime && allowed) {\n            int userId = UserHandleCompat.getUserId(requestUid);\n\n            for (String packageName : PackageManagerApis.getPackagesForUidNoThrow(requestUid)) {\n                PackageInfo pi = PackageManagerApis.getPackageInfoNoThrow(packageName, PackageManager.GET_PERMISSIONS, userId);\n                if (pi == null || pi.requestedPermissions == null || !ArraysKt.contains(pi.requestedPermissions, PERMISSION)) {\n                    continue;\n                }\n\n                int deviceId = 0;//Context.DEVICE_ID_DEFAULT\n                if (allowed) {\n                    PermissionManagerApis.grantRuntimePermission(packageName, PERMISSION, userId);\n                } else {\n                    PermissionManagerApis.revokeRuntimePermission(packageName, PERMISSION, userId);\n                }\n            }\n        }\n    }\n\n    private int  getFlagsForUidInternal(int uid, int mask, boolean allowRuntimePermission) {\n        ShizukuConfig.PackageEntry entry = configManager.find(uid);\n        if (entry != null) {\n            return entry.flags & mask;\n        }\n\n        if (allowRuntimePermission && (mask & ConfigManager.MASK_PERMISSION) != 0) {\n            int userId = UserHandleCompat.getUserId(uid);\n            for (String packageName : PackageManagerApis.getPackagesForUidNoThrow(uid)) {\n                PackageInfo pi = PackageManagerApis.getPackageInfoNoThrow(packageName, PackageManager.GET_PERMISSIONS, userId);\n                if (pi == null || pi.requestedPermissions == null || !ArraysKt.contains(pi.requestedPermissions, PERMISSION)) {\n                    continue;\n                }\n\n                try {\n                    if (PermissionManagerApis.checkPermission(PERMISSION, uid) == PackageManager.PERMISSION_GRANTED) {\n                        return ConfigManager.FLAG_ALLOWED;\n                    }\n                } catch (Throwable e) {\n                    LOGGER.w(\"getFlagsForUid\");\n                }\n            }\n        }\n        return 0;\n    }\n\n    @Override\n    public int getFlagsForUid(int uid, int mask) {\n        if (UserHandleCompat.getAppId(Binder.getCallingUid()) != managerAppId) {\n            LOGGER.w(\"updateFlagsForUid is allowed to be called only from the manager\");\n            return 0;\n        }\n        return getFlagsForUidInternal(uid, mask, true);\n    }\n\n    @Override\n    public void updateFlagsForUid(int uid, int mask, int value) throws RemoteException {\n        if (UserHandleCompat.getAppId(Binder.getCallingUid()) != managerAppId) {\n            LOGGER.w(\"updateFlagsForUid is allowed to be called only from the manager\");\n            return;\n        }\n\n        int userId = UserHandleCompat.getUserId(uid);\n\n        if ((mask & ConfigManager.MASK_PERMISSION) != 0) {\n            boolean allowed = (value & ConfigManager.FLAG_ALLOWED) != 0;\n            boolean denied = (value & ConfigManager.FLAG_DENIED) != 0;\n\n            List<ClientRecord> records = clientManager.findClients(uid);\n            for (ClientRecord record : records) {\n                if (allowed) {\n                    record.allowed = true;\n                } else {\n                    record.allowed = false;\n                    ActivityManagerApis.forceStopPackageNoThrow(record.packageName, UserHandleCompat.getUserId(record.uid));\n                    onPermissionRevoked(record.packageName);\n                }\n            }\n\n            for (String packageName : PackageManagerApis.getPackagesForUidNoThrow(uid)) {\n                PackageInfo pi = PackageManagerApis.getPackageInfoNoThrow(packageName, PackageManager.GET_PERMISSIONS, userId);\n                if (pi == null || pi.requestedPermissions == null || !ArraysKt.contains(pi.requestedPermissions, PERMISSION)) {\n                    continue;\n                }\n\n                int deviceId = 0;//Context.DEVICE_ID_DEFAULT\n                if (allowed) {\n                    PermissionManagerApis.grantRuntimePermission(packageName, PERMISSION, userId);\n                } else {\n                    PermissionManagerApis.revokeRuntimePermission(packageName, PERMISSION, userId);\n                }\n\n                // TODO kill user service using\n            }\n        }\n\n        configManager.update(uid, null, mask, value);\n    }\n\n    private void onPermissionRevoked(String packageName) {\n        // TODO add runtime permission listener\n        getUserServiceManager().removeUserServicesForPackage(packageName);\n    }\n\n    private ParcelableListSlice<PackageInfo> getApplications(int userId) {\n        List<PackageInfo> list = new ArrayList<>();\n        List<Integer> users = new ArrayList<>();\n        if (userId == -1) {\n            users.addAll(UserManagerApis.getUserIdsNoThrow());\n        } else {\n            users.add(userId);\n        }\n\n        for (int user : users) {\n            for (PackageInfo pi : PackageManagerApis.getInstalledPackagesNoThrow(PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS, user)) {\n                if (Objects.equals(MANAGER_APPLICATION_ID, pi.packageName)) continue;\n                if (pi.applicationInfo == null) continue;\n\n                int uid = pi.applicationInfo.uid;\n                int flags = 0;\n                ShizukuConfig.PackageEntry entry = configManager.find(uid);\n                if (entry != null) {\n                    if (entry.packages != null && !entry.packages.contains(pi.packageName))\n                        continue;\n                    flags = entry.flags & ConfigManager.MASK_PERMISSION;\n                }\n\n                if (flags != 0) {\n                    list.add(pi);\n                } else if (pi.applicationInfo.metaData != null\n                        && pi.applicationInfo.metaData.getBoolean(\"moe.shizuku.client.V3_SUPPORT\", false)\n                        && pi.requestedPermissions != null\n                        && ArraysKt.contains(pi.requestedPermissions, PERMISSION)) {\n                    list.add(pi);\n                }\n            }\n\n        }\n        return new ParcelableListSlice<>(list);\n    }\n\n    @Override\n    public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {\n        //LOGGER.d(\"transact: code=%d, calling uid=%d\", code, Binder.getCallingUid());\n        if (code == ServerConstants.BINDER_TRANSACTION_getApplications) {\n            data.enforceInterface(ShizukuApiConstants.BINDER_DESCRIPTOR);\n            int userId = data.readInt();\n            ParcelableListSlice<PackageInfo> result = getApplications(userId);\n            reply.writeNoException();\n            result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);\n            return true;\n        }\n        return super.onTransact(code, data, reply, flags);\n    }\n\n    void sendBinderToClient() {\n        for (int userId : UserManagerApis.getUserIdsNoThrow()) {\n            sendBinderToClient(this, userId);\n        }\n    }\n\n    private static void sendBinderToClient(Binder binder, int userId) {\n        try {\n            for (PackageInfo pi : PackageManagerApis.getInstalledPackagesNoThrow(PackageManager.GET_PERMISSIONS, userId)) {\n                if (pi == null || pi.requestedPermissions == null)\n                    continue;\n\n                if (ArraysKt.contains(pi.requestedPermissions, PERMISSION)) {\n                    sendBinderToUserApp(binder, pi.packageName, userId);\n                }\n            }\n        } catch (Throwable tr) {\n            LOGGER.e(\"exception when call getInstalledPackages\", tr);\n        }\n    }\n\n    void sendBinderToManager() {\n        sendBinderToManger(this);\n    }\n\n    private static void sendBinderToManger(Binder binder) {\n        for (int userId : UserManagerApis.getUserIdsNoThrow()) {\n            sendBinderToManger(binder, userId);\n        }\n    }\n\n    static void sendBinderToManger(Binder binder, int userId) {\n        sendBinderToUserApp(binder, MANAGER_APPLICATION_ID, userId);\n    }\n\n    static void sendBinderToUserApp(Binder binder, String packageName, int userId) {\n        sendBinderToUserApp(binder, packageName, userId, true);\n    }\n\n    static void sendBinderToUserApp(Binder binder, String packageName, int userId, boolean retry) {\n        try {\n            DeviceIdleControllerApis.addPowerSaveTempWhitelistApp(packageName, 30 * 1000, userId,\n                    316/* PowerExemptionManager#REASON_SHELL */, \"shell\");\n            LOGGER.v(\"Add %d:%s to power save temp whitelist for 30s\", userId, packageName);\n        } catch (Throwable tr) {\n            LOGGER.e(tr, \"Failed to add %d:%s to power save temp whitelist\", userId, packageName);\n        }\n\n        String name = packageName + \".shizuku\";\n        IContentProvider provider = null;\n\n        /*\n         When we pass IBinder through binder (and really crossed process), the receive side (here is system_server process)\n         will always get a new instance of android.os.BinderProxy.\n\n         In the implementation of getContentProviderExternal and removeContentProviderExternal, received\n         IBinder is used as the key of a HashMap. But hashCode() is not implemented by BinderProxy, so\n         removeContentProviderExternal will never work.\n\n         Luckily, we can pass null. When token is token, count will be used.\n         */\n        IBinder token = null;\n\n        try {\n            provider = ActivityManagerApis.getContentProviderExternal(name, userId, token, name);\n            if (provider == null) {\n                LOGGER.e(\"provider is null %s %d\", name, userId);\n                return;\n            }\n            if (!provider.asBinder().pingBinder()) {\n                LOGGER.e(\"provider is dead %s %d\", name, userId);\n\n                if (retry) {\n                    // For unknown reason, sometimes this could happens\n                    // Kill Shizuku app and try again could work\n                    ActivityManagerApis.forceStopPackageNoThrow(packageName, userId);\n                    LOGGER.e(\"kill %s in user %d and try again\", packageName, userId);\n                    Thread.sleep(1000);\n                    sendBinderToUserApp(binder, packageName, userId, false);\n                }\n                return;\n            }\n\n            if (!retry) {\n                LOGGER.e(\"retry works\");\n            }\n\n            Bundle extra = new Bundle();\n            extra.putParcelable(\"moe.shizuku.privileged.api.intent.extra.BINDER\", new BinderContainer(binder));\n\n            Bundle reply = IContentProviderUtils.callCompat(provider, null, name, \"sendBinder\", null, extra);\n            if (reply != null) {\n                LOGGER.i(\"send binder to user app %s in user %d\", packageName, userId);\n            } else {\n                LOGGER.w(\"failed to send binder to user app %s in user %d\", packageName, userId);\n            }\n        } catch (Throwable tr) {\n            LOGGER.e(tr, \"failed send binder to user app %s in user %d\", packageName, userId);\n        } finally {\n            if (provider != null) {\n                try {\n                    ActivityManagerApis.removeContentProviderExternal(name, token);\n                } catch (Throwable tr) {\n                    LOGGER.w(tr, \"removeContentProviderExternal\");\n                }\n            }\n        }\n    }\n\n    // ------ Sui only ------\n\n    @Override\n    public void dispatchPackageChanged(Intent intent) throws RemoteException {\n\n    }\n\n    @Override\n    public boolean isHidden(int uid) throws RemoteException {\n        return false;\n    }\n}\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/ShizukuUserServiceManager.java",
    "content": "package rikka.shizuku.server;\n\nimport android.content.pm.PackageInfo;\nimport android.util.ArrayMap;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\n\nimport moe.shizuku.starter.ServiceStarter;\nimport rikka.hidden.compat.PackageManagerApis;\nimport rikka.hidden.compat.UserManagerApis;\nimport rikka.shizuku.server.util.UserHandleCompat;\n\npublic class ShizukuUserServiceManager extends UserServiceManager {\n\n    private final Map<UserServiceRecord, ApkChangedListener> apkChangedListeners = new ArrayMap<>();\n    private final Map<String, List<UserServiceRecord>> userServiceRecords = Collections.synchronizedMap(new ArrayMap<>());\n\n    public ShizukuUserServiceManager() {\n        super();\n    }\n\n    @Override\n    public String getUserServiceStartCmd(\n            UserServiceRecord record, String key, String token, String packageName,\n            String classname, String processNameSuffix, int callingUid, boolean use32Bits, boolean debug) {\n\n        String appProcess = \"/system/bin/app_process\";\n        if (use32Bits && new File(\"/system/bin/app_process32\").exists()) {\n            appProcess = \"/system/bin/app_process32\";\n        }\n        return ServiceStarter.commandForUserService(\n                appProcess,\n                ShizukuService.getManagerApplicationInfo().sourceDir,\n                token, packageName, classname, processNameSuffix, callingUid, debug);\n    }\n\n    @Override\n    public void onUserServiceRecordCreated(UserServiceRecord record, PackageInfo packageInfo) {\n        super.onUserServiceRecordCreated(record, packageInfo);\n\n        String packageName = packageInfo.packageName;\n        ApkChangedListener listener = new ApkChangedListener() {\n            @Override\n            public void onApkChanged() {\n                String newSourceDir = null;\n\n                for (int userId : UserManagerApis.getUserIdsNoThrow()) {\n                    PackageInfo pi = PackageManagerApis.getPackageInfoNoThrow(packageName, 0, userId);\n                    if (pi != null && pi.applicationInfo != null && pi.applicationInfo.sourceDir != null) {\n                        newSourceDir = pi.applicationInfo.sourceDir;\n                        break;\n                    }\n                }\n\n                if (newSourceDir == null) {\n                    LOGGER.v(\"remove record %s because package %s has been removed\", record.token, packageName);\n                    record.removeSelf();\n                } else {\n                    LOGGER.v(\"update apk listener for record %s since package %s is upgrading\", record.token, packageName);\n                    ApkChangedObservers.stop(this);\n                    ApkChangedObservers.start(newSourceDir, this);\n                }\n            }\n        };\n\n        ApkChangedObservers.start(packageInfo.applicationInfo.sourceDir, listener);\n        apkChangedListeners.put(record, listener);\n    }\n\n    @Override\n    public void onUserServiceRecordRemoved(UserServiceRecord record) {\n        super.onUserServiceRecordRemoved(record);\n        ApkChangedListener listener = apkChangedListeners.get(record);\n        if (listener != null) {\n            ApkChangedObservers.stop(listener);\n            apkChangedListeners.remove(record);\n        }\n    }\n}\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/api/IContentProviderUtils.java",
    "content": "package rikka.shizuku.server.api;\n\nimport android.content.AttributionSource;\nimport android.content.IContentProvider;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.RemoteException;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport rikka.shizuku.server.util.OsUtils;\n\npublic class IContentProviderUtils {\n\n    public static Bundle callCompat(@NonNull IContentProvider provider, @Nullable String callingPkg, @Nullable String authority, @Nullable String method, @Nullable String arg, @Nullable Bundle extras) throws RemoteException {\n        Bundle result;\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n            result = provider.call((new AttributionSource.Builder(OsUtils.getUid())).setPackageName(callingPkg).build(), authority, method, arg, extras);\n        } else if (Build.VERSION.SDK_INT >= 30) {\n            result = provider.call(callingPkg, (String) null, authority, method, arg, extras);\n        } else if (Build.VERSION.SDK_INT >= 29) {\n            result = provider.call(callingPkg, authority, method, arg, extras);\n        } else {\n            result = provider.call(callingPkg, method, arg, extras);\n        }\n\n        return result;\n    }\n}\n"
  },
  {
    "path": "server/src/main/java/rikka/shizuku/server/ktx/Handler.kt",
    "content": "package rikka.shizuku.server.ktx\n\nimport android.os.Handler\nimport android.os.HandlerThread\nimport android.os.Looper\n\nval mainHandler by lazy {\n    Handler(Looper.getMainLooper())\n}\n\nprivate val workerThread by lazy(LazyThreadSafetyMode.NONE) {\n    HandlerThread(\"Worker\").apply { start() }\n}\n\nval workerHandler by lazy {\n    Handler(workerThread.looper)\n}\n"
  },
  {
    "path": "settings.gradle",
    "content": "pluginManagement {\n    repositories {\n        google()\n        mavenLocal()\n        mavenCentral()\n    }\n    plugins {\n        id(\"com.android.application\") version \"8.10.1\"\n        id(\"com.android.library\") version \"8.10.1\"\n        id(\"org.jetbrains.kotlin.android\") version \"2.1.21\"\n        id(\"dev.rikka.tools.autoresconfig\") version \"1.2.2\"\n        id(\"dev.rikka.tools.materialthemebuilder\") version \"1.5.1\"\n        id(\"dev.rikka.tools.refine\") version \"4.4.0\"\n    }\n}\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenLocal()\n        mavenCentral()\n        maven {\n            url(\"https://jitpack.io\")\n            content {\n                includeGroup(\"com.github.topjohnwu.libsu\")\n            }\n        }\n    }\n    versionCatalogs {\n        libs {\n            version('hidden-api', '4.4.0')\n            library('hidden-compat', 'dev.rikka.hidden', 'compat').versionRef('hidden-api')\n            library('hidden-stub', 'dev.rikka.hidden', 'stub').versionRef('hidden-api')\n\n            version('refine', '4.4.0')\n            library('refine-runtime', 'dev.rikka.tools.refine', 'runtime').versionRef('refine')\n            library('refine-annotation', 'dev.rikka.tools.refine', 'annotation').versionRef('refine')\n            library('refine-annotation-processor', 'dev.rikka.tools.refine', 'annotation-processor').versionRef('refine')\n        }\n    }\n}\n\ninclude ':server', ':starter', ':shell'\ninclude ':manager'\ninclude ':common'\n\ndef root = \"api\"\n\ndef propFile = file('local.properties')\ndef props = new Properties()\n\nif (propFile.canRead()) {\n    props.load(new FileInputStream(propFile))\n\n    if (props != null) {\n        if (props[\"api.useLocal\"].equals(\"true\")) {\n            root = props[\"api.dir\"]\n        }\n    }\n}\n\ninclude ':aidl'\nproject(':aidl').projectDir = file(\"$root${File.separator}aidl\")\n\ninclude ':rish'\nproject(':rish').projectDir = file(\"$root${File.separator}rish\")\n\ninclude ':shared'\nproject(':shared').projectDir = file(\"$root${File.separator}shared\")\n\ninclude ':api'\nproject(':api').projectDir = file(\"$root${File.separator}api\")\n\ninclude ':provider'\nproject(':provider').projectDir = file(\"$root${File.separator}provider\")\n\ninclude ':server-shared'\nproject(':server-shared').projectDir = file(\"$root${File.separator}server-shared\")\n\ninclude ':hidden-api-stub'\nproject(':hidden-api-stub').projectDir = file(\"$root${File.separator}hidden-api-stub\")\n"
  },
  {
    "path": "shell/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "shell/build.gradle",
    "content": "plugins {\n    id 'com.android.application'\n    id 'dev.rikka.tools.refine'\n}\n\nandroid {\n    namespace 'rikka.shizuku.shell'\n    defaultConfig {\n        versionCode rootProject.ext.versionCode\n        versionName rootProject.ext.versionName\n    }\n    buildTypes {\n        debug {\n            multiDexEnabled false\n        }\n        release {\n            minifyEnabled true\n            proguardFiles 'proguard-rules.pro'\n        }\n    }\n    dependenciesInfo {\n        includeInApk false\n    }\n    lint {\n        checkReleaseBuilds false\n    }\n    buildFeatures {\n        buildConfig = true\n    }\n}\n\nandroid.applicationVariants.all { variant ->\n    variant.outputs.all {\n        def outDir = new File(rootDir, \"out\")\n        def mappingPath = new File(outDir, \"mapping\").absolutePath\n        def dexPath = \"${rootProject.rootDir.path}/manager/src/main/assets\"\n        variant.assembleProvider.get().doLast {\n            if (variant.getBuildType().isMinifyEnabled()) {\n                copy {\n                    from variant.mappingFileProvider.get()\n                    into mappingPath\n                    rename { String fileName ->\n                        mappingPath + File.separator + \"cmd-v${variant.versionName}.txt\"\n                    }\n                }\n            }\n            copy {\n                def file = zipTree(file(outputFile)).matching { include 'classes*.dex' }.singleFile\n\n                from file\n                into dexPath\n                rename { String fileName ->\n                    fileName.replace(file.getName(), \"rish_shizuku.dex\")\n                }\n            }\n        }\n    }\n}\n\ndependencies {\n    implementation libs.hidden.compat\n    compileOnly libs.hidden.stub\n}\n"
  },
  {
    "path": "shell/proguard-rules.pro",
    "content": "-keep class rikka.shizuku.shell.ShizukuShellLoader {\n    public static void main(java.lang.String[]);\n}\n\n-allowaccessmodification\n-repackageclasses\n"
  },
  {
    "path": "shell/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest />\n"
  },
  {
    "path": "shell/src/main/java/rikka/shizuku/shell/ShizukuShellLoader.java",
    "content": "package rikka.shizuku.shell;\n\nimport android.app.ActivityManagerNative;\nimport android.app.IActivityManager;\nimport android.content.Intent;\nimport android.os.Binder;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.os.Looper;\nimport android.os.Parcel;\nimport android.os.RemoteException;\nimport android.os.ServiceManager;\nimport android.system.Os;\nimport android.text.TextUtils;\n\nimport java.io.File;\nimport java.util.Objects;\n\nimport dalvik.system.BaseDexClassLoader;\nimport rikka.hidden.compat.PackageManagerApis;\nimport stub.dalvik.system.VMRuntimeHidden;\n\npublic class ShizukuShellLoader {\n\n    private static String[] args;\n    private static String callingPackage;\n    private static Handler handler;\n\n    private static final Binder receiverBinder = new Binder() {\n\n        @Override\n        protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {\n            if (code == 1) {\n                IBinder binder = data.readStrongBinder();\n\n                String sourceDir = data.readString();\n                if (binder != null) {\n                    handler.post(() -> onBinderReceived(binder, sourceDir));\n                } else {\n                    System.err.println(\"Server is not running\");\n                    System.err.flush();\n                    System.exit(1);\n                }\n                return true;\n            }\n            return super.onTransact(code, data, reply, flags);\n        }\n    };\n\n    private static void requestForBinder() throws RemoteException {\n        Bundle data = new Bundle();\n        data.putBinder(\"binder\", receiverBinder);\n\n        Intent intent = new Intent(\"rikka.shizuku.intent.action.REQUEST_BINDER\")\n                .setPackage(\"moe.shizuku.privileged.api\")\n                .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)\n                .putExtra(\"data\", data);\n\n        IBinder amBinder = ServiceManager.getService(\"activity\");\n        IActivityManager am;\n        if (Build.VERSION.SDK_INT >= 26) {\n            am = IActivityManager.Stub.asInterface(amBinder);\n        } else {\n            am = ActivityManagerNative.asInterface(amBinder);\n        }\n\n        // broadcastIntent will fail on Android 8.x\n        //  com.android.server.am.ActivityManagerService.isInstantApp(ActivityManagerService.java:18547)\n        //  com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:18972)\n        //  com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:19703)\n        //\n        try {\n            am.broadcastIntent(null, intent, null, null, 0, null, null,\n                    null, -1, null, true, false, 0);\n        } catch (Throwable e) {\n            if ((Build.VERSION.SDK_INT != Build.VERSION_CODES.O && Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1)\n                    || !Objects.equals(e.getMessage(), \"Calling application did not provide package name\")) {\n                throw e;\n            }\n\n            System.err.println(\"broadcastIntent fails on Android 8.0 or 8.1, fallback to startActivity\");\n            System.err.flush();\n\n            Intent activityIntent = Intent.createChooser(\n                    new Intent(\"rikka.shizuku.intent.action.REQUEST_BINDER\")\n                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)\n                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n                            .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)\n                            .putExtra(\"data\", data),\n                    \"Request binder from Shizuku\"\n            );\n\n            am.startActivityAsUser(null, callingPackage, activityIntent, null, null, null, 0, 0, null, null, Os.getuid() / 100000);\n        }\n    }\n\n    private static void onBinderReceived(IBinder binder, String sourceDir) {\n        var base = sourceDir.substring(0, sourceDir.lastIndexOf('/'));\n        String librarySearchPath = base + \"/lib/\" + VMRuntimeHidden.getRuntime().vmInstructionSet();\n        String systemLibrarySearchPath = System.getProperty(\"java.library.path\");\n        if (!TextUtils.isEmpty(systemLibrarySearchPath)) {\n            librarySearchPath += File.pathSeparatorChar + systemLibrarySearchPath;\n        }\n\n        try {\n            var classLoader = new BaseDexClassLoader(sourceDir, null, librarySearchPath, ClassLoader.getSystemClassLoader());\n            Class<?> cls = classLoader.loadClass(\"moe.shizuku.manager.shell.Shell\");\n            cls.getDeclaredMethod(\"main\", String[].class, String.class, IBinder.class, Handler.class)\n                    .invoke(null, args, callingPackage, binder, handler);\n        } catch (ClassNotFoundException tr) {\n            System.err.println(\"Class not found\");\n            System.err.println(\"Make sure you have Shizuku v12.0.0 or above installed\");\n            System.err.flush();\n            System.exit(1);\n        } catch (Throwable tr) {\n            tr.printStackTrace(System.err);\n            System.err.flush();\n            System.exit(1);\n        }\n    }\n\n    public static void main(String[] args) {\n        ShizukuShellLoader.args = args;\n\n        String packageName;\n        var pkg = PackageManagerApis.getPackagesForUidNoThrow(Os.getuid());\n        if (pkg.size() == 1) {\n            packageName = pkg.get(0);\n        } else {\n            packageName = System.getenv(\"RISH_APPLICATION_ID\");\n            if (TextUtils.isEmpty(packageName) || \"PKG\".equals(packageName)) {\n                abort(\"RISH_APPLICATION_ID is not set, set this environment variable to the id of current application (package name)\");\n                System.exit(1);\n            }\n        }\n\n        ShizukuShellLoader.callingPackage = packageName;\n\n        if (Looper.getMainLooper() == null) {\n            Looper.prepareMainLooper();\n        }\n\n        handler = new Handler(Looper.getMainLooper());\n\n        try {\n            requestForBinder();\n        } catch (Throwable tr) {\n            tr.printStackTrace(System.err);\n            System.err.flush();\n            System.exit(1);\n        }\n\n        handler.postDelayed(() -> abort(\n                String.format(\n                        \"Request timeout. The connection between the current app (%1$s) and Shizuku app may be blocked by your system. \" +\n                                \"Please disable all battery optimization features for both current app (%1$s) and Shizuku app.\",\n                        packageName)\n        ), 5000);\n\n        Looper.loop();\n        System.exit(0);\n    }\n\n    private static void abort(String message) {\n        System.err.println(message);\n        System.err.flush();\n        System.exit(1);\n    }\n}\n"
  },
  {
    "path": "signing.gradle",
    "content": "def ksFile = rootProject.file('signing.properties')\ndef props = new Properties()\nif (ksFile.canRead()) {\n    props.load(new FileInputStream(ksFile))\n\n    if (props != null) {\n        android.signingConfigs.sign.storeFile file(props['KEYSTORE_FILE'])\n        android.signingConfigs.sign.storePassword props['KEYSTORE_PASSWORD']\n        android.signingConfigs.sign.keyAlias props['KEYSTORE_ALIAS']\n        android.signingConfigs.sign.keyPassword props['KEYSTORE_ALIAS_PASSWORD']\n    }\n} else {\n    android.signingConfigs.sign.storeFile = android.signingConfigs.debug.storeFile\n    android.signingConfigs.sign.storePassword = android.signingConfigs.debug.storePassword\n    android.signingConfigs.sign.keyAlias = android.signingConfigs.debug.keyAlias\n    android.signingConfigs.sign.keyPassword = android.signingConfigs.debug.keyPassword\n}\n"
  },
  {
    "path": "starter/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "starter/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'dev.rikka.tools.refine'\n}\n\nandroid {\n    namespace 'rikka.shizuku.starter'\n    buildFeatures {\n        buildConfig = false\n    }\n}\n\ndependencies {\n    implementation project(':common')\n    implementation project(':shared')\n    implementation project(':server-shared')\n    compileOnly project(':provider')\n    implementation 'androidx.annotation:annotation:1.3.0'\n    implementation libs.hidden.compat\n    compileOnly libs.hidden.stub\n    implementation libs.refine.runtime\n}\n"
  },
  {
    "path": "starter/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest />\n"
  },
  {
    "path": "starter/src/main/java/moe/shizuku/starter/ServiceStarter.java",
    "content": "package moe.shizuku.starter;\n\nimport android.content.IContentProvider;\nimport android.os.Binder;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.IBinder;\nimport android.os.Looper;\nimport android.util.Log;\nimport android.util.Pair;\n\nimport java.util.Locale;\n\nimport moe.shizuku.api.BinderContainer;\nimport moe.shizuku.starter.util.IContentProviderCompat;\nimport rikka.hidden.compat.ActivityManagerApis;\nimport rikka.shizuku.ShizukuApiConstants;\nimport rikka.shizuku.server.UserService;\n\npublic class ServiceStarter {\n\n    private static final String TAG = \"ShizukuServiceStarter\";\n\n    private static final String EXTRA_BINDER = \"moe.shizuku.privileged.api.intent.extra.BINDER\";\n\n    public static final String DEBUG_ARGS;\n\n    static {\n        int sdk = Build.VERSION.SDK_INT;\n        if (sdk >= 30) {\n            DEBUG_ARGS = \"-Xcompiler-option\" + \" --debuggable\" +\n                    \" -XjdwpProvider:adbconnection\" +\n                    \" -XjdwpOptions:suspend=n,server=y\";\n        } else if (sdk >= 28) {\n            DEBUG_ARGS = \"-Xcompiler-option\" + \" --debuggable\" +\n                    \" -XjdwpProvider:internal\" +\n                    \" -XjdwpOptions:transport=dt_android_adb,suspend=n,server=y\";\n        } else {\n            DEBUG_ARGS = \"-Xcompiler-option\" + \" --debuggable\" +\n                    \" -agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y\";\n        }\n    }\n\n    private static final String USER_SERVICE_CMD_FORMAT = \"(CLASSPATH='%s' %s%s /system/bin \" +\n            \"--nice-name='%s' moe.shizuku.starter.ServiceStarter \" +\n            \"--token='%s' --package='%s' --class='%s' --uid=%d%s)&\";\n\n    // DeathRecipient will automatically be unlinked when all references to the\n    // binder is dropped, so we hold the reference here.\n    @SuppressWarnings(\"FieldCanBeLocal\")\n    private static IBinder shizukuBinder;\n\n    public static String commandForUserService(String appProcess, String managerApkPath, String token, String packageName, String classname, String processNameSuffix, int callingUid, boolean debug) {\n        String processName = String.format(\"%s:%s\", packageName, processNameSuffix);\n        return String.format(Locale.ENGLISH, USER_SERVICE_CMD_FORMAT,\n                managerApkPath, appProcess, debug ? (\" \" + DEBUG_ARGS) : \"\",\n                processName,\n                token, packageName, classname, callingUid, debug ? (\" \" + \"--debug-name=\" + processName) : \"\");\n    }\n\n    public static void main(String[] args) {\n        if (Looper.getMainLooper() == null) {\n            Looper.prepareMainLooper();\n        }\n\n        IBinder service;\n        String token;\n\n        UserService.setTag(TAG);\n        Pair<IBinder, String> result = UserService.create(args);\n\n        if (result == null) {\n            System.exit(1);\n            return;\n        }\n\n        service = result.first;\n        token = result.second;\n\n        if (!sendBinder(service, token)) {\n            System.exit(1);\n        }\n\n        Looper.loop();\n        System.exit(0);\n\n        Log.i(TAG, \"service exited\");\n    }\n\n    private static boolean sendBinder(IBinder binder, String token) {\n        return sendBinder(binder, token, true);\n    }\n\n    private static boolean sendBinder(IBinder binder, String token, boolean retry) {\n        String packageName = \"moe.shizuku.privileged.api\";\n        String name = packageName + \".shizuku\";\n        int userId = 0;\n        IContentProvider provider = null;\n\n        try {\n            provider = ActivityManagerApis.getContentProviderExternal(name, userId, null, name);\n            if (provider == null) {\n                Log.e(TAG, String.format(\"provider is null %s %d\", name, userId));\n                return false;\n            }\n            if (!provider.asBinder().pingBinder()) {\n                Log.e(TAG, String.format(\"provider is dead %s %d\", name, userId));\n\n                if (retry) {\n                    // For unknown reason, sometimes this could happens\n                    // Kill Shizuku app and try again could work\n                    ActivityManagerApis.forceStopPackageNoThrow(packageName, userId);\n                    Log.e(TAG, String.format(\"kill %s in user %d and try again\", packageName, userId));\n                    Thread.sleep(1000);\n                    return sendBinder(binder, token, false);\n                }\n                return false;\n            }\n\n            if (!retry) {\n                Log.e(TAG, \"retry works\");\n            }\n\n            Bundle extra = new Bundle();\n            extra.putParcelable(EXTRA_BINDER, new BinderContainer(binder));\n            extra.putString(ShizukuApiConstants.USER_SERVICE_ARG_TOKEN, token);\n\n            Bundle reply = IContentProviderCompat.call(provider, null, null, name, \"sendUserService\", null, extra);\n\n            if (reply != null) {\n                reply.setClassLoader(BinderContainer.class.getClassLoader());\n\n                Log.i(TAG, String.format(\"send binder to %s in user %d\", packageName, userId));\n                BinderContainer container = reply.getParcelable(EXTRA_BINDER);\n\n                if (container != null && container.binder != null && container.binder.pingBinder()) {\n                    shizukuBinder = container.binder;\n                    shizukuBinder.linkToDeath(() -> {\n                        Log.i(TAG, \"exiting...\");\n                        System.exit(0);\n                    }, 0);\n                    return true;\n                } else {\n                    Log.w(TAG, \"server binder not received\");\n                }\n            }\n\n            return false;\n        } catch (Throwable tr) {\n            Log.e(TAG, String.format(\"failed send binder to %s in user %d\", packageName, userId), tr);\n            return false;\n        } finally {\n            if (provider != null) {\n                try {\n                    ActivityManagerApis.removeContentProviderExternal(name, null);\n                } catch (Throwable tr) {\n                    Log.w(TAG, \"removeContentProviderExternal\", tr);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "starter/src/main/java/moe/shizuku/starter/util/IContentProviderCompat.java",
    "content": "package moe.shizuku.starter.util;\n\nimport android.content.AttributionSource;\nimport android.content.IContentProvider;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.RemoteException;\nimport android.system.Os;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\npublic class IContentProviderCompat {\n\n    @Nullable\n    public static Bundle call(@NonNull IContentProvider provider, @Nullable String attributeTag, @Nullable String callingPkg, @Nullable String authority, @Nullable String method, @Nullable String arg, @Nullable Bundle extras) throws RemoteException {\n        Bundle reply;\n        if (Build.VERSION.SDK_INT >= 31) {\n            try {\n                reply = provider.call((new AttributionSource.Builder(Os.getuid())).setAttributionTag(attributeTag).setPackageName(callingPkg).build(), authority, method, arg, extras);\n            } catch (LinkageError e) {\n                reply = provider.call(callingPkg, attributeTag, authority, method, arg, extras);\n            }\n        } else if (Build.VERSION.SDK_INT >= 30) {\n            reply = provider.call(callingPkg, attributeTag, authority, method, arg, extras);\n        } else if (Build.VERSION.SDK_INT >= 29) {\n            reply = provider.call(callingPkg, authority, method, arg, extras);\n        } else {\n            reply = provider.call(callingPkg, method, arg, extras);\n        }\n\n        return reply;\n    }\n}\n"
  }
]